Handler.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Donations.ValueObject;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Api.Crew.GetActiveSession;
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response?>
  7. {
  8. public async Task<Response?> Handle(Query request, CancellationToken ct)
  9. {
  10. var session = await db.CrewSession.AsNoTracking()
  11. .Include(s => s.Consents).ThenInclude(c => c.CrewMember)
  12. .Include(s => s.Summaries).ThenInclude(s => s.CrewMember)
  13. .Where(s => s.CrewID == request.CrewID && s.Status != CrewSessionStatus.Ended)
  14. .FirstOrDefaultAsync(ct);
  15. if (session is null) return null;
  16. var consents = session.Consents.Select(c => new ConsentItem(
  17. c.CrewMemberID,
  18. c.CrewMember?.Nickname ?? "",
  19. c.IsConsented,
  20. c.ConsentedAt
  21. )).ToList();
  22. var summaries = session.Summaries
  23. .OrderBy(s => s.Rank)
  24. .Select(s => new SummaryItem(
  25. s.CrewMemberID,
  26. s.CrewMember?.Nickname ?? "",
  27. s.TotalAmount,
  28. s.DonationCount,
  29. s.ContributionRate,
  30. s.Rank
  31. )).ToList();
  32. return new Response(
  33. session.ID, session.Title, session.Status.ToString(),
  34. session.StartedAt, session.CreatedAt,
  35. session.TotalAmount, session.TotalDonationCount,
  36. consents, summaries
  37. );
  38. }
  39. }