fixed generation of random challenge

This commit is contained in:
2026-04-12 14:18:46 +01:00
parent cd0dd8d7e1
commit 5d203bed67
2 changed files with 45 additions and 21 deletions
@@ -1,4 +1,5 @@
using BeReadyBackend.Models; using BeReadyBackend.DTO.RandomChallenges;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Specifications.RandomChallenges; using BeReadyBackend.Specifications.RandomChallenges;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
@@ -6,20 +7,29 @@ using FastEndpoints;
namespace BeReadyBackend.Endpoints.RandomChallenges; namespace BeReadyBackend.Endpoints.RandomChallenges;
public class GenerateRequest
{
public DateOnly Today { get; set; }
}
public class GenerateRandomChallengeEndpoint( public class GenerateRandomChallengeEndpoint(
RandomChallengesRepository randomChallengesRepository, RandomChallengesRepository randomChallengesRepository,
UserRandomChallengesRepository userRandomChallengesRepository, UserRandomChallengesRepository userRandomChallengesRepository,
UsersRepository usersRepository) UsersRepository usersRepository)
: EndpointWithoutRequest : Endpoint<GenerateRequest, GetRandomChallengeDto>
{ {
public override void Configure() public override void Configure()
{ {
Post("/RandomChallenges/"); Post("/RandomChallenges/");
} }
public override async Task HandleAsync(CancellationToken ct) public override async Task HandleAsync(GenerateRequest req, CancellationToken ct)
{ {
RandomChallenge? randomChallenge = await randomChallengesRepository.FirstOrDefaultAsync(new GetRandomChallengesNotAlreadyPastSpec(), ct); RandomChallenge? randomChallenge = await randomChallengesRepository.SingleOrDefaultAsync(new GetRandomChallengeByDateSpec(req.Today), ct);
if (randomChallenge is null)
{
randomChallenge = await randomChallengesRepository.FirstOrDefaultAsync(new GetRandomChallengesNotAlreadyPastSpec(), ct);
if (randomChallenge is null) if (randomChallenge is null)
{ {
await Send.StringAsync("Il n'y a plus de défis en stock", 500, cancellation: ct); await Send.StringAsync("Il n'y a plus de défis en stock", 500, cancellation: ct);
@@ -39,7 +49,8 @@ public class GenerateRandomChallengeEndpoint(
randomChallenge.IsAlreadyPast = true; randomChallenge.IsAlreadyPast = true;
randomChallenge.GeneratedAt = DateTime.Now; randomChallenge.GeneratedAt = DateTime.Now;
await randomChallengesRepository.SaveChangesAsync(ct); await randomChallengesRepository.SaveChangesAsync(ct);
}
await Send.NoContentAsync(ct); await Send.OkAsync(await randomChallengesRepository.ProjectToSingleAsync<GetRandomChallengeDto>(new GetRandomChallengeByIdSpec(randomChallenge.Id), ct), ct);
} }
} }
@@ -0,0 +1,13 @@
using Ardalis.Specification;
using BeReadyBackend.Models;
namespace BeReadyBackend.Specifications.RandomChallenges;
public class GetRandomChallengeByDateSpec : SingleResultSpecification<RandomChallenge>
{
public GetRandomChallengeByDateSpec(DateOnly today)
{
Query
.Where(x => x.GeneratedAt != null && DateOnly.FromDateTime(x.GeneratedAt.Value) == today);
}
}