diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Filters/UserFilterParams.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Filters/UserFilterParams.cs new file mode 100644 index 0000000..227354d --- /dev/null +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Filters/UserFilterParams.cs @@ -0,0 +1,9 @@ +using GameIdeas.Shared.Dto; + +namespace GameIdeas.BlazorApp.Pages.Users.Filters; + +public class UserFilterParams +{ + public string? Name { get; set; } + public List? Roles { get; set; } +} diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/IUserGateway.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/IUserGateway.cs index 0b9be82..42350e8 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/IUserGateway.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/IUserGateway.cs @@ -1,8 +1,10 @@ -using GameIdeas.Shared.Dto; +using GameIdeas.BlazorApp.Pages.Users.Filters; +using GameIdeas.Shared.Dto; namespace GameIdeas.BlazorApp.Pages.Users.Gateways; public interface IUserGateway { - Task GetUsers(UserFilterParams filterParams); + Task GetUsers(UserFilterParams filterParams, int currentPage); + Task> GetRoles(); } diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/UserGateway.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/UserGateway.cs index c9120e7..b6e7a15 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/UserGateway.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Gateways/UserGateway.cs @@ -1,4 +1,5 @@ -using GameIdeas.BlazorApp.Services; +using GameIdeas.BlazorApp.Pages.Users.Filters; +using GameIdeas.BlazorApp.Services; using GameIdeas.BlazorApp.Shared.Constants; using GameIdeas.BlazorApp.Shared.Exceptions; using GameIdeas.Resources; @@ -8,13 +9,28 @@ namespace GameIdeas.BlazorApp.Pages.Users.Gateways; public class UserGateway(IHttpClientService httpClient) : IUserGateway { - public async Task GetUsers(UserFilterParams filterParams) + public async Task> GetRoles() + { + try + { + return await httpClient.FetchDataAsync>(Endpoints.User.Roles) + ?? throw new InvalidOperationException(ResourcesKey.ErrorFetchRoles); + } + catch (Exception) + { + throw new RoleNotFoundException(ResourcesKey.ErrorFetchRoles); + } + } + + public async Task GetUsers(UserFilterParams filterParams, int currentPage) { try { UserFilterDto filter = new() { - + CurrentPage = currentPage, + Name = filterParams.Name, + RoleIds = filterParams.Roles?.Select(r => r.Id) }; var url = Endpoints.User.Fetch(filter); diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor index 1ea8a7d..4b34129 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor @@ -12,8 +12,9 @@
- - + +
@@ -21,7 +22,7 @@
@if (!IsLoading) { - @foreach (var user in UsersDto) + @foreach (var user in UserList.Users ?? []) { } diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs index 339a8fd..08b6dea 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs @@ -1,16 +1,46 @@ +using GameIdeas.BlazorApp.Pages.Users.Filters; +using GameIdeas.BlazorApp.Pages.Users.Gateways; using GameIdeas.BlazorApp.Shared.Components.Popup; using GameIdeas.Shared.Dto; +using Microsoft.AspNetCore.Components; namespace GameIdeas.BlazorApp.Pages.Users; public partial class Users { + [Inject] private IUserGateway UserGateway { get; set; } = default!; + private Popup? Popup; private bool IsLoading = false; - private IEnumerable UsersDto = []; + private UserFilterParams FilterParams = new(); + private UserListDto UserList = new(); + private IEnumerable Roles = []; + private int CurrentPage = 1; - private void HandleBackdropClicked() + protected override async Task OnInitializedAsync() { - Popup?.Close(); + await FetchData(); + await base.OnInitializedAsync(); + } + + private async Task FetchData(bool fetchRoles = true) + { + try + { + IsLoading = true; + + if (fetchRoles) + Roles = await UserGateway.GetRoles(); + + UserList = await UserGateway.GetUsers(FilterParams, CurrentPage); + } + catch (Exception) + { + throw; + } + finally + { + IsLoading = false; + } } } \ No newline at end of file diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Constants/Endpoints.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Constants/Endpoints.cs index 65bc47c..46d63d5 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Constants/Endpoints.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Constants/Endpoints.cs @@ -24,5 +24,6 @@ public static class Endpoints public static class User { public static string Fetch(UserFilterDto filter) => $"api/User?{UrlHelper.BuildUrlParams(filter)}"; + public const string Roles = "api/User/Roles"; } } diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Exceptions/RoleNotFoundException.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Exceptions/RoleNotFoundException.cs new file mode 100644 index 0000000..392bea3 --- /dev/null +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Exceptions/RoleNotFoundException.cs @@ -0,0 +1,3 @@ +namespace GameIdeas.BlazorApp.Shared.Exceptions; + +public class RoleNotFoundException(string message) : Exception(message); diff --git a/src/GameIdeas/GameIdeas.Resources/CreateStaticResourceKey.cs b/src/GameIdeas/GameIdeas.Resources/CreateStaticResourceKey.cs index 303659a..17274ca 100644 --- a/src/GameIdeas/GameIdeas.Resources/CreateStaticResourceKey.cs +++ b/src/GameIdeas/GameIdeas.Resources/CreateStaticResourceKey.cs @@ -55,6 +55,8 @@ public class Translations (TranslationService translationService) public string UserLoginFailed => translationService.Translate(nameof(UserLoginFailed)); public string UserLogoutFailed => translationService.Translate(nameof(UserLogoutFailed)); public string Roles => translationService.Translate(nameof(Roles)); + public string ErrorFetchUsers => translationService.Translate(nameof(ErrorFetchUsers)); + public string ErrorFetchRoles => translationService.Translate(nameof(ErrorFetchRoles)); } public static class ResourcesKey @@ -118,4 +120,6 @@ public static class ResourcesKey public static string UserLoginFailed => _instance?.UserLoginFailed ?? throw new InvalidOperationException("ResourcesKey.UserLoginFailed is not initialized."); public static string UserLogoutFailed => _instance?.UserLogoutFailed ?? throw new InvalidOperationException("ResourcesKey.UserLogoutFailed is not initialized."); public static string Roles => _instance?.Roles ?? throw new InvalidOperationException("ResourcesKey.Roles is not initialized."); + public static string ErrorFetchUsers => _instance?.ErrorFetchUsers ?? throw new InvalidOperationException("ResourcesKey.ErrorFetchUsers is not initialized."); + public static string ErrorFetchRoles => _instance?.ErrorFetchRoles ?? throw new InvalidOperationException("ResourcesKey.ErrorFetchRoles is not initialized."); } \ No newline at end of file diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Files/GameIdeas.fr.json b/src/GameIdeas/Server/GameIdeas.WebAPI/Files/GameIdeas.fr.json index 9b9e68f..ce6d164 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Files/GameIdeas.fr.json +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Files/GameIdeas.fr.json @@ -50,5 +50,7 @@ "UserUnauthorized": "Utilisateur non authorisé", "UserLoginFailed": "Authentification de l'utilisateur échoué", "UserLogoutFailed": "Déconnection de l'utilisateur échoué", - "Roles": "Rôles" + "Roles": "Rôles", + "ErrorFetchUsers": "Erreur lors de la récupération des utilisateurs", + "ErrorFetchRoles": "Erreur lors de la récupération des rôles" } \ No newline at end of file