From e3f4b780837ff505cdee0ff12a854932a1822385 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 25 Jul 2024 11:42:17 +0200 Subject: [PATCH] feat: Frontend- und Backend-APIs aktualisiert, um Module basierend auf der Benutzerauswahl zu filtern --- .../module-table/module-table.component.ts | 9 ++++++++- .../src/app/components/user/user.component.ts | 8 +++++++- .../app/models/user-management.api.models.ts | 1 + .../app/services/module-of-user.service.ts | 7 ++++++- .../Controllers/GroupOfUserController.cs | 2 +- .../Controllers/ModuleOfUserController.cs | 19 ++++++++++++++++++- .../Contracts/IModuleOfUserService.cs | 2 ++ .../DTOs/ModuleOfUser/ModuleOfUserReadDto.cs | 9 +++++++-- .../Services/ModuleOfUserService.cs | 7 +++++++ .../Contracts/IModuleOfUserRepository.cs | 2 ++ .../Repositories/GroupOfUserRepository.cs | 2 +- .../Repositories/ModuleOfUserRepository.cs | 11 +++++++++-- 12 files changed, 69 insertions(+), 10 deletions(-) diff --git a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/tables/module-table/module-table.component.ts b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/tables/module-table/module-table.component.ts index 907a975..6fe3bbc 100644 --- a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/tables/module-table/module-table.component.ts +++ b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/tables/module-table/module-table.component.ts @@ -7,6 +7,7 @@ import { ColorModeService } from '../../../services/color-mode.service'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { env } from '../../../../environments/environment'; +import { ModuleOfUserService } from '../../../services/module-of-user.service'; @Component({ standalone: true, @@ -17,7 +18,13 @@ import { env } from '../../../../environments/environment'; }) export class ModuleTableComponent extends BaseTableComponent { constructor( - service: ModuleService, cModeService: ColorModeService) { + service: ModuleService, cModeService: ColorModeService, private mouService: ModuleOfUserService) { super(service, env.columnNames.module, cModeService) } + + fetchDataByUsername(username: string) { + this.mouService.getByUsername(username) + .then(mou_list => mou_list.map(mou => mou.module)) + .then(modules => this.source = modules) + } } \ No newline at end of file diff --git a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/user/user.component.ts b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/user/user.component.ts index 5e2e2e6..c1f7496 100644 --- a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/user/user.component.ts +++ b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/components/user/user.component.ts @@ -34,6 +34,10 @@ export class UserComponent implements AfterViewInit { this.refreshService.removeAll() this.refreshService.add(() => { this.userTable.fetchData(); + if (this.sUsername != null){ + this.groupTable.fetchDataByUsername(this.sUsername); + this.moduleTable.fetchDataByUsername(this.sUsername) + } }); } @@ -45,8 +49,10 @@ export class UserComponent implements AfterViewInit { if (rows.length > 0) { this.sUsername = rows[0].source.username; - if (this.sUsername != null) + if (this.sUsername != null){ this.groupTable.fetchDataByUsername(this.sUsername); + this.moduleTable.fetchDataByUsername(this.sUsername) + } } } } \ No newline at end of file diff --git a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/models/user-management.api.models.ts b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/models/user-management.api.models.ts index f540872..6432d19 100644 --- a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/models/user-management.api.models.ts +++ b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/models/user-management.api.models.ts @@ -40,6 +40,7 @@ export interface ModuleOfUser { comment?: string; addedWho?: string; changedWho?: string; + module?: Module; } export interface GroupOfUser { diff --git a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/services/module-of-user.service.ts b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/services/module-of-user.service.ts index 00a8f9c..cbff4db 100644 --- a/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/services/module-of-user.service.ts +++ b/DigitalData.UserManager.API/ClientApp/user_manager_ui/src/app/services/module-of-user.service.ts @@ -2,7 +2,7 @@ import { Injectable, Inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { ModuleOfUser } from '../models/user-management.api.models'; import { ApiService } from './user-management.api.service'; -import { Observable } from 'rxjs'; +import { Observable, firstValueFrom } from 'rxjs'; import { UrlService } from './url.service'; @Injectable({ @@ -17,4 +17,9 @@ export class ModuleOfUserService extends ApiService { const url = `${this.baseUrl}?moduleId=${moduleId}&userId=${userId}`; return this.http.delete(url, { withCredentials: true }); } + + async getByUsername(username: string): Promise { + const url = `${this.baseUrl}?username=${username}`; + return await firstValueFrom(this.http.get(url, { withCredentials: true })); + } } \ No newline at end of file diff --git a/DigitalData.UserManager.API/Controllers/GroupOfUserController.cs b/DigitalData.UserManager.API/Controllers/GroupOfUserController.cs index 5f7a0c5..5c382b3 100644 --- a/DigitalData.UserManager.API/Controllers/GroupOfUserController.cs +++ b/DigitalData.UserManager.API/Controllers/GroupOfUserController.cs @@ -23,7 +23,7 @@ namespace DigitalData.UserManager.API.Controllers return await _service.DeleteAsyncByGroupUserId(groupId, userId).ThenAsync(Ok, IActionResult (m, n) => { _logger.LogNotice(n); - return BadRequest(); + return StatusCode(StatusCodes.Status500InternalServerError); }); } catch (Exception ex) diff --git a/DigitalData.UserManager.API/Controllers/ModuleOfUserController.cs b/DigitalData.UserManager.API/Controllers/ModuleOfUserController.cs index be69b8a..7a906c7 100644 --- a/DigitalData.UserManager.API/Controllers/ModuleOfUserController.cs +++ b/DigitalData.UserManager.API/Controllers/ModuleOfUserController.cs @@ -14,7 +14,24 @@ namespace DigitalData.UserManager.API.Controllers public ModuleOfUserController(ILogger logger, IModuleOfUserService service) : base(logger, service) { } - + + [NonAction] + public override Task GetAll() => base.GetAll(); + + [HttpGet] + public async Task GetAll(string? username = null) + { + + if (username is not null) + return await _service.ReadByUserAsync(username).ThenAsync(Ok, IActionResult (m, n) => + { + _logger.LogNotice(n); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + + return await base.GetAll(); + } + [HttpDelete] public async Task Delete([FromQuery] int moduleId, [FromQuery]int userId) { diff --git a/DigitalData.UserManager.Application/Contracts/IModuleOfUserService.cs b/DigitalData.UserManager.Application/Contracts/IModuleOfUserService.cs index c348267..dc20222 100644 --- a/DigitalData.UserManager.Application/Contracts/IModuleOfUserService.cs +++ b/DigitalData.UserManager.Application/Contracts/IModuleOfUserService.cs @@ -8,5 +8,7 @@ namespace DigitalData.UserManager.Application.Contracts public interface IModuleOfUserService : ICRUDService { Task DeleteAsyncByModuleUserId(int moduleId, int userId); + + Task>> ReadByUserAsync(string username); } } \ No newline at end of file diff --git a/DigitalData.UserManager.Application/DTOs/ModuleOfUser/ModuleOfUserReadDto.cs b/DigitalData.UserManager.Application/DTOs/ModuleOfUser/ModuleOfUserReadDto.cs index 036fe8a..f9cf2c9 100644 --- a/DigitalData.UserManager.Application/DTOs/ModuleOfUser/ModuleOfUserReadDto.cs +++ b/DigitalData.UserManager.Application/DTOs/ModuleOfUser/ModuleOfUserReadDto.cs @@ -1,4 +1,7 @@ -namespace DigitalData.UserManager.Application.DTOs.ModuleOfUser +using DigitalData.UserManager.Application.DTOs.Module; +using DigitalData.UserManager.Application.DTOs.User; + +namespace DigitalData.UserManager.Application.DTOs.ModuleOfUser { public record ModuleOfUserReadDto( int Id, @@ -6,6 +9,8 @@ int ModuleId, string? Comment, string? AddedWho, - string? ChangedWho + string? ChangedWho, + UserReadDto User, + ModuleDto? Module ); } \ No newline at end of file diff --git a/DigitalData.UserManager.Application/Services/ModuleOfUserService.cs b/DigitalData.UserManager.Application/Services/ModuleOfUserService.cs index 2fe35a6..10acfc5 100644 --- a/DigitalData.UserManager.Application/Services/ModuleOfUserService.cs +++ b/DigitalData.UserManager.Application/Services/ModuleOfUserService.cs @@ -26,5 +26,12 @@ namespace DigitalData.UserManager.Application.Services return Result.Success(); } + + public async Task>> ReadByUserAsync(string username) + { + var mous = await _repository.ReadByUserAsync(username: username); + var mous_dtos = _mapper.MapOrThrow>(mous); + return Result.Success(mous_dtos); + } } } \ No newline at end of file diff --git a/DigitalData.UserManager.Infrastructure/Contracts/IModuleOfUserRepository.cs b/DigitalData.UserManager.Infrastructure/Contracts/IModuleOfUserRepository.cs index af9c754..ed187c4 100644 --- a/DigitalData.UserManager.Infrastructure/Contracts/IModuleOfUserRepository.cs +++ b/DigitalData.UserManager.Infrastructure/Contracts/IModuleOfUserRepository.cs @@ -8,5 +8,7 @@ namespace DigitalData.UserManager.Infrastructure.Contracts IQueryable ReadByModuleId(int moduleId); Task> ReadByModelUserIdAsync(int moduleId, int userId); + + Task> ReadByUserAsync(string username); } } diff --git a/DigitalData.UserManager.Infrastructure/Repositories/GroupOfUserRepository.cs b/DigitalData.UserManager.Infrastructure/Repositories/GroupOfUserRepository.cs index 87e9ebd..f7eda39 100644 --- a/DigitalData.UserManager.Infrastructure/Repositories/GroupOfUserRepository.cs +++ b/DigitalData.UserManager.Infrastructure/Repositories/GroupOfUserRepository.cs @@ -25,7 +25,7 @@ namespace DigitalData.UserManager.Infrastructure.Repositories public async Task> ReadByGroupUserIdAsync(int groupId, int userId) { - return await _dbSet.Where(gou => gou.GroupId == groupId && gou.UserId == userId).ToListAsync(); + return await _dbSet.Where(gou => gou.GroupId == groupId && gou.UserId == userId).ToListAsync(); } public async Task> ReadAllAsyncWithGroup() => await _dbSet.Include(gou => gou.Group).ToListAsync(); diff --git a/DigitalData.UserManager.Infrastructure/Repositories/ModuleOfUserRepository.cs b/DigitalData.UserManager.Infrastructure/Repositories/ModuleOfUserRepository.cs index b05316e..f5995af 100644 --- a/DigitalData.UserManager.Infrastructure/Repositories/ModuleOfUserRepository.cs +++ b/DigitalData.UserManager.Infrastructure/Repositories/ModuleOfUserRepository.cs @@ -12,14 +12,21 @@ namespace DigitalData.UserManager.Infrastructure.Repositories { } + private IQueryable ReadByUser(string username) + { + return _dbSet.Where(mou => mou.User!.Username == username).Include(mou => mou.Module); + } + public IQueryable ReadByModuleId(int moduleId) { - return _dbSet.Where(mou => mou.ModuleId == moduleId); + return _dbSet.Where(mou => mou.ModuleId == moduleId); } public async Task> ReadByModelUserIdAsync(int moduleId, int userId) { - return await _dbSet.Where(mou => mou.ModuleId == moduleId && mou.UserId == userId).ToListAsync(); + return await _dbSet.Where(mou => mou.ModuleId == moduleId && mou.UserId == userId).ToListAsync(); } + + public async Task> ReadByUserAsync(string username) => await ReadByUser(username).ToListAsync(); } } \ No newline at end of file