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.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<GenerateRequest, GetRandomChallengeDto>
{
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<User> userList = await usersRepository.ListAsync(new GetAllUsersSpec(), ct);
List<UserRandomChallenge> 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<User> userList = await usersRepository.ListAsync(new GetAllUsersSpec(), ct);
List<UserRandomChallenge> 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<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);
}
}