using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.Paper.GetOrders; internal sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var accountID = await db.PaperAccount.AsNoTracking().Where(c => c.MemberID == request.MemberID).Select(c => (int?)c.ID).FirstOrDefaultAsync(ct); if (accountID is null) { return new Response(0, []); } var query = db.PaperOrder.AsNoTracking().Where(c => c.AccountID == accountID.Value); if (request.Status.HasValue) { query = query.Where(c => c.Status == request.Status.Value); } var total = await query.CountAsync(ct); var orders = await query .OrderByDescending(c => c.ID) .Skip((request.Page - 1) * request.PerPage) .Take(request.PerPage) .Select(c => new { c.ID, c.StockCode, c.Side, c.FillRule, c.Quantity, c.ReservedAmount, c.TargetDate, c.CancelableUntil, c.Status, c.RejectReason, c.CreatedAt, Fill = db.PaperFill.Where(f => f.OrderID == c.ID).Select(f => new Response.FillInfo( f.Price, f.Quantity, f.Fee, f.Tax, f.Amount, f.RealizedPnL, f.PriceDate, f.FilledAt )).FirstOrDefault() }) .ToListAsync(ct); var codes = orders.Select(c => c.StockCode).Distinct().ToList(); var names = await db.Stock.AsNoTracking() .Where(c => codes.Contains(c.Code)) .Select(c => new { c.Code, c.Name }) .ToDictionaryAsync(c => c.Code, c => c.Name, ct); var list = orders.Select(c => new Response.Row( c.ID, c.StockCode, names.GetValueOrDefault(c.StockCode, c.StockCode), c.Side.ToString(), c.FillRule.ToString(), c.Quantity, c.ReservedAmount, c.TargetDate, c.CancelableUntil, c.Status.ToString(), c.RejectReason, c.CreatedAt, c.Fill )).ToList(); return new Response(total, list); } }