Run code clean and fix messages #45

Merged
Egamorf merged 1 commits from feature/run-code-cleaner into main 2025-05-07 01:28:38 +02:00
38 changed files with 150 additions and 155 deletions

View File

@@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Components.Forms;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using System.Security.Claims;
namespace GameIdeas.BlazorApp.Pages.Games.Components; namespace GameIdeas.BlazorApp.Pages.Games.Components;
@@ -21,7 +20,7 @@ public partial class GameCreationForm
[Parameter] public CategoriesDto? Categories { get; set; } [Parameter] public CategoriesDto? Categories { get; set; }
[Parameter] public EventCallback OnSubmit { get; set; } [Parameter] public EventCallback OnSubmit { get; set; }
private GameDetailDto GameDto = new(); private readonly GameDetailDto GameDto = new();
private EditContext? EditContext; private EditContext? EditContext;
private readonly SelectTheme Theme = SelectTheme.Creation; private readonly SelectTheme Theme = SelectTheme.Creation;
private readonly SliderParams SliderParams = new() { Gap = 1, Min = 1, Max = 5 }; private readonly SliderParams SliderParams = new() { Gap = 1, Min = 1, Max = 5 };

View File

@@ -4,7 +4,7 @@
@inherits GameBase @inherits GameBase
<div class="row"> <div class="row">
<img class="icon" src="~/icon.png" /> <img class="icon" src="icon.png" />
<a class="title" href="@($"/Detail/{GameDto.Id}")">@GameDto.Title</a> <a class="title" href="@($"/Detail/{GameDto.Id}")">@GameDto.Title</a>

View File

