Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }