Exemple #1
0
        public IActionResult GetMenuRoleMapForTenant()
        {
            var tenantId = CurrentUserInfo.SelectedTenant.Id;

            var results = new List <MenuForTenantOutputModel>();

            //表示情報をロジック層から取得。ここではAPIモデルへの詰替えだけ。
            var dict = menuLogic.GetRoleIdsForTenantDictionary(tenantId);

            foreach (var pair in dict)
            {
                var result = new MenuForTenantOutputModel()
                {
                    Id          = pair.Key.Code,
                    Name        = pair.Key.Name,
                    Description = pair.Key.Description,
                    MenuType    = pair.Key.MenuType,
                    Roles       = pair.Value.Select(r => new MenuForTenantOutputModel.RoleModel()
                    {
                        Id       = r.Id,
                        Name     = r.Name,
                        Editable = r.TenantId == tenantId
                    })
                };
                results.Add(result);
            }

            return(JsonOK(results));
        }
Exemple #2
0
        public async Task <IActionResult> EditMenuRoleMapForTenant([FromRoute] MenuCode?id, [FromBody] IEnumerable <long> roleIds, [FromServices] IMenuRepository menuRepository)
        {
            if (id == null)
            {
                return(JsonBadRequest("Menu Id is required."));
            }

            var menu = menuLogic.GetMenu(id.Value);

            if (menu == null)
            {
                return(JsonNotFound($"Menu Id {id.Value} is not found."));
            }

            //まずは関係するロールマップをすべて削除
            await menuRepository.DeleteMenuMapAsync(menu, CurrentUserInfo.SelectedTenant.Id);

            foreach (var roleId in roleIds)
            {
                var role = await roleRepository.GetRoleAsync(roleId);

                if (role == null)
                {
                    return(JsonNotFound($"Role Id {roleId} is not found."));
                }

                if (role.IsSystemRole)
                {
                    //システムメニューはテナント側で紐づけできない。警告出して404扱い。
                    LogWarning($"Role {role.Name} is not allowed to edit by the current user.");
                    return(JsonNotFound($"Role Id {roleId} is not found."));
                }
                else
                {
                    if (role.TenantId != CurrentUserInfo.SelectedTenant.Id)
                    {
                        //別のテナントのカスタムロールを編集しようとしている。警告出して404扱い。
                        LogWarning($"Role {role.Name} is not allowed to edit by the current user.");
                        return(JsonNotFound($"Role Id {roleId} is not found."));
                    }
                    if (menu.MenuType != MenuType.Tenant)
                    {
                        //テナントメニュー以外は紐づけできない(Public/Internal/Unknownは紐づける必要がないから)
                        JsonConflict($"A tenant menu is only attached to a tenant role.");
                    }
                    menuRepository.AttachRole(menu, role);
                }
            }

            unitOfWork.Commit();
            roleRepository.Refresh(); //キャッシュを破棄

            //表示情報を取得
            var result = new MenuForTenantOutputModel()
            {
                Id          = menu.Code,
                Name        = menu.Name,
                Description = menu.Description,
                Roles       = menuRepository.GetAttachedRoles(menu.Code).Select(r => new MenuForTenantOutputModel.RoleModel()
                {
                    Id   = r.Id,
                    Name = r.Name,
                })
            };

            return(JsonOK(result));
        }