@@ -80,9 +80,20 @@
fill: var(--white); fill: var(--white);
} }
@media screen and (max-width: 700px) {
.release-date {
display: none;
grid-column: span;
}
.row {
grid-template-columns: auto 3fr 3fr 30px 30px !important;
}
}
@media screen and (max-width: 1000px) { @media screen and (max-width: 1000px) {
.row { .row {
grid-template-columns: 48px 3fr 2fr 3fr 30px 30px; grid-template-columns: auto 3fr 2fr 3fr 30px 30px;
} }
.tags, .storage { .tags, .storage {

View File

@@ -26,7 +26,7 @@ public partial class Games
GameFilter.SortType = Filter.GameFilter.SortTypes GameFilter.SortType = Filter.GameFilter.SortTypes
.First(st => st.SortType == SortType.Ascending); .First(st => st.SortType == SortType.Ascending);
GameFilter.SortProperty= Filter.GameFilter.GameProperties GameFilter.SortProperty = Filter.GameFilter.GameProperties
.First(gp => gp.PropertyName == nameof(GameIdeas.Shared.Model.Game.Title)); .First(gp => gp.PropertyName == nameof(GameIdeas.Shared.Model.Game.Title));
await HandleFetchDatas(); await HandleFetchDatas();

View File

@@ -10,9 +10,9 @@ public partial class Login
[Parameter] public IAuthGateway AuthGateway { get; set; } = default!; [Parameter] public IAuthGateway AuthGateway { get; set; } = default!;
private EditContext? EditContext; private EditContext? EditContext;
private UserDto UserDto = new(); private readonly UserDto UserDto = new();
private bool IsLoading = false; private bool IsLoading = false;
private LoginValidator Validator = new(); private readonly LoginValidator Validator = new();
protected override void OnInitialized() protected override void OnInitialized()
{ {
EditContext = new EditContext(UserDto); EditContext = new EditContext(UserDto);

View File

@@ -1,5 +1,4 @@
using FluentValidation; using FluentValidation;
using GameIdeas.BlazorApp.Shared.Components.Select;
using GameIdeas.BlazorApp.Shared.Components.Select.Models; using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using GameIdeas.Shared.Dto; using GameIdeas.Shared.Dto;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;

View File

@@ -37,36 +37,36 @@ public class UserGateway(IHttpClientService httpClient) : IUserGateway
public async Task<IEnumerable<RoleDto>> GetRoles() public async Task<IEnumerable<RoleDto>> GetRoles()
{ {
try try
{ {
return await httpClient.FetchDataAsync<IEnumerable<RoleDto>>(Endpoints.User.Roles) return await httpClient.FetchDataAsync<IEnumerable<RoleDto>>(Endpoints.User.Roles)
?? throw new InvalidOperationException(ResourcesKey.ErrorFetchRoles); ?? throw new InvalidOperationException(ResourcesKey.ErrorFetchRoles);
} }
catch (Exception) catch (Exception)
{ {
throw new RoleNotFoundException(ResourcesKey.ErrorFetchRoles); throw new RoleNotFoundException(ResourcesKey.ErrorFetchRoles);
} }
} }
public async Task<UserListDto> GetUsers(UserFilterParams filterParams, int currentPage) public async Task<UserListDto> GetUsers(UserFilterParams filterParams, int currentPage)
{ {
try try
{ {
UserFilterDto filter = new() UserFilterDto filter = new()
{ {
CurrentPage = currentPage, CurrentPage = currentPage,
Name = filterParams.Name, Name = filterParams.Name,
RoleIds = filterParams.Roles?.Select(r => r.Id) RoleIds = filterParams.Roles?.Select(r => r.Id)
}; };
var url = Endpoints.User.Fetch(filter); var url = Endpoints.User.Fetch(filter);
return await httpClient.FetchDataAsync<UserListDto>(url) return await httpClient.FetchDataAsync<UserListDto>(url)
?? throw new InvalidOperationException(ResourcesKey.ErrorFetchUsers); ?? throw new InvalidOperationException(ResourcesKey.ErrorFetchUsers);
} }
catch (Exception) catch (Exception)
{ {
throw new UserNotFoundException(ResourcesKey.ErrorFetchUsers); throw new UserNotFoundException(ResourcesKey.ErrorFetchUsers);
} }
} }
public async Task<IdDto> UpdateUser(UserDto user) public async Task<IdDto> UpdateUser(UserDto user)

View File

@@ -17,10 +17,10 @@ public partial class Users
private Popup? Popup; private Popup? Popup;
private bool IsLoading = false; private bool IsLoading = false;
private UserFilterParams FilterParams = new(); private readonly UserFilterParams FilterParams = new();
private UserListDto UserList = new(); private UserListDto UserList = new();
private IEnumerable<RoleDto> Roles = []; private IEnumerable<RoleDto> Roles = [];
private int CurrentPage = 1; private readonly int CurrentPage = 1;
private UserDto UserAdd = new(); private UserDto UserAdd = new();
private UserDto? UserDelete; private UserDto? UserDelete;
private string? currentUserId; private string? currentUserId;

View File

@@ -1,4 +1,3 @@
using System.Net.Http.Json;
using Blazored.LocalStorage; using Blazored.LocalStorage;
using GameIdeas.BlazorApp; using GameIdeas.BlazorApp;
using GameIdeas.BlazorApp.Pages.Games.Gateways; using GameIdeas.BlazorApp.Pages.Games.Gateways;
@@ -10,6 +9,7 @@ using GameIdeas.Shared.Constants;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using System.Net.Http.Json;
var builder = WebAssemblyHostBuilder.CreateDefault(args); var builder = WebAssemblyHostBuilder.CreateDefault(args);
var services = builder.Services; var services = builder.Services;

View File

@@ -1,11 +1,11 @@
using GameIdeas.Resources; using Blazored.LocalStorage;
using System.Net.Http.Headers; using GameIdeas.Resources;
using System.Text.Json.Serialization;
using System.Text.Json;
using System.Text;
using Blazored.LocalStorage;
using GameIdeas.Shared.Constants; using GameIdeas.Shared.Constants;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace GameIdeas.BlazorApp.Services; namespace GameIdeas.BlazorApp.Services;

View File

@@ -1,9 +1,9 @@
using Blazored.LocalStorage; using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using System.Security.Claims;
using System.IdentityModel.Tokens.Jwt;
using GameIdeas.Shared.Constants; using GameIdeas.Shared.Constants;
using GameIdeas.Shared.Dto; using GameIdeas.Shared.Dto;
using Microsoft.AspNetCore.Components.Authorization;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
namespace GameIdeas.BlazorApp.Services; namespace GameIdeas.BlazorApp.Services;

View File

@@ -35,7 +35,7 @@
} }
else else
{ {
await Js.InvokeVoidAsync("setBodyOverflow", "auto"); await Js.InvokeVoidAsync("setBodyOverflow", "visible");
} }
} }
catch (Exception) catch (Exception)

View File

@@ -1,5 +1,5 @@
using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using GameIdeas.BlazorApp.Shared.Components.Select; using GameIdeas.BlazorApp.Shared.Components.Select;
using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using GameIdeas.BlazorApp.Shared.Models; using GameIdeas.BlazorApp.Shared.Models;
using GameIdeas.Resources; using GameIdeas.Resources;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;

View File

@@ -1,7 +1,3 @@
using GameIdeas.BlazorApp.Shared.Components.Select;
using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using GameIdeas.BlazorApp.Shared.Models;
using GameIdeas.Resources;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
namespace GameIdeas.BlazorApp.Shared.Components.Header; namespace GameIdeas.BlazorApp.Shared.Components.Header;

View File

@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
namespace GameIdeas.BlazorApp.Shared.Components.ReadMore; namespace GameIdeas.BlazorApp.Shared.Components.ReadMore;

View File

@@ -1,9 +1,6 @@
using GameIdeas.BlazorApp.Shared.Components.Select.Models; using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using GameIdeas.Resources;
using GameIdeas.Shared.Constants;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Components.Forms;
using System.Text.RegularExpressions;
namespace GameIdeas.BlazorApp.Shared.Components.Select; namespace GameIdeas.BlazorApp.Shared.Components.Select;

View File

@@ -1,6 +1,6 @@
using GameIdeas.BlazorApp.Shared.Components.Search; using GameIdeas.BlazorApp.Shared.Components.Search;
using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using GameIdeas.BlazorApp.Shared.Components.Select; using GameIdeas.BlazorApp.Shared.Components.Select;
using GameIdeas.BlazorApp.Shared.Components.Select.Models;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
namespace GameIdeas.BlazorApp.Shared.Components.SelectSearch; namespace GameIdeas.BlazorApp.Shared.Components.SelectSearch;
@@ -34,15 +34,15 @@ public partial class SelectSearch<TItem>
} }
private async Task HandleValuesChanged(IEnumerable<TItem> values) private async Task HandleValuesChanged(IEnumerable<TItem> values)
{ {
Values = values.ToList(); Values = [.. values];
SearchInput?.SetText(string.Join(", ", Values.Select(GetLabel))); SearchInput?.SetText(string.Join(", ", Values.Select(GetLabel)));
await ValuesChanged.InvokeAsync(Values.ToList()); await ValuesChanged.InvokeAsync([.. Values]);
} }
private async Task HandleClearClicked() private async Task HandleClearClicked()
{ {
Values = []; Values = [];
await ValuesChanged.InvokeAsync(Values.ToList()); await ValuesChanged.InvokeAsync([.. Values]);
} }
private void HandleFocusIn() private void HandleFocusIn()

