From 05b5026c6baccf2b8371f47e3ff5104868f00a18 Mon Sep 17 00:00:00 2001 From: sanchezvem Date: Sat, 21 Feb 2026 16:24:12 +0100 Subject: [PATCH] Fixed errors and created endpoint to see locked achievement of selected user --- ...{GetSuccessDto.cs => GetAchievementDto.cs} | 2 +- ...kSuccessDto.cs => UnlockAchievementDto.cs} | 0 .../GetAllAchievementsEndpoint.cs | 4 +- .../GetLockedAchievementsEndpoint.cs | 40 +++++++++++++++++++ .../GetUserAchievementsEndpoint.cs | 5 +-- .../MappingProfiles/EntityToDtoMappings.cs | 4 +- .../Achievements/GetLockedAchievementsSpec.cs | 14 +++++++ 7 files changed, 61 insertions(+), 8 deletions(-) rename BeReadyBackend/DTO/Achievements/{GetSuccessDto.cs => GetAchievementDto.cs} (84%) rename BeReadyBackend/DTO/Achievements/{UnlockSuccessDto.cs => UnlockAchievementDto.cs} (100%) create mode 100644 BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs create mode 100644 BeReadyBackend/Specifications/Achievements/GetLockedAchievementsSpec.cs diff --git a/BeReadyBackend/DTO/Achievements/GetSuccessDto.cs b/BeReadyBackend/DTO/Achievements/GetAchievementDto.cs similarity index 84% rename from BeReadyBackend/DTO/Achievements/GetSuccessDto.cs rename to BeReadyBackend/DTO/Achievements/GetAchievementDto.cs index 7bbb9f7..496302f 100644 --- a/BeReadyBackend/DTO/Achievements/GetSuccessDto.cs +++ b/BeReadyBackend/DTO/Achievements/GetAchievementDto.cs @@ -1,6 +1,6 @@ namespace BeReadyBackend.DTO.Achievements; -public class GetSuccessDto +public class GetAchievementDto { public int Id { get; set; } public string? Label { get; set; } diff --git a/BeReadyBackend/DTO/Achievements/UnlockSuccessDto.cs b/BeReadyBackend/DTO/Achievements/UnlockAchievementDto.cs similarity index 100% rename from BeReadyBackend/DTO/Achievements/UnlockSuccessDto.cs rename to BeReadyBackend/DTO/Achievements/UnlockAchievementDto.cs diff --git a/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs index 6e93e66..08850c4 100644 --- a/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs @@ -4,7 +4,7 @@ using FastEndpoints; namespace BeReadyBackend.Endpoints.Achievements; -public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepository) : EndpointWithoutRequest> +public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepository) : EndpointWithoutRequest> { public override void Configure() { @@ -14,6 +14,6 @@ public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepos public override async Task HandleAsync(CancellationToken ct) { - await Send.OkAsync(await achievementsRepository.ProjectToListAsync(ct), ct); + await Send.OkAsync(await achievementsRepository.ProjectToListAsync(ct), ct); } } \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs new file mode 100644 index 0000000..b05edcc --- /dev/null +++ b/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs @@ -0,0 +1,40 @@ +using BeReadyBackend.DTO.Achievements; +using BeReadyBackend.Models; +using BeReadyBackend.Repositories; +using BeReadyBackend.Specifications.Achievements; +using BeReadyBackend.Specifications.Users; +using FastEndpoints; + +namespace BeReadyBackend.Endpoints.Achievements; + +public class UserAchievementsLockedRequest +{ + public int UserId { get; set; } +} + +public class GetLockedAchievementsEndpoint( + UsersRepository usersRepository, + AchievementsRepository achievementsRepository) + : Endpoint> +{ + public override void Configure() + { + Get("/Achievements/Locked/Users/{@UserId}/", x => new {x.UserId}); + AllowAnonymous(); + } + + public override async Task HandleAsync(UserAchievementsLockedRequest req, CancellationToken ct) + { + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.UserId), ct); + + if (user is null) + { + await Send.NotFoundAsync(ct); + return; + } + + List achievementsLocked = await achievementsRepository.ProjectToListAsync(new GetLockedAchievementsSpec(req.UserId), ct); + + await Send.OkAsync(achievementsLocked, ct); + } +} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs index f667988..b17176a 100644 --- a/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs @@ -1,7 +1,6 @@ using BeReadyBackend.DTO.Achievements; using BeReadyBackend.Models; using BeReadyBackend.Repositories; -using BeReadyBackend.Specifications.Achievements; using BeReadyBackend.Specifications.UserAchievements; using BeReadyBackend.Specifications.Users; using FastEndpoints; @@ -16,7 +15,7 @@ public class UserAchievementsRequest public class GetUserAchievementsEndpoint( UsersRepository usersRepository, UserAchievementsRepository userAchievementsRepository) - : Endpoint> + : Endpoint> { public override void Configure() { @@ -34,7 +33,7 @@ public class GetUserAchievementsEndpoint( return; } - List userAchievements = await userAchievementsRepository.ProjectToListAsync(new GetUserAchievementByUserIdSpec(req.UserId), ct); + List userAchievements = await userAchievementsRepository.ProjectToListAsync(new GetUserAchievementByUserIdSpec(req.UserId), ct); await Send.OkAsync(userAchievements, ct); } diff --git a/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs b/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs index 56296cd..c1c09e5 100644 --- a/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs +++ b/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs @@ -8,9 +8,9 @@ public class EntityToDtoMappings : Profile { public EntityToDtoMappings() { - CreateMap(); + CreateMap(); - CreateMap() + CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Achievement!.Id)) .ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Achievement!.Label)) .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Achievement!.Description)); diff --git a/BeReadyBackend/Specifications/Achievements/GetLockedAchievementsSpec.cs b/BeReadyBackend/Specifications/Achievements/GetLockedAchievementsSpec.cs new file mode 100644 index 0000000..386682e --- /dev/null +++ b/BeReadyBackend/Specifications/Achievements/GetLockedAchievementsSpec.cs @@ -0,0 +1,14 @@ +using Ardalis.Specification; +using BeReadyBackend.Models; + +namespace BeReadyBackend.Specifications.Achievements; + +public class GetLockedAchievementsSpec : Specification +{ + public GetLockedAchievementsSpec(int userId) + { + Query + .Where(x => x.UserAchievements != null && x.UserAchievements.All(y => y.UserId != userId)); + + } +} \ No newline at end of file