Handler.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Crew.GetCrewRanking;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var session = await db.CrewSession.AsNoTracking()
  10. .FirstOrDefaultAsync(s => s.ID == request.CrewSessionID, ct);
  11. if (session is null)
  12. {
  13. throw new KeyNotFoundException("세션을 찾을 수 없습니다.");
  14. }
  15. var list = await db.CrewDonationSummary.AsNoTracking()
  16. .Where(s => s.CrewSessionID == request.CrewSessionID)
  17. .OrderBy(s => s.Rank)
  18. .Select(s => new CrewRankItem(
  19. s.Rank,
  20. s.CrewMemberID,
  21. s.CrewMember!.Nickname,
  22. s.CrewMember.Member != null ? s.CrewMember.Member.Thumb : null,
  23. s.CrewMember.Channel != null ? s.CrewMember.Channel.Name : null,
  24. s.TotalAmount,
  25. s.DonationCount,
  26. s.ContributionRate
  27. ))
  28. .ToListAsync(ct);
  29. return new Response(list, session.TotalAmount);
  30. }
  31. }