Handler.cs 1.3 KB

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