Handler.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Store.Orders.Get;
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  9. {
  10. var order = await db.Order.AsNoTracking()
  11. .Include(o => o.Channel)
  12. .Include(o => o.Items).ThenInclude(i => i.Product)
  13. .Where(o => o.ID == request.OrderID && o.MemberID == request.MemberID)
  14. .FirstOrDefaultAsync(ct);
  15. if (order is null)
  16. {
  17. return Result.Failure<Response>(Error.NotFound("Order.NotFound", "주문을 찾을 수 없습니다."));
  18. }
  19. var shipment = await db.Shipment.AsNoTracking()
  20. .Where(s => s.OrderID == order.ID)
  21. .Select(s => new Response.ShipmentRow(
  22. s.ID,
  23. s.Status,
  24. s.Carrier,
  25. s.TrackingNumber,
  26. s.ShippingFee,
  27. s.ShippedAt,
  28. s.DeliveredAt
  29. ))
  30. .FirstOrDefaultAsync(ct);
  31. var items = order.Items
  32. .OrderBy(i => i.ID)
  33. .Select(i => new Response.ItemRow(
  34. i.ID,
  35. i.ProductID,
  36. i.Product!.Name,
  37. i.Product.Thumbnail,
  38. i.Product.Type,
  39. i.Quantity,
  40. i.UnitPrice,
  41. i.IssuedCouponCodeID
  42. ))
  43. .ToList();
  44. var refunds = await db.OrderRefund.AsNoTracking()
  45. .Where(r => r.OrderID == order.ID)
  46. .OrderByDescending(r => r.ID)
  47. .Select(r => new Response.RefundRow(
  48. r.ID,
  49. r.Type,
  50. r.ReasonType,
  51. r.Status,
  52. r.Amount,
  53. r.Reason,
  54. r.AdminMemo,
  55. r.RequestedAt,
  56. r.ResolvedAt
  57. ))
  58. .ToListAsync(ct);
  59. return Result.Success(new Response(
  60. ID: order.ID,
  61. OrderNumber: order.OrderNumber,
  62. TotalAmount: order.TotalAmount,
  63. PlatformFeeAmount: order.PlatformFeeAmount,
  64. GameRevenueAmount: order.GameRevenueAmount,
  65. ChannelRewardAmount: order.ChannelRewardAmount,
  66. Status: order.Status,
  67. ChannelID: order.ChannelID,
  68. ChannelName: order.Channel?.Name,
  69. CreatedAt: order.CreatedAt,
  70. PaidAt: order.PaidAt,
  71. Items: items,
  72. Shipment: shipment,
  73. Refunds: refunds
  74. ));
  75. }
  76. }