fixed generation of random challenge
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user