using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Admin.Payment.Toss.Confirm.Get; public sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var confirm = await db.TossConfirm.AsNoTracking().Include(c => c.Member).Include(c => c.PaymentOrder).FirstOrDefaultAsync(c => c.ID == request.ID, ct) ?? throw new InvalidOperationException("토스 결제 내역을 찾을 수 없습니다."); var cancel = await db.TossCancel.AsNoTracking() .Where(c => c.PaymentOrderID == confirm.PaymentOrderID && c.ResponseCode == "SUCCESS") .OrderByDescending(c => c.ID) .Select(c => new Response.CancelData { ID = c.ID, CancelAmount = c.CancelAmount, CancelReason = c.CancelReason, CancelRequester = c.CancelRequester, Status = c.Status, TransactionKey = c.TransactionKey, CanceledAt = c.CanceledAt, CreatedAt = c.CreatedAt }) .FirstOrDefaultAsync(ct); return new Response { Confirm = new Response.ConfirmData { ID = confirm.ID, MemberID = confirm.MemberID, MemberEmail = confirm.Member?.Email ?? string.Empty, MemberName = confirm.Member?.Name, PaymentKey = confirm.PaymentKey, OrderID = confirm.OrderID, Amount = confirm.Amount, MerchantID = confirm.PaymentOrder?.MerchantID ?? "TOSS", OrderStatus = confirm.PaymentOrder != null ? confirm.PaymentOrder.Status : default, OrderPaidAt = confirm.PaymentOrder?.PaidAt, OrderCancelledAt = confirm.PaymentOrder?.CancelledAt, OrderName = confirm.PaymentOrder?.OrderName, ResponseCode = confirm.ResponseCode, ResponseMessage = confirm.ResponseMessage, Status = confirm.Status, Method = confirm.Method, TotalAmount = confirm.TotalAmount, ApprovedAt = confirm.ApprovedAt, ReceiptUrl = confirm.ReceiptUrl, VirtualAccountNumber = confirm.PaymentOrder?.VirtualAccountNumber, VirtualAccountBank = confirm.PaymentOrder?.VirtualAccountBank, VirtualAccountHolder = confirm.PaymentOrder?.VirtualAccountHolder, VirtualAccountExpireAt = confirm.PaymentOrder?.VirtualAccountExpireAt, CreatedAt = confirm.CreatedAt, UpdatedAt = confirm.UpdatedAt }, Cancel = cancel }; } }