Exemplo n.º 1
0
        /// <summary>
        /// Получить список доступа на каждый элемент
        /// </summary>
        /// <param name="userName">Имя пользователя</param>
        /// <param name="formId">Режим для которого нужно выбрать доступ</param>
        /// <param name="isAll">Выбрать все записи (с удаленными)</param>
        /// <param name="whereFields"></param>
        /// <returns></returns>
        public async Task <IEnumerable <FieldAccessDto> > GetFieldsFormAsync(string userName, int formId, bool isAll, Func <IQueryable <Field>, IQueryable <Field> > whereFields = null)
        {
            var modelsWhere = isAll
                ? _reportDbContext.Field.Where(f => f.FormModelId == formId)
                : _reportDbContext.Field.Where(f => f.FormModelId == formId && !(f.IsDeleted ?? false));

            if (whereFields != null)
            {
                modelsWhere = whereFields(modelsWhere);
            }

            var userROle = await _reportDbContext.UserLinkRole.FirstOrDefaultAsync(f => f.User.Account == userName);

            var models = await modelsWhere.ToListAsync();

            var accessFormDefault =
                await _reportDbContext.AccessForm.FirstOrDefaultAsync(
                    f => f.FormModelId == formId && f.FieldId == null && f.ButtonFormId == null && f.UserRole == (userROle == null ? null  : userROle.UserRole));

            var defAccess = accessFormDefault == null ? 3 : (int)accessFormDefault.TypeAccec;
            var query     = models.GroupJoin(
                await _accessManager.GetAccessFildsByFormAsync(userName, formId)
                , model => model.Id,
                accessForm => accessForm.FieldId,
                (formModel, accessForms) => new { Form = formModel, Access = accessForms }).SelectMany(
                arg => arg.Access.DefaultIfEmpty(),
                (form, access) => new
            {
                form.Form,
                TypeAccec = access == null ? defAccess :
                            (int)form.Form.DefaultTypeAccec > defAccess ? defAccess : (int)access.TypeAccec
            }).Where(f => f.TypeAccec > 1);

            return(query.Select(s =>
            {
                var item = Mapper.Map <FieldAccessDto>(s.Form);
                item.ParentGroup = $"{s.Form.Parent?.DisplayName} ({s.Form.Parent?.Name}";
                item.TypeAccec = (TypeAccec)s.TypeAccec;
                return item;
            }).OrderBy(o => o.Order));
        }