| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Member.Items.List;
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var now = DateTime.UtcNow;
- var query = db.MemberItem.AsNoTracking()
- .Include(i => i.Product)
- .Where(i => i.MemberID == request.MemberID && i.RevokedAt == null);
- if (!request.IncludeUsed)
- {
- query = query.Where(i => i.UsedAt == null);
- }
- if (!request.IncludeExpired)
- {
- query = query.Where(i => i.ExpiresAt == null || i.ExpiresAt > now);
- }
- var total = await query.CountAsync(ct);
- var list = await query
- .OrderByDescending(i => i.ID)
- .Skip((request.Page - 1) * request.PerPage)
- .Take(request.PerPage)
- .Select(i => new Response.Row(
- i.ID,
- i.ProductID,
- i.Product!.Name,
- i.Product.Thumbnail,
- i.Kind,
- i.EquipSlot,
- i.IsEquipped,
- i.EquipSlot != null,
- i.Product.EffectPayload,
- i.DurationDays,
- i.AcquiredAt,
- i.ExpiresAt,
- i.UsedAt,
- i.GiftFromMemberID,
- i.GiftFromMemberID == null ? null : db.Member.Where(m => m.ID == i.GiftFromMemberID).Select(m => m.Name).FirstOrDefault()
- ))
- .ToListAsync(ct);
- return new Response(total, list);
- }
- }
|