Handler.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Donation.History;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.Donation.AsNoTracking().Where(d => !d.IsTest);
  10. query = request.Type switch
  11. {
  12. "sent" => query.Where(d => d.SponsorMemberID == request.MemberID),
  13. "received" => query.Where(d => d.ReceiverMemberID == request.MemberID),
  14. _ => query.Where(d => d.SponsorMemberID == request.MemberID)
  15. };
  16. var total = await query.CountAsync(ct);
  17. var list = await query
  18. .OrderByDescending(d => d.CreatedAt)
  19. .Skip((request.PageNum - 1) * request.PerPage)
  20. .Take(request.PerPage)
  21. .Select(d => new DonationItem(
  22. d.ID,
  23. d.SponsorMemberID,
  24. d.SendName,
  25. d.ReceiverMemberID,
  26. d.ChannelID,
  27. d.Channel != null ? d.Channel.Name : "",
  28. d.Amount,
  29. d.NetAmount,
  30. d.Message,
  31. d.SendName,
  32. d.CrewMemberID,
  33. d.CrewMember != null ? d.CrewMember.Nickname : null,
  34. d.IsTest,
  35. d.CreatedAt
  36. ))
  37. .ToListAsync(ct);
  38. return new Response(total, list);
  39. }
  40. }