From e192df49e7546e581cf968c8002ce57f17be8f64 Mon Sep 17 00:00:00 2001 From: Maxime Adler Date: Thu, 17 Apr 2025 12:49:31 +0200 Subject: [PATCH] Add game and game detail dtos --- .../GameIdeas.BlazorApp/Helpers/GameHelper.cs | 2 +- .../Components/GameCreationForm.razor.cs | 2 +- .../Pages/Games/Components/GameValidation.cs | 2 +- .../Pages/Games/Gateways/GameGateway.cs | 2 +- .../Pages/Games/Gateways/IGameGateway.cs | 2 +- .../GameIdeas.Shared/Dto/GameDetailDto.cs | 20 +++++++++++++++++++ src/GameIdeas/GameIdeas.Shared/Dto/GameDto.cs | 14 ++----------- .../GameIdeas.Shared/Dto/SortPropertyDto.cs | 2 +- .../Controllers/GameController.cs | 8 ++++---- .../GameIdeas.WebAPI/Profiles/GameProfile.cs | 14 ++++++++++--- .../GameIdeas.WebAPI/Services/GameService.cs | 12 +++++------ .../Services/Interfaces/IGameService.cs | 6 +++--- 12 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 src/GameIdeas/GameIdeas.Shared/Dto/GameDetailDto.cs diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs index 8f830c2..b737d80 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Helpers/GameHelper.cs @@ -4,7 +4,7 @@ namespace GameIdeas.BlazorApp.Helpers; public static class GameHelper { - public static void WriteTrackingDto(GameDto game) + public static void WriteTrackingDto(GameDetailDto game) { game.CreationUserId = 100000; game.CreationDate = DateTime.Now; diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameCreationForm.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameCreationForm.razor.cs index 358d442..895fb72 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameCreationForm.razor.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameCreationForm.razor.cs @@ -18,7 +18,7 @@ public partial class GameCreationForm [Parameter] public CategoriesDto? Categories { get; set; } [Parameter] public EventCallback OnSubmit { get; set; } - private GameDto GameDto = new(); + private GameDetailDto GameDto = new(); private EditContext? EditContext; private readonly SelectTheme Theme = SelectTheme.Creation; private readonly SliderParams SliderParams = new() { Gap = 1, Min = 1, Max = 5 }; diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameValidation.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameValidation.cs index 12eff58..34de4ed 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameValidation.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Components/GameValidation.cs @@ -4,7 +4,7 @@ using GameIdeas.Shared.Dto; namespace GameIdeas.BlazorApp.Pages.Games.Components; -public class GameValidation : AbstractValidator +public class GameValidation : AbstractValidator { public GameValidation() { 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 25da217..ff68e56 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/GameGateway.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/GameGateway.cs @@ -8,7 +8,7 @@ namespace GameIdeas.BlazorApp.Pages.Games.Gateways; public class GameGateway(IHttpClientService httpClientService) : IGameGateway { - public async Task CreateGame(GameDto game) + public async Task CreateGame(GameDetailDto game) { try { diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/IGameGateway.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/IGameGateway.cs index 387d846..645a988 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/IGameGateway.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Games/Gateways/IGameGateway.cs @@ -5,6 +5,6 @@ namespace GameIdeas.BlazorApp.Pages.Games.Gateways; public interface IGameGateway { Task FetchCategories(); - Task CreateGame(GameDto game); + Task CreateGame(GameDetailDto game); Task> FetchGames(PaggingDto pagging); } diff --git a/src/GameIdeas/GameIdeas.Shared/Dto/GameDetailDto.cs b/src/GameIdeas/GameIdeas.Shared/Dto/GameDetailDto.cs new file mode 100644 index 0000000..6510480 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Dto/GameDetailDto.cs @@ -0,0 +1,20 @@ +namespace GameIdeas.Shared.Dto; + +public class GameDetailDto +{ + public int? Id { get; set; } + public string? Title { get; set; } + public DateTime? ReleaseDate { get; set; } + public DateTime? CreationDate { get; set; } + public int CreationUserId { get; set; } + public DateTime? ModificationDate { get; set; } + public int? ModificationUserId { get; set; } + public double? StorageSpace { get; set; } + public string? Description { get; set; } + public int Interest { get; set; } = 3; + public List? Platforms { get; set; } + public List? Properties { get; set; } + public List? Tags { get; set; } + public List? Publishers { get; set; } + public List? Developers { get; set; } +} \ No newline at end of file diff --git a/src/GameIdeas/GameIdeas.Shared/Dto/GameDto.cs b/src/GameIdeas/GameIdeas.Shared/Dto/GameDto.cs index dd2afe0..aa87436 100644 --- a/src/GameIdeas/GameIdeas.Shared/Dto/GameDto.cs +++ b/src/GameIdeas/GameIdeas.Shared/Dto/GameDto.cs @@ -5,18 +5,8 @@ public class GameDto public int? Id { get; set; } public string? Title { get; set; } public DateTime? ReleaseDate { get; set; } - public DateTime? CreationDate { get; set; } - public UserDto? CreationUser { get; set; } - public int CreationUserId { get; set; } - public DateTime? ModificationDate { get; set; } - public UserDto? ModificationUser { get; set; } - public int? ModificationUserId { get; set; } + public IEnumerable? Platforms { get; set; } + public IEnumerable? Tags { get; set; } public double? StorageSpace { get; set; } - public string? Description { get; set; } public int Interest { get; set; } = 3; - public List? Platforms { get; set; } - public List? Properties { get; set; } - public List? Tags { get; set; } - public List? Publishers { get; set; } - public List? Developers { get; set; } } \ No newline at end of file diff --git a/src/GameIdeas/GameIdeas.Shared/Dto/SortPropertyDto.cs b/src/GameIdeas/GameIdeas.Shared/Dto/SortPropertyDto.cs index 5f54704..9d6343e 100644 --- a/src/GameIdeas/GameIdeas.Shared/Dto/SortPropertyDto.cs +++ b/src/GameIdeas/GameIdeas.Shared/Dto/SortPropertyDto.cs @@ -2,6 +2,6 @@ public class SortPropertyDto { - public Func? SortProperty { get; set; } + public Func? SortProperty { get; set; } public string Label { get; set; } = string.Empty; } diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Controllers/GameController.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Controllers/GameController.cs index 0db432b..ba68265 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Controllers/GameController.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Controllers/GameController.cs @@ -12,7 +12,7 @@ public class GameController(IGameService gameService, ILoggerFactory loggerFacto private readonly ILogger logger = loggerFactory.CreateLogger(); [HttpGet] - public async Task>> GetGames([FromQuery] PaggingDto pagging) + public async Task>> SearchGames([FromQuery] PaggingDto pagging) { try { @@ -26,7 +26,7 @@ public class GameController(IGameService gameService, ILoggerFactory loggerFacto } [HttpGet("{id:int}")] - public async Task> GetGameById(int id) + public async Task> GetGameById(int id) { try { @@ -40,7 +40,7 @@ public class GameController(IGameService gameService, ILoggerFactory loggerFacto } [HttpPost("Create")] - public async Task> CreateGame([FromBody] GameDto game) + public async Task> CreateGame([FromBody] GameDetailDto game) { try { @@ -55,7 +55,7 @@ public class GameController(IGameService gameService, ILoggerFactory loggerFacto } [HttpPut("Update")] - public async Task> UpdateGame([FromBody] GameDto game) + public async Task> UpdateGame([FromBody] GameDetailDto game) { try { diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Profiles/GameProfile.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Profiles/GameProfile.cs index e87e187..e0e5d73 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Profiles/GameProfile.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Profiles/GameProfile.cs @@ -8,16 +8,14 @@ public class GameProfile : Profile { public GameProfile() { - CreateMap() + CreateMap() .ForMember(d => d.Id, o => o.MapFrom(s => s.Id)) .ForMember(d => d.Title, o => o.MapFrom(s => s.Title)) .ForMember(d => d.ReleaseDate, o => o.MapFrom(s => s.ReleaseDate)) .ForMember(d => d.CreationDate, o => o.MapFrom(s => s.CreationDate)) .ForMember(d => d.CreationUserId, o => o.MapFrom(s => s.CreationUserId)) - .ForMember(d => d.CreationUser, o => o.MapFrom(s => s.CreationUser)) .ForMember(d => d.ModificationDate, o => o.MapFrom(s => s.ModificationDate)) .ForMember(d => d.ModificationUserId, o => o.MapFrom(s => s.ModificationUserId)) - .ForMember(d => d.ModificationUser, o => o.MapFrom(s => s.ModificationUser)) .ForMember(d => d.StorageSpace, o => o.MapFrom(s => s.StorageSpace)) .ForMember(d => d.Description, o => o.MapFrom(s => s.Description)) .ForMember(d => d.Interest, o => o.MapFrom(s => s.Interest)) @@ -27,5 +25,15 @@ public class GameProfile : Profile .ForMember(d => d.Publishers, o => o.MapFrom(s => s.GamePublishers.Select(p => p.Publisher))) .ForMember(d => d.Developers, o => o.MapFrom(s => s.GameDevelopers.Select(gd => gd.Developer))) .ReverseMap(); + + CreateMap() + .ForMember(d => d.Id, o => o.MapFrom(s => s.Id)) + .ForMember(d => d.Title, o => o.MapFrom(s => s.Title)) + .ForMember(d => d.ReleaseDate, o => o.MapFrom(s => s.ReleaseDate)) + .ForMember(d => d.Platforms, o => o.MapFrom(s => s.GamePlatforms.Select(p => new PlatformDto() { Id = p.Platform.Id, Label = p.Platform.Label, Url = p.Url }))) + .ForMember(d => d.Tags, o => o.MapFrom(s => s.GameTags.Select(t => t.Tag))) + .ForMember(d => d.StorageSpace, o => o.MapFrom(s => s.StorageSpace)) + .ForMember(d => d.Interest, o => o.MapFrom(s => s.Interest)) + .ReverseMap(); } } diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Services/GameService.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Services/GameService.cs index a00b216..91625ce 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Services/GameService.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Services/GameService.cs @@ -21,17 +21,17 @@ public class GameService(GameIdeasContext context, IMapper mapper) : IGameServic return mapper.Map>(games); } - public async Task GetGameById(int gameId) + public async Task GetGameById(int gameId) { var game = await SelectGames() .FirstOrDefaultAsync(g => g.Id == gameId); return game == null ? throw new NotFoundException($"[{typeof(Game).FullName}] with ID {gameId} has not been found in context") - : mapper.Map(game); + : mapper.Map(game); } - public async Task CreateGame(GameDto gameDto) + public async Task CreateGame(GameDetailDto gameDto) { var gameToCreate = mapper.Map(gameDto); @@ -46,10 +46,10 @@ public class GameService(GameIdeasContext context, IMapper mapper) : IGameServic await context.SaveChangesAsync(); - return mapper.Map(gameToCreate); + return mapper.Map(gameToCreate); } - public async Task UpdateGame(GameDto gameDto) + public async Task UpdateGame(GameDetailDto gameDto) { if (await context.Games.CountAsync(g => g.Id == gameDto.Id) == 0) { @@ -67,7 +67,7 @@ public class GameService(GameIdeasContext context, IMapper mapper) : IGameServic context.Games.Update(gameToUpdate); await context.SaveChangesAsync(); - return mapper.Map(gameToUpdate); + return mapper.Map(gameToUpdate); } public async Task DeleteGame(int gameId) diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Services/Interfaces/IGameService.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Services/Interfaces/IGameService.cs index efc11cc..0b3e974 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Services/Interfaces/IGameService.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Services/Interfaces/IGameService.cs @@ -5,8 +5,8 @@ namespace GameIdeas.WebAPI.Services.Interfaces; public interface IGameService { Task> GetGames(PaggingDto pagging); - Task GetGameById(int gameId); - Task CreateGame(GameDto gameDto); - Task UpdateGame(GameDto gameDto); + Task GetGameById(int gameId); + Task CreateGame(GameDetailDto gameDto); + Task UpdateGame(GameDetailDto gameDto); Task DeleteGame(int gameId); }