/// <summary> /// Donne les utilisateurs (dans une liste de UserSetUser) chargé d'un droit par rapport aux CriteriaValues passés en paramétre. /// </summary> /// <param name="criteriaValues">Liste de criteriaValues</param> /// <param name="dataSetId">Id du DataSet</param> /// <param name="right">Droit recherché</param> /// <returns>Liste des utilisateurs.</returns> /// <remarks>La liste de UserSetUser peut contenir 0, 1 ou n utilisateurs (non distinct).</remarks> public async Task <IEnumerable <UserSetUser> > GetUsersByRight(IEnumerable <IEnumerable <CriteriaValues> > criteriaValues, long dataSetId, RightEnum right) { Dictionary <long, DataSetDimension> dimIds = await DataSetDimensionDomain.GetDimensionColumns(dataSetId); Dictionary <long, IEnumerable <CriteriaValues> > dico = CriteriaValuesDomain.GetCriteriaValuesByDimension(criteriaValues); List <Expression <Func <UserSetUser, bool> > > where = new List <Expression <Func <UserSetUser, bool> > >(); foreach (long dimensionId in dico.Keys) { string nomDimension = dimIds.Values.Where(d => d.Dimension.Id == dimensionId).Select(d => d.ColumnName).FirstOrDefault(); IEnumerable <string> values = dico[dimensionId].Select(cv => cv.Value); if (values.Count() > 1) { where.Add(GetFilterByDimension(nomDimension, values)); } else if (values.Count() == 1) { where.Add(GetFilterByDimension(nomDimension, values.ElementAt(0))); } } IQueryable <UserSetUser> dbQuery = UnitOfWork.GetDbContext().Set <UserSetUser>(); IEnumerable <UserSetUser> lstUsu = await where .Aggregate(dbQuery, (current, predicate) => current.Where(predicate)) .Where(usu => (usu.Right & right) == right) .Include(usu => usu.User) .Include(usu => usu.UserSet) .AsNoTracking() .ToAsyncEnumerable() .ToList(); return(lstUsu); }
/// <summary> /// Recherche du modificateur pour le SelectorInstance donné en paramétre. /// </summary> /// <param name="selectorInstance">SelectorInstance</param> /// <param name="wfInstance">WorkflowInstance</param> /// <returns>Message de retour</returns> public async Task <HttpResponseMessageResult> FindModificator(SelectorInstance selectorInstance, WorkflowInstance wfInstance) { if (selectorInstance == null) { throw new WrongParameterException($"SelectorInstanceDomain.FindModificator: SelectorInstance is null."); } if (selectorInstance.SelectorConfig == null) { throw new WrongParameterException($"SelectorInstanceDomain.FindModificator: SelectorConfig is null (Id SelectorInstance : {selectorInstance.Id})."); } if (selectorInstance.SelectorConfig.Modifiers == null) { throw new SequenceException($"SelectorInstance.FindModificator : no modificator found, error in SelectorConfig (no Modifiers list). Id SelectorConfig : {selectorInstance.SelectorConfig.Id}"); } HttpResponseMessageResult res = new HttpResponseMessageResult() { IsSuccess = true }; IEnumerable <IGrouping <int, Criteria> > lstGrp = selectorInstance.SelectorConfig.Modifiers.GroupBy(c => c.ChainNumber); int currentChain = -1; if ((lstGrp != null) && (lstGrp.Count() > 0)) { currentChain = lstGrp.Min(g => g.Key); } User modificator = null; IEnumerable <UserSetUser> lstUsu = null; IGrouping <int, Criteria> grp = null; // On parcourt les chaines de criteria une à une afin de trouver le modificateur. while ((currentChain > -1) && (modificator == null)) { grp = lstGrp.Where(g => g.Key == currentChain).FirstOrDefault(); if (grp == null) { throw new SequenceException($"SelectorInstance.FindModificator : no modificator found, error in SelectorConfig (no group). Id SelectorConfig : {selectorInstance.SelectorConfig.Id}"); } IEnumerable <IEnumerable <CriteriaValues> > lstCv = await CriteriaDomain.ExtractAllCriteriaValues(grp, wfInstance); lstUsu = await UserSetDomain.GetUsersByRight(lstCv, wfInstance.DataSetId, RightEnum.Modification); IEnumerable <User> modificators = lstUsu.Select(usu => usu.User).Distinct(new UserComparer((x, y) => x.Id == y.Id)); // Gestion des cas des modificateurs if ((modificators == null) || (modificators.Count() == 0)) { IEnumerable <int> lstNumber = lstGrp.Select(g => g.Key).Where(i => i > currentChain); if (lstNumber.Count() > 0) { currentChain = lstNumber.OrderBy(i => i).First(); } else { throw new ConfigurationException("SelectorInstanceDomain.FindModificator : no modificator was found."); } } if (modificators.Count() > 1) { throw new ConfigurationException("SelectorInstanceDomain.FindModificator : more than one modificator was found."); } if (modificators.Count() == 1) { modificator = modificators.ElementAt(0); } } if (modificator == null) { throw new DataLoadingException($"SelectorInstanceDomain.FindModificator : No modificator found for SelectorInstance (Id : {selectorInstance.Id})."); } // Régler le SelectorInstance avec l'id de l'utilisateur trouvé. selectorInstance.ChainNumberModifyer = currentChain; selectorInstance.ModifyerId = modificator.Id; UserSetUser usuDistinct = lstUsu.FirstOrDefault(); if (usuDistinct == null) { throw new DataLoadingException("SelectorInstanceDomain.FindModificator : a problem with loading UserSetUser must stop this finding."); } Dictionary <long, DataSetDimension> dimIds = await DataSetDimensionDomain.GetDimensionColumns(wfInstance.DataSetId); foreach (Criteria crit in grp) { string dimName = dimIds.Values.Where(v => v.Dimension.Id == crit.Dimension.Id).Select(v => v.ColumnName).FirstOrDefault(); string value = GetValueFromDimension(usuDistinct, dimName); CriteriaValues cv = new CriteriaValues() { Criteria = crit, SelectorInstanceModifier = selectorInstance, Value = value }; selectorInstance.ModifyCriteriasValues.Add(cv); } return(res); }