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)); }
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)); }