Handler.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Application.Common;
  4. using Domain.Entities.Wallets.ValueObject;
  5. using SharedKernel.Results;
  6. using Microsoft.EntityFrameworkCore;
  7. namespace Application.Features.Api.MyPage.DonationLogs;
  8. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  9. {
  10. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  11. {
  12. var page = request.Page < 1 ? 1 : request.Page;
  13. var perPage = request.PerPage is < 1 or > 50 ? 20 : request.PerPage;
  14. var now = DateTime.UtcNow;
  15. var startDate = request.Type switch
  16. {
  17. SearchDateType.Week => now.AddDays(-7),
  18. SearchDateType.Month => now.AddMonths(-1),
  19. SearchDateType.QuarterYear => now.AddMonths(-3),
  20. SearchDateType.HalfYear => now.AddMonths(-6),
  21. _ => now.Date
  22. };
  23. var baseQuery = db.Donation.AsNoTracking().Where(d => d.SponsorMemberID == request.MemberID && d.CreatedAt >= startDate);
  24. var total = await baseQuery.CountAsync(ct);
  25. // Donation ↔ WalletTransaction 매칭: TxType=DonationOut, BalanceType=PgCharged, RefID == Donation.ID.ToString()
  26. var list = await baseQuery
  27. .OrderByDescending(d => d.CreatedAt)
  28. .Skip((page - 1) * perPage)
  29. .Take(perPage)
  30. .Select(d => new DonationLogItem(
  31. d.ID,
  32. d.CreatedAt,
  33. d.SendName,
  34. d.Channel != null ? d.Channel.Name : null,
  35. d.Message,
  36. d.Amount,
  37. db.WalletTransaction
  38. .Where(t => t.TxType == WalletTransactionType.DonationOut
  39. && t.BalanceType == WalletBalanceType.PgCharged
  40. && t.RefID == d.ID.ToString())
  41. .OrderByDescending(t => t.CreatedAt)
  42. .Select(t => (long?)t.BalanceAfter.Value)
  43. .FirstOrDefault(),
  44. d.CrewSessionID != null,
  45. d.IsTest
  46. ))
  47. .ToListAsync(ct);
  48. return Result.Success(new Response(list, total, page, perPage));
  49. }
  50. }