Handler.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Member.Items.List;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var now = DateTime.UtcNow;
  10. var query = db.MemberItem.AsNoTracking()
  11. .Include(i => i.Product)
  12. .Where(i => i.MemberID == request.MemberID && i.RevokedAt == null);
  13. if (!request.IncludeUsed)
  14. {
  15. query = query.Where(i => i.UsedAt == null);
  16. }
  17. if (!request.IncludeExpired)
  18. {
  19. query = query.Where(i => i.ExpiresAt == null || i.ExpiresAt > now);
  20. }
  21. var total = await query.CountAsync(ct);
  22. var list = await query
  23. .OrderByDescending(i => i.ID)
  24. .Skip((request.Page - 1) * request.PerPage)
  25. .Take(request.PerPage)
  26. .Select(i => new Response.Row(
  27. i.ID,
  28. i.ProductID,
  29. i.Product!.Name,
  30. i.Product.Thumbnail,
  31. i.Kind,
  32. i.EquipSlot,
  33. i.IsEquipped,
  34. i.EquipSlot != null,
  35. i.Product.EffectPayload,
  36. i.DurationDays,
  37. i.AcquiredAt,
  38. i.ExpiresAt,
  39. i.UsedAt,
  40. i.GiftFromMemberID,
  41. i.GiftFromMemberID == null ? null : db.Member.Where(m => m.ID == i.GiftFromMemberID).Select(m => m.Name).FirstOrDefault()
  42. ))
  43. .ToListAsync(ct);
  44. return new Response(total, list);
  45. }
  46. }