Add filter and gateway logics
All checks were successful
Game Ideas build for PR / build_blazor_app (pull_request) Successful in 39s

This commit is contained in:
2025-04-23 02:01:34 +02:00
parent 6d109d00e6
commit 851f0b5af1
9 changed files with 80 additions and 12 deletions

View File

@@ -0,0 +1,9 @@
using GameIdeas.Shared.Dto;
namespace GameIdeas.BlazorApp.Pages.Users.Filters;
public class UserFilterParams
{
public string? Name { get; set; }
public List<RoleDto>? Roles { get; set; }
}

View File

@@ -1,8 +1,10 @@
using GameIdeas.Shared.Dto; using GameIdeas.BlazorApp.Pages.Users.Filters;
using GameIdeas.Shared.Dto;
namespace GameIdeas.BlazorApp.Pages.Users.Gateways; namespace GameIdeas.BlazorApp.Pages.Users.Gateways;
public interface IUserGateway public interface IUserGateway
{ {
Task<UserListDto> GetUsers(UserFilterParams filterParams); Task<UserListDto> GetUsers(UserFilterParams filterParams, int currentPage);
Task<IEnumerable<RoleDto>> GetRoles();
} }

View File

@@ -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.Constants;
using GameIdeas.BlazorApp.Shared.Exceptions; using GameIdeas.BlazorApp.Shared.Exceptions;
using GameIdeas.Resources; using GameIdeas.Resources;
@@ -8,13 +9,28 @@ namespace GameIdeas.BlazorApp.Pages.Users.Gateways;
public class UserGateway(IHttpClientService httpClient) : IUserGateway public class UserGateway(IHttpClientService httpClient) : IUserGateway
{ {
public async Task<UserListDto> GetUsers(UserFilterParams filterParams) public async Task<IEnumerable<RoleDto>> GetRoles()
{
try
{
return await httpClient.FetchDataAsync<IEnumerable<RoleDto>>(Endpoints.User.Roles)
?? throw new InvalidOperationException(ResourcesKey.ErrorFetchRoles);
}
catch (Exception)
{
throw new RoleNotFoundException(ResourcesKey.ErrorFetchRoles);
}
}
public async Task<UserListDto> GetUsers(UserFilterParams filterParams, int currentPage)
{ {
try try
{ {
UserFilterDto filter = new() UserFilterDto filter = new()
{ {
CurrentPage = currentPage,
Name = filterParams.Name,
RoleIds = filterParams.Roles?.Select(r => r.Id)
}; };
var url = Endpoints.User.Fetch(filter); var url = Endpoints.User.Fetch(filter);

View File

@@ -12,8 +12,9 @@
<GameHeader DisplayAdd="false"> <GameHeader DisplayAdd="false">
<div class="header-content"> <div class="header-content">
<SearchInput Placeholder="@ResourcesKey.EnterUsername" /> <SearchInput Placeholder="@ResourcesKey.EnterUsername" @bind-Text="FilterParams.Name" />
<SelectSearch TItem="RoleDto" Placeholder="@ResourcesKey.Roles" /> <SelectSearch TItem="RoleDto" Placeholder="@ResourcesKey.Roles" @bind-Values="FilterParams.Roles"
Items="Roles.ToList()" GetLabel="@(role => role.Name)"/>
</div> </div>
</GameHeader> </GameHeader>
@@ -21,7 +22,7 @@
<div class="content"> <div class="content">
@if (!IsLoading) @if (!IsLoading)
{ {
@foreach (var user in UsersDto) @foreach (var user in UserList.Users ?? [])
{ {
} }

View File

@@ -1,16 +1,46 @@
using GameIdeas.BlazorApp.Pages.Users.Filters;
using GameIdeas.BlazorApp.Pages.Users.Gateways;
using GameIdeas.BlazorApp.Shared.Components.Popup; using GameIdeas.BlazorApp.Shared.Components.Popup;
using GameIdeas.Shared.Dto; using GameIdeas.Shared.Dto;
using Microsoft.AspNetCore.Components;
namespace GameIdeas.BlazorApp.Pages.Users; namespace GameIdeas.BlazorApp.Pages.Users;
public partial class Users public partial class Users
{ {
[Inject] private IUserGateway UserGateway { get; set; } = default!;
private Popup? Popup; private Popup? Popup;
private bool IsLoading = false; private bool IsLoading = false;
private IEnumerable<UserDto> UsersDto = []; private UserFilterParams FilterParams = new();
private UserListDto UserList = new();
private IEnumerable<RoleDto> 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;
}
} }
} }

View File

@@ -24,5 +24,6 @@ public static class Endpoints
public static class User public static class User
{ {
public static string Fetch(UserFilterDto filter) => $"api/User?{UrlHelper.BuildUrlParams(filter)}"; public static string Fetch(UserFilterDto filter) => $"api/User?{UrlHelper.BuildUrlParams(filter)}";
public const string Roles = "api/User/Roles";
} }
} }

View File

@@ -0,0 +1,3 @@
namespace GameIdeas.BlazorApp.Shared.Exceptions;
public class RoleNotFoundException(string message) : Exception(message);

View File

@@ -55,6 +55,8 @@ public class Translations (TranslationService translationService)
public string UserLoginFailed => translationService.Translate(nameof(UserLoginFailed)); public string UserLoginFailed => translationService.Translate(nameof(UserLoginFailed));
public string UserLogoutFailed => translationService.Translate(nameof(UserLogoutFailed)); public string UserLogoutFailed => translationService.Translate(nameof(UserLogoutFailed));
public string Roles => translationService.Translate(nameof(Roles)); 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 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 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 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 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.");
} }

View File

@@ -50,5 +50,7 @@
"UserUnauthorized": "Utilisateur non authorisé", "UserUnauthorized": "Utilisateur non authorisé",
"UserLoginFailed": "Authentification de l'utilisateur échoué", "UserLoginFailed": "Authentification de l'utilisateur échoué",
"UserLogoutFailed": "Déconnection 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"
} }