Handler.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Paper.GetLedger;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var accountID = await db.PaperAccount.AsNoTracking().Where(c => c.MemberID == request.MemberID).Select(c => (int?)c.ID).FirstOrDefaultAsync(ct);
  10. if (accountID is null)
  11. {
  12. return new Response(0, []);
  13. }
  14. var query = db.PaperLedger.AsNoTracking().Where(c => c.AccountID == accountID.Value);
  15. var total = await query.CountAsync(ct);
  16. var rows = await query
  17. .OrderByDescending(c => c.ID)
  18. .Skip((request.Page - 1) * request.PerPage)
  19. .Take(request.PerPage)
  20. .Select(c => new
  21. {
  22. c.ID,
  23. c.Type,
  24. c.TokenAmount,
  25. c.UnitsDelta,
  26. c.BalanceAfter,
  27. c.CreatedAt
  28. })
  29. .ToListAsync(ct);
  30. var list = rows.Select(c => new Response.Row(
  31. c.ID,
  32. c.Type.ToString(),
  33. c.TokenAmount,
  34. c.UnitsDelta,
  35. c.BalanceAfter,
  36. c.CreatedAt
  37. )).ToList();
  38. return new Response(total, list);
  39. }
  40. }