From a2e93c9438048ec5bdcec2d07000a6cd04d00922 Mon Sep 17 00:00:00 2001 From: Egamorf Date: Sun, 27 Apr 2025 20:49:57 +0200 Subject: [PATCH] Add user manager page (#22) Reviewed-on: https://gitea.egamorf.com/PRJ-Game-Ideas/game-ideas/pulls/22 --- .../GameIdeas.BlazorApp/Helpers/GameHelper.cs | 8 +- .../Pages/Games/{Game.razor => Games.razor} | 0 .../Games/{Game.razor.cs => Games.razor.cs} | 2 +- .../Games/{Game.razor.css => Games.razor.css} | 0 .../Pages/Games/Gateways/GameGateway.cs | 2 +- .../Pages/Games/Header/GameHeader.razor | 41 ++--- .../Pages/Games/Header/GameHeader.razor.cs | 6 +- .../{User => UserMenu}/Components/Login.razor | 4 +- .../Components/Login.razor.cs | 6 +- .../Components/Login.razor.css | 0 .../Components/LoginValidator.cs | 2 +- .../Gateways/AuthGateway.cs | 2 +- .../Gateways/IAuthGateway.cs | 2 +- .../Pages/{User => UserMenu}/UserMenu.razor | 6 +- .../{User => UserMenu}/UserMenu.razor.cs | 10 +- .../{User => UserMenu}/UserMenu.razor.css | 2 + .../Pages/Users/Components/UserRow.razor | 34 ++++ .../Pages/Users/Components/UserRow.razor.cs | 81 ++++++++++ .../Pages/Users/Components/UserRow.razor.css | 91 +++++++++++ .../Users/Components/UserRowSkeleton.razor | 12 ++ .../Components/UserRowSkeleton.razor.css | 69 ++++++++ .../Pages/Users/Components/UserValidator.cs | 50 ++++++ .../Pages/Users/Filters/UserFilterParams.cs | 9 ++ .../Pages/Users/Gateways/IUserGateway.cs | 13 ++ .../Pages/Users/Gateways/UserGateway.cs | 84 ++++++++++ .../Pages/Users/Users.razor | 49 ++++++ .../Pages/Users/Users.razor.cs | 133 ++++++++++++++++ .../Pages/Users/Users.razor.css | 32 ++++ .../Client/GameIdeas.BlazorApp/Program.cs | 4 +- .../Popup/Components/ConfirmDelete.razor | 7 + .../Popup/Components/ConfirmDelete.razor.cs | 18 +++ .../Popup/Components/ConfirmDelete.razor.css | 29 ++++ .../Components/Search/SearchInput.razor | 3 +- .../Select/Components/SelectRow.razor.css | 11 +- .../Components/Select/Helpers/SelectHelper.cs | 1 + .../Components/Select/Models/SelectTheme.cs | 3 +- .../Shared/Components/Select/Select.razor.css | 8 +- .../SelectSearch/SelectSearch.razor | 2 +- .../SelectSearch/SelectSearch.razor.cs | 1 + .../Shared/Constants/Endpoints.cs | 16 +- .../Shared/Constants/Icons.cs | 12 ++ .../Exceptions/RoleNotFoundException.cs | 3 + .../Exceptions/UserCreationException.cs | 3 + .../Exceptions/UserNotFoundException.cs | 3 + .../CreateStaticResourceKey.cs | 20 +++ .../Constants/GlobalConstants.cs | 2 + src/GameIdeas/GameIdeas.Shared/Dto/IdDto.cs | 6 + src/GameIdeas/GameIdeas.Shared/Dto/RoleDto.cs | 7 + src/GameIdeas/GameIdeas.Shared/Dto/UserDto.cs | 4 +- .../GameIdeas.Shared/Dto/UserFilterDto.cs | 8 + .../GameIdeas.Shared/Dto/UserListDto.cs | 7 + .../Controllers/UserController.cs | 87 ++++++++++- .../GameIdeas.WebAPI/Files/GameIdeas.fr.json | 14 +- .../20250420160158_SeedDefaultUser.cs | 4 +- .../GameIdeas.WebAPI/Profiles/UserProfile.cs | 20 +++ .../Server/GameIdeas.WebAPI/Program.cs | 14 +- .../Services/Games/GameReadService.cs | 2 +- .../Services/Users/IUserReadService.cs | 10 ++ .../Services/Users/IUserService.cs | 8 - .../Services/Users/IUserWriteService.cs | 10 ++ .../Services/Users/UserReadService.cs | 147 ++++++++++++++++++ .../Services/Users/UserService.cs | 57 ------- .../Services/Users/UserWriteService.cs | 83 ++++++++++ 63 files changed, 1249 insertions(+), 135 deletions(-) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/{Game.razor => Games.razor} (100%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/{Game.razor.cs => Games.razor.cs} (98%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/{Game.razor.css => Games.razor.css} (100%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/Components/Login.razor (87%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/Components/Login.razor.cs (85%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/Components/Login.razor.css (100%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/Components/LoginValidator.cs (85%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/Gateways/AuthGateway.cs (95%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/Gateways/IAuthGateway.cs (69%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/UserMenu.razor (91%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/UserMenu.razor.cs (67%) rename src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/{User => UserMenu}/UserMenu.razor.css (94%) create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.css create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRowSkeleton.razor create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRowSkeleton.razor.css create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserValidator.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Filters/UserFilterParams.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/IUserGateway.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/UserGateway.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.css create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Popup/Components/ConfirmDelete.razor create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Popup/Components/ConfirmDelete.razor.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Popup/Components/ConfirmDelete.razor.css create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Exceptions/RoleNotFoundException.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Exceptions/UserCreationException.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Exceptions/UserNotFoundException.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Dto/IdDto.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Dto/RoleDto.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Dto/UserFilterDto.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Dto/UserListDto.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Profiles/UserProfile.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Services/Users/IUserReadService.cs delete mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Services/Users/IUserService.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Services/Users/IUserWriteService.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Services/Users/UserReadService.cs delete mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Services/Users/UserService.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Services/Users/UserWriteService.cs diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs index 181281d..f33ea26 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs @@ -13,12 +13,8 @@ public static class GameHelper throw new ArgumentNullException(nameof(authState), "Authentication state missing"); } - var userId = authState.User.FindFirstValue(ClaimTypes.Sid); - - if (userId == null) - { - throw new ArgumentNullException(nameof(authState), "user state missing"); - } + var userId = authState.User.FindFirstValue(ClaimTypes.Sid) + ?? throw new ArgumentNullException(nameof(authState), "user state missing"); game.CreationUserId = userId; game.CreationDate = DateTime.Now; diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor similarity index 100% rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor.cs similarity index 98% rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor.cs rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor.cs index a8b0ae3..d165867 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor.cs @@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Components; namespace GameIdeas.BlazorApp.Pages.Games; -public partial class Game +public partial class Games { [Inject] private IGameGateway GameGateway { get; set; } = default!; diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor.css similarity index 100% rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Game.razor.css rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Games.razor.css diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/GameGateway.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/GameGateway.cs index 21148a3..6494a4f 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/GameGateway.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/GameGateway.cs @@ -59,7 +59,7 @@ public class GameGateway(IHttpClientService httpClientService) : IGameGateway } catch (Exception) { - throw new CategoryNotFoundException(ResourcesKey.ErrorFetchGames); + throw new GameNotFoundException(ResourcesKey.ErrorFetchGames); } } } diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor index 0516759..8f02472 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor @@ -1,5 +1,5 @@ @using GameIdeas.BlazorApp.Pages.Games -@using GameIdeas.BlazorApp.Pages.User +@using GameIdeas.BlazorApp.Pages.UserMenu @using GameIdeas.BlazorApp.Shared.Components.Select @using GameIdeas.BlazorApp.Shared.Components.Select.Models @using GameIdeas.BlazorApp.Shared.Models @@ -10,32 +10,35 @@ @inherits ComponentBase
-
+ Game Ideas -
+ @ChildContent + + + }
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor.cs index 36b8e79..3249a21 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Header/GameHeader.razor.cs @@ -8,6 +8,7 @@ namespace GameIdeas.BlazorApp.Pages.Games.Header; public partial class GameHeader : ComponentBase { + [Parameter] public bool DisplayAdd { get; set; } = true; [Parameter] public EventCallback AddTypeChanged { get; set; } [Parameter] public RenderFragment? ChildContent { get; set; } @@ -31,11 +32,6 @@ public partial class GameHeader : ComponentBase base.OnInitialized(); } - private void HandleIconClicked() - { - throw new NotImplementedException(); - } - private async Task HandleAddTypeClicked(IEnumerable> values) { SelectListAdd?.Close(); diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/User/Components/Login.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/UserMenu/Components/Login.razor similarity index 87% rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/User/Components/Login.razor rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/UserMenu/Components/Login.razor index 444b7aa..e7be564 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/User/Components/Login.razor +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/UserMenu/Components/Login.razor @@ -1,7 +1,7 @@ @using Blazored.FluentValidation - +