/// <summary> /// Получить нужный подзапрос в зависимости от распространения права (null - права нет) /// </summary> /// <param name="allDealSubQuery">Подкритерий, ограничивающий множество сделок (без учета видимости)</param> /// <param name="teamDealSubQuery">Подкритерий, ограничивающий множество сделок (командная видимость)</param> /// <param name="personalDealSubQuery">Подкритерий, ограничивающий множество сделок (персональная видимость)</param> /// <param name="permissionDistribution">Распространение права</param> /// <param name="user">Пользователь, видимостью которого ограничивать множества документов. Null - не ограничивать видимостью</param> private TValue GetDealSubQueryByPermissionDistribution <TValue>(TValue allDealSubQuery, TValue teamDealSubQuery, TValue personalDealSubQuery, PermissionDistributionType permissionDistribution, User user) where TValue : class { // Если пользователь не указан, ограничивать видимость не надо if (user == null) { return(allDealSubQuery); } switch (permissionDistribution) { case PermissionDistributionType.All: return(allDealSubQuery); case PermissionDistributionType.Teams: return(teamDealSubQuery); case PermissionDistributionType.Personal: return(personalDealSubQuery); case PermissionDistributionType.None: return(null); default: throw new Exception("Неизвестный тип распространения права."); } ; }
public PermissionDistribution(Permission permission, PermissionDistributionType type) { if (!PermissionDetailsSet.PermissionDetails.Where(x => x.Permission == permission).First().AvailableDistributionTypes.Contains(type)) { throw new Exception(String.Format("Право «{0}» не может иметь распространение «{1}».", permission.GetDisplayName(), type.GetDisplayName())); } Permission = permission; Type = type; }
/// <summary> /// Получение максимального типа распространения права пользователя /// </summary> /// <param name="permission"></param> /// <returns></returns> public virtual PermissionDistributionType GetPermissionDistributionType(Permission permission) { PermissionDistributionType type = PermissionDistributionType.None; var list = Roles.SelectMany(x => x.PermissionDistributions).Where(x => x.Permission == permission); if (list.Any()) { type = list.Max(x => x.Type); } return(type); }
/// <summary> /// Получение подкритерия по сделке, ограничивающего ее видимостью данного юзера для данного права /// </summary> /// <param name="user">Пользователь</param> /// <param name="type">Распространение права</param> /// <param name="permissionDisplayName">Наименование права</param> /// <returns>null, если пользователь не имеет права; иначе подкритерий возможных сделок</returns> private ISubCriteria <Deal> RestrictByUserPermissions(User user, PermissionDistributionType type, string permissionDisplayName = "") { switch (type) { case PermissionDistributionType.None: return(null); case PermissionDistributionType.Personal: return(dealRepository.GetSubQueryForDealIdOnPersonalPermission(user.Id)); case PermissionDistributionType.Teams: return(dealRepository.GetSubQueryForDealIdOnTeamPermission(user.Id)); case PermissionDistributionType.All: return(dealRepository.GetSubQueryForDealIdOnAllPermission()); default: throw new Exception(String.Format("Неизвестное распространение права «{0}».", permissionDisplayName)); } }