Created endpoints to see all challenges and proofs of the user in her personnal page

This commit is contained in:
2026-02-21 21:58:43 +01:00
parent 115f4de993
commit a701909d9d
8 changed files with 170 additions and 4 deletions
@@ -2,5 +2,7 @@
public class GetUserChallengeDto
{
public string? ChallengeTitle { get; set; }
public string? ChallengeDescription { get; set; }
public int ChallengeDuration { get; set; }
}
@@ -0,0 +1,37 @@
using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users;
public class GetAllUserChallengesEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : EndpointWithoutRequest<List<GetUserChallengeDto>>
{
public override void Configure()
{
Get("/Users/Challenges/");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetProofOrChallengeByUserIdSpec(userId), ct);
if (user is null)
{
await Send.NotFoundAsync(ct);
return;
}
List<GetUserChallengeDto> challenges = [];
if (user.UserRandomChallenges is not null)
challenges.AddRange(user.UserRandomChallenges.Select(x => mapper.Map<GetUserChallengeDto>(x.RandomChallenge)));
if (user.UserGroups is not null)
challenges.AddRange(user.UserGroups.Select(x => mapper.Map<GetUserChallengeDto>(x.Group)));
await Send.OkAsync(challenges, ct);
}
}
@@ -0,0 +1,37 @@
using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users;
public class GetAllUserProofsEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : EndpointWithoutRequest<List<GetUserProofDto>>
{
public override void Configure()
{
Get("/Users/Proofs/");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetProofOrChallengeByUserIdSpec(userId), ct);
if (user is null)
{
await Send.NotFoundAsync(ct);
return;
}
List<GetUserProofDto> proofs = [];
if (user.UserRandomChallenges is not null)
proofs.AddRange(user.UserRandomChallenges.Select(x => mapper.Map<GetUserProofDto>(x.RandomChallenge)));
if (user.UserGroups is not null)
proofs.AddRange(user.UserGroups.Select(x => mapper.Map<GetUserProofDto>(x.Group)));
await Send.OkAsync(proofs, ct);
}
}
@@ -0,0 +1,31 @@
using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users;
public class GetUserDetailsEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : EndpointWithoutRequest<GetUserDetailsDto>
{
public override void Configure()
{
Get("/Users/Details");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
if (user is null)
{
await Send.NotFoundAsync(ct);
return;
}
await Send.OkAsync(mapper.Map<GetUserDetailsDto>(user), ct);
}
}
@@ -0,0 +1,34 @@
using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users;
using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users;
public class UserRequest
{
public int Id { get; set; }
}
public class GetUserEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : Endpoint<UserRequest, GetUserDto>
{
public override void Configure()
{
Get("/Users/{@Id}/", x => new {x.Id});
}
public override async Task HandleAsync(UserRequest req, CancellationToken ct)
{
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.Id), ct);
if (user is null)
{
await Send.NotFoundAsync(ct);
return;
}
await Send.OkAsync(mapper.Map<GetUserDto>(user), ct);
}
}
@@ -24,8 +24,16 @@ public class EntityToDtoMappings : Profile
CreateMap<User, GetUserStatsDto>();
CreateMap<User, GetUserChallengeDto>();
CreateMap<UserGroup, GetUserProofDto>();
CreateMap<UserRandomChallenge, GetUserProofDto>();
CreateMap<RandomChallenge, GetUserChallengeDto>()
.ForMember(dest => dest.ChallengeTitle, opt => opt.MapFrom(src => src.Libelle))
.ForMember(dest => dest.ChallengeDuration, opt => opt.MapFrom(src => src.Duration));
CreateMap<User, GetUserProofDto>();
CreateMap<Group, GetUserChallengeDto>()
.ForMember(dest => dest.ChallengeTitle, opt => opt.MapFrom(src => src.Title))
.ForMember(dest => dest.ChallengeDescription, opt => opt.MapFrom(src => src.Description))
.ForMember(dest => dest.ChallengeDuration, opt => opt.MapFrom(src => src.Duration));
}
}
@@ -0,0 +1,17 @@
using Ardalis.Specification;
using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.Users;
public class GetProofOrChallengeByUserIdSpec : SingleResultSpecification<User>
{
public GetProofOrChallengeByUserIdSpec(int userId)
{
Query
.Include(x => x.UserRandomChallenges!)
.ThenInclude(x => x.RandomChallenge)
.Include(x => x.UserGroups!)
.ThenInclude(x => x.Group)
.Where(x => x.Id == userId);
}
}
@@ -3,7 +3,7 @@ using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.Users;
public class GetUserByIdSpec : SingleResultSpecification<User>
public class GetUserByIdSpec : SingleResultSpecification<User>
{
public GetUserByIdSpec(int userId)
{