Ejemplo n.º 1
0
        public IActionResult GetMenuRoleMapForAdmin()
        {
            var results = new List <MenuForAdminOutputModel>();

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

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

            return(JsonOK(results));
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> EditMenuRoleMapForAdmin([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."));
            }

            //まずは関係するロールマップをすべて削除
            menuRepository.DeleteMenuMap(menu);

            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)
                {
                    if (menu.MenuType != MenuType.System)
                    {
                        //システムメニュー以外はシステムロールを紐づけできない
                        return(JsonConflict($"A system menu is only attached to the system role {role.Id}"));
                    }
                    menuRepository.AttachRole(menu, role);
                }
                else
                {
                    if (role.TenantId != null)
                    {
                        //テナント用カスタムロールを管理者が編集可能か、というのは議論があるが、今はUI的に表示していないハズなので、不正と見なして弾く
                        return(JsonConflict($"Role {role.Name} is a custome tenant role for Tenant {role.TenantId}"));
                    }
                    if (menu.MenuType != MenuType.Tenant)
                    {
                        //テナントメニュー以外は紐づけできない(Public/Internal/Unknownは紐づける必要がないから)
                        return(JsonConflict($"A tenant menu is only attached to a tenant role."));
                    }
                    menuRepository.AttachRole(menu, role);
                }
            }

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

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

            return(JsonOK(result));
        }