View File

@@ -2,7 +2,7 @@
public class SliderParams public class SliderParams
{ {
public int Min{ get; set; } public int Min { get; set; }
public int Max { get; set; } public int Max { get; set; }
public int Gap { get; set; } = 0; public int Gap { get; set; } = 0;
} }

View File

@@ -2,7 +2,7 @@
public class SliderRangeParams public class SliderRangeParams
{ {
public int Min{ get; set; } public int Min { get; set; }
public int Max { get; set; } public int Max { get; set; }
public int Gap { get; set; } = 0; public int Gap { get; set; } = 0;
} }

View File

@@ -1,7 +1,7 @@
namespace GameIdeas.Resources; namespace GameIdeas.Resources;
public class Translations (TranslationService translationService) public class Translations(TranslationService translationService)
{ {
public string GamesIdeas => translationService.Translate(nameof(GamesIdeas)); public string GamesIdeas => translationService.Translate(nameof(GamesIdeas));
public string ManualAdd => translationService.Translate(nameof(ManualAdd)); public string ManualAdd => translationService.Translate(nameof(ManualAdd));

View File

@@ -5,22 +5,22 @@ namespace GameIdeas.Resources;
public class TranslationService public class TranslationService
{ {
private readonly Dictionary<string, Dictionary<string, string>?> _translations = new(); private readonly Dictionary<string, Dictionary<string, string>?> _translations = [];
public void Initialize(Dictionary<string, string> translations) public void Initialize(Dictionary<string, string> translations)
{ {
foreach (var translation in translations) foreach (var translation in translations)
{ {
var json = JsonSerializer.Deserialize<Dictionary<string, string>>(translation.Value); var json = JsonSerializer.Deserialize<Dictionary<string, string>>(translation.Value);
_translations[translation.Key] = json; _translations[translation.Key] = json;
} }
} }
public string Translate(string key, string? culture = "fr") public string Translate(string key, string? culture = "fr")
{ {
culture ??= CultureInfo.CurrentCulture.TwoLetterISOLanguageName; culture ??= CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
if (_translations.TryGetValue(culture, out var value) && value?.TryGetValue(key, out var translate) == true) if (_translations.TryGetValue(culture, out var value) && value?.TryGetValue(key, out var translate) == true)
return translate; return translate;
return key; // Fallback to key if translation is missing return key; // Fallback to key if translation is missing
} }
} }

View File

@@ -1,6 +1,4 @@
using GameIdeas.Shared.Enum; namespace GameIdeas.Shared.Dto;
namespace GameIdeas.Shared.Dto;
public class UserDto public class UserDto
{ {

View File

@@ -31,4 +31,3 @@ public partial class Game
public virtual ICollection<GameProperty> GameProperties { get; set; } public virtual ICollection<GameProperty> GameProperties { get; set; }
public virtual ICollection<GameTag> GameTags { get; set; } public virtual ICollection<GameTag> GameTags { get; set; }
} }

View File

@@ -25,14 +25,16 @@ public class GameIdeasContext : IdentityDbContext<User>
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<Developer>(entity => { modelBuilder.Entity<Developer>(entity =>
{
entity.ToTable("Developer"); entity.ToTable("Developer");
entity.HasIndex(e => e.Name) entity.HasIndex(e => e.Name)
.IsUnique(); .IsUnique();
}); });
modelBuilder.Entity<Platform>(entity => { modelBuilder.Entity<Platform>(entity =>
{
entity.ToTable("Platform"); entity.ToTable("Platform");
entity.HasIndex(e => e.Label) entity.HasIndex(e => e.Label)

View File

@@ -5,32 +5,32 @@ namespace GameIdeas.WebAPI.Controllers;
[ApiController] [ApiController]
[Route("api/[controller]")] [Route("api/[controller]")]
public class TranslationsController (ILogger<TranslationsController> Logger) : ControllerBase public class TranslationsController(ILogger<TranslationsController> Logger) : ControllerBase
{ {
[HttpGet] [HttpGet]
public async Task<IActionResult> GetTranslations() public async Task<IActionResult> GetTranslations()
{ {
var dictionary = new Dictionary<string, string>(); var dictionary = new Dictionary<string, string>();
try try
{ {
var filesDirectory = Path.Combine( var filesDirectory = Path.Combine(
Directory.GetCurrentDirectory(), Directory.GetCurrentDirectory(),
"Files"); "Files");
var translationFiles = Directory.GetFiles(filesDirectory, "*.json"); var translationFiles = Directory.GetFiles(filesDirectory, "*.json");
foreach (var file in translationFiles) foreach (var file in translationFiles)
{ {
var name = file.Split('.'); var name = file.Split('.');
var culture = name[^2]; var culture = name[^2];
var content = await System.IO.File.ReadAllTextAsync(file); var content = await System.IO.File.ReadAllTextAsync(file);
dictionary.Add(culture, content); dictionary.Add(culture, content);
} }
} }
catch(Exception ex) catch (Exception ex)
{ {
Logger.LogError(ex, "Internal translations error"); Logger.LogError(ex, "Internal translations error");
} }
return Ok(dictionary); return Ok(dictionary);
} }
} }

View File

@@ -19,22 +19,22 @@ public class UserController(
[HttpPost("Login")] [HttpPost("Login")]
public async Task<ActionResult<TokenDto>> Login([FromBody] UserDto model) public async Task<ActionResult<TokenDto>> Login([FromBody] UserDto model)
{ {
try try
{ {
return Ok(await userReadService.Login(model)); return Ok(await userReadService.Login(model));
} }
catch (UserInvalidException e) catch (UserInvalidException e)
{ {
logger.LogInformation(e, "Missing informations for authentication"); logger.LogInformation(e, "Missing informations for authentication");
return StatusCode(406, e.Message); return StatusCode(406, e.Message);
} }
catch (UserUnauthorizedException e) catch (UserUnauthorizedException e)
{ {
logger.LogWarning(e, "Authentication invalid with there informations"); logger.LogWarning(e, "Authentication invalid with there informations");
return Unauthorized(e.Message); return Unauthorized(e.Message);
} }
catch (Exception e) catch (Exception e)
{ {
logger.LogError(e, "Internal error while search games"); logger.LogError(e, "Internal error while search games");
return StatusCode(500, e.Message); return StatusCode(500, e.Message);
} }

View File

@@ -1,3 +1,3 @@
namespace GameIdeas.WebAPI.Exceptions; namespace GameIdeas.WebAPI.Exceptions;
public class UserInvalidException (string message) : Exception(message); public class UserInvalidException(string message) : Exception(message);

View File

@@ -1,5 +1,4 @@
using System; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable #nullable disable

View File

@@ -54,7 +54,7 @@ namespace GameIdeas.WebAPI.Migrations
/// <inheritdoc /> /// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder) protected override void Down(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.Sql(@$"DELETE FROM ""AspNetUserRoles"" WHERE ""UserId"" = '{GlobalConstants.ADMINISTRATOR_USER_ID.ToString()}' AND ""RoleId"" = '{GlobalConstants.ADMINISTRATOR_ID.ToString()}'"); migrationBuilder.Sql(@$"DELETE FROM ""AspNetUserRoles"" WHERE ""UserId"" = '{GlobalConstants.ADMINISTRATOR_USER_ID}' AND ""RoleId"" = '{GlobalConstants.ADMINISTRATOR_ID}'");
migrationBuilder.DeleteData("AspNetUsers", "Id", GlobalConstants.ADMINISTRATOR_USER_ID.ToString()); migrationBuilder.DeleteData("AspNetUsers", "Id", GlobalConstants.ADMINISTRATOR_USER_ID.ToString());
migrationBuilder.DeleteData("AspNetRoles", "Id", GlobalConstants.ADMINISTRATOR_ID.ToString()); migrationBuilder.DeleteData("AspNetRoles", "Id", GlobalConstants.ADMINISTRATOR_ID.ToString());
migrationBuilder.DeleteData("AspNetRoles", "Id", GlobalConstants.MEMBER_ID.ToString()); migrationBuilder.DeleteData("AspNetRoles", "Id", GlobalConstants.MEMBER_ID.ToString());

View File

@@ -130,15 +130,14 @@ public class GameReadService(GameIdeasContext context, IMapper mapper, ICategory
.Select(k => k.Trim()) .Select(k => k.Trim())
.ToArray() ?? []; .ToArray() ?? [];
games = games games = [.. games
.Where(game => keywords.All( .Where(game => keywords.All(
kw => game.Title.Contains(kw, StringComparison.OrdinalIgnoreCase) kw => game.Title.Contains(kw, StringComparison.OrdinalIgnoreCase)
)) ))
.OrderBy(game => keywords.Min(kw => .OrderBy(game => keywords.Min(kw =>
game.Title.IndexOf(kw, StringComparison.OrdinalIgnoreCase) game.Title.IndexOf(kw, StringComparison.OrdinalIgnoreCase)
)) ))
.ThenBy(game => game.Title.Length) .ThenBy(game => game.Title.Length)];
.ToList();
return; return;
} }
@@ -147,10 +146,9 @@ public class GameReadService(GameIdeasContext context, IMapper mapper, ICategory
{ {
var storageSpaces = categoryService.GetStorageSpaces().Where(stor => filter.StorageSpaces.Contains(stor.Id)); var storageSpaces = categoryService.GetStorageSpaces().Where(stor => filter.StorageSpaces.Contains(stor.Id));
games = games games = [.. games
.Where(game => storageSpaces.Any(stor => .Where(game => storageSpaces.Any(stor =>
(stor.MinSize ?? int.MinValue) <= game.StorageSpace && (stor.MaxSize ?? int.MaxValue) > game.StorageSpace)) (stor.MinSize ?? int.MinValue) <= game.StorageSpace && (stor.MaxSize ?? int.MaxValue) > game.StorageSpace))];
.ToList();
} }
} }
} }

View File

@@ -91,15 +91,14 @@ public class UserReadService(
.Select(k => k.Trim()) .Select(k => k.Trim())
.ToArray() ?? []; .ToArray() ?? [];
users = users users = [.. users
.Where(user => keywords.All( .Where(user => keywords.All(
kw => user.UserName?.Contains(kw, StringComparison.OrdinalIgnoreCase) ?? true kw => user.UserName?.Contains(kw, StringComparison.OrdinalIgnoreCase) ?? true
)) ))
.OrderBy(user => keywords.Min(kw => .OrderBy(user => keywords.Min(kw =>
user.UserName?.IndexOf(kw, StringComparison.OrdinalIgnoreCase) user.UserName?.IndexOf(kw, StringComparison.OrdinalIgnoreCase)
)) ))
.ThenBy(user => user.UserName?.Length) .ThenBy(user => user.UserName?.Length)];
.ToList();
} }
} }

View File

@@ -1,5 +1,4 @@
using AutoMapper; using GameIdeas.Resources;
using GameIdeas.Resources;
using GameIdeas.Shared.Dto; using GameIdeas.Shared.Dto;
using GameIdeas.Shared.Model; using GameIdeas.Shared.Model;
using GameIdeas.WebAPI.Exceptions; using GameIdeas.WebAPI.Exceptions;