diff --git a/BeReadyBackend/Endpoints/RandomChallenges/GenerateRandomChallengeEndpoint.cs b/BeReadyBackend/Endpoints/RandomChallenges/GenerateRandomChallengeEndpoint.cs index 3a20317..5231478 100644 --- a/BeReadyBackend/Endpoints/RandomChallenges/GenerateRandomChallengeEndpoint.cs +++ b/BeReadyBackend/Endpoints/RandomChallenges/GenerateRandomChallengeEndpoint.cs @@ -1,4 +1,5 @@ -using BeReadyBackend.Models; +using BeReadyBackend.DTO.RandomChallenges; +using BeReadyBackend.Models; using BeReadyBackend.Repositories; using BeReadyBackend.Specifications.RandomChallenges; using BeReadyBackend.Specifications.Users; @@ -6,40 +7,50 @@ using FastEndpoints; namespace BeReadyBackend.Endpoints.RandomChallenges; +public class GenerateRequest +{ + public DateOnly Today { get; set; } +} + public class GenerateRandomChallengeEndpoint( RandomChallengesRepository randomChallengesRepository, UserRandomChallengesRepository userRandomChallengesRepository, UsersRepository usersRepository) - : EndpointWithoutRequest + : Endpoint { public override void Configure() { 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) { - await Send.StringAsync("Il n'y a plus de défis en stock", 500, cancellation: ct); - return; + randomChallenge = await randomChallengesRepository.FirstOrDefaultAsync(new GetRandomChallengesNotAlreadyPastSpec(), ct); + if (randomChallenge is null) + { + await Send.StringAsync("Il n'y a plus de défis en stock", 500, cancellation: ct); + return; + } + + List userList = await usersRepository.ListAsync(new GetAllUsersSpec(), ct); + + List userRandomChallenges = userList.Select(user => new UserRandomChallenge + { + UserId = user.Id, + RandomChallengeId = randomChallenge.Id + }).ToList(); + + await userRandomChallengesRepository.AddRangeAsync(userRandomChallenges, ct); + + randomChallenge.IsAlreadyPast = true; + randomChallenge.GeneratedAt = DateTime.Now; + await randomChallengesRepository.SaveChangesAsync(ct); } - List userList = await usersRepository.ListAsync(new GetAllUsersSpec(), ct); - - List userRandomChallenges = userList.Select(user => new UserRandomChallenge - { - UserId = user.Id, - RandomChallengeId = randomChallenge.Id - }).ToList(); - - await userRandomChallengesRepository.AddRangeAsync(userRandomChallenges, ct); - - randomChallenge.IsAlreadyPast = true; - randomChallenge.GeneratedAt = DateTime.Now; - await randomChallengesRepository.SaveChangesAsync(ct); - - await Send.NoContentAsync(ct); + await Send.OkAsync(await randomChallengesRepository.ProjectToSingleAsync(new GetRandomChallengeByIdSpec(randomChallenge.Id), ct), ct); } } \ No newline at end of file diff --git a/BeReadyBackend/Specifications/RandomChallenges/GetRandomChallengeByDateSpec.cs b/BeReadyBackend/Specifications/RandomChallenges/GetRandomChallengeByDateSpec.cs new file mode 100644 index 0000000..e01ea96 --- /dev/null +++ b/BeReadyBackend/Specifications/RandomChallenges/GetRandomChallengeByDateSpec.cs @@ -0,0 +1,13 @@ +using Ardalis.Specification; +using BeReadyBackend.Models; + +namespace BeReadyBackend.Specifications.RandomChallenges; + +public class GetRandomChallengeByDateSpec : SingleResultSpecification +{ + public GetRandomChallengeByDateSpec(DateOnly today) + { + Query + .Where(x => x.GeneratedAt != null && DateOnly.FromDateTime(x.GeneratedAt.Value) == today); + } +} \ No newline at end of file