Created all endpoints and DTO to achievements

This commit is contained in:
2026-02-21 15:45:55 +01:00
parent 3588200211
commit e677ff0f0a
11 changed files with 183 additions and 1 deletions
@@ -0,0 +1,8 @@
namespace BeReadyBackend.DTO.Achievements;
public class GetSuccessDto
{
public int Id { get; set; }
public string? Label { get; set; }
public string? Description { get; set; }
}
@@ -0,0 +1,7 @@
namespace BeReadyBackend.DTO.Achievements;
public class UnlockAchievementDto
{
public int AchievementId { get; set; }
public int UserId { get; set; }
}
@@ -0,0 +1,19 @@
using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Repositories;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Achievements;
public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepository) : EndpointWithoutRequest<List<GetSuccessDto>>
{
public override void Configure()
{
Get("/Achievements/");
AllowAnonymous();
}
public override async Task HandleAsync(CancellationToken ct)
{
await Send.OkAsync(await achievementsRepository.ProjectToListAsync<GetSuccessDto>(ct), ct);
}
}
@@ -0,0 +1,41 @@
using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Specifications.Achievements;
using BeReadyBackend.Specifications.UserAchievements;
using BeReadyBackend.Specifications.Users;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Achievements;
public class UserAchievementsRequest
{
public int UserId { get; set; }
}
public class GetUserAchievementsEndpoint(
UsersRepository usersRepository,
UserAchievementsRepository userAchievementsRepository)
: Endpoint<UserAchievementsRequest, List<GetSuccessDto>>
{
public override void Configure()
{
Get("/Achievements/Users/{@UserId}/", x => new {x.UserId});
AllowAnonymous();
}
public override async Task HandleAsync(UserAchievementsRequest req, CancellationToken ct)
{
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.UserId), ct);
if (user is null)
{
await Send.NotFoundAsync(ct);
return;
}
List<GetSuccessDto> userAchievements = await userAchievementsRepository.ProjectToListAsync<GetSuccessDto>(new GetUserAchievementByUserIdSpec(req.UserId), ct);
await Send.OkAsync(userAchievements, ct);
}
}
@@ -0,0 +1,44 @@
using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Specifications.Achievements;
using BeReadyBackend.Specifications.UserAchievements;
using BeReadyBackend.Specifications.Users;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Achievements;
public class UnlockAchievementEndpoint(
UserAchievementsRepository userAchievementsRepository,
AchievementsRepository achievementsRepository,
UsersRepository usersRepository,
AutoMapper.IMapper mapper) : Endpoint<UnlockAchievementDto>
{
public override void Configure()
{
Post("/Achievements/{@AchievementId}/Users/{@UserId}/", x => new {x.AchievementId, x.UserId});
AllowAnonymous();
}
public override async Task HandleAsync(UnlockAchievementDto req, CancellationToken ct)
{
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.UserId), ct);
Achievement? achievement = await achievementsRepository.SingleOrDefaultAsync(new GetAchievementByIdSpec(req.AchievementId), ct);
if (user is null || achievement is null)
{
await Send.NotFoundAsync(ct);
return;
}
UserAchievement? userAchievement = await userAchievementsRepository.SingleOrDefaultAsync(new GetUserAchievementByIdSpec(req.UserId, req.AchievementId), ct);
if (userAchievement is not null)
{
await Send.StringAsync("Le succès est déjà attribué à cet utilisateur", 500, cancellation: ct);
return;
}
await userAchievementsRepository.AddAsync(mapper.Map<UserAchievement>(req), ct);
await Send.OkAsync(ct);
}
}
@@ -1,4 +1,6 @@
using AutoMapper;
using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models;
namespace BeReadyBackend.MappingProfiles;
@@ -6,6 +8,6 @@ public class DtoToEntityMappings : Profile
{
public DtoToEntityMappings()
{
CreateMap<UnlockAchievementDto, UserAchievement>();
}
}
@@ -1,4 +1,6 @@
using AutoMapper;
using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models;
namespace BeReadyBackend.MappingProfiles;
@@ -6,5 +8,11 @@ public class EntityToDtoMappings : Profile
{
public EntityToDtoMappings()
{
CreateMap<Achievement, GetSuccessDto>();
CreateMap<UserAchievement, GetSuccessDto>()
.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));
}
}
@@ -0,0 +1,13 @@
using Ardalis.Specification;
using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.Achievements;
public class GetAchievementByIdSpec : SingleResultSpecification<Achievement>
{
public GetAchievementByIdSpec(int achievementId)
{
Query
.Where(x => x.Id == achievementId);
}
}
@@ -0,0 +1,13 @@
using Ardalis.Specification;
using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.UserAchievements;
public class GetUserAchievementByIdSpec : SingleResultSpecification<UserAchievement>
{
public GetUserAchievementByIdSpec(int userId, int achievementId)
{
Query
.Where(x => x.UserId == userId && x.AchievementId == achievementId);
}
}
@@ -0,0 +1,14 @@
using Ardalis.Specification;
using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.UserAchievements;
public class GetUserAchievementByUserIdSpec : Specification<UserAchievement>
{
public GetUserAchievementByUserIdSpec(int userId)
{
Query
.Include(x => x.Achievement)
.Where(x => x.UserId == userId);
}
}
@@ -0,0 +1,13 @@
using Ardalis.Specification;
using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.Users;
public class GetUserByIdSpec : SingleResultSpecification<User>
{
public GetUserByIdSpec(int userId)
{
Query
.Where(x => x.Id == userId);
}
}