Handler.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Payment.Toss.Cancel.Search;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.TossCancel.AsNoTracking().Include(c => c.Member).AsQueryable();
  10. if (!string.IsNullOrWhiteSpace(request.Keyword))
  11. {
  12. query = request.Search switch
  13. {
  14. 1 => query.Where(c => c.PaymentKey.Contains(request.Keyword)),
  15. 2 => query.Where(c => c.OrderID.Contains(request.Keyword)),
  16. 3 => query.Where(c => c.Member != null && c.Member.ID.ToString().Contains(request.Keyword)),
  17. 4 => query.Where(c => c.Member != null && c.Member.Name != null && c.Member.Name.Contains(request.Keyword)),
  18. 5 => query.Where(c => c.Member != null && c.Member.SID.Contains(request.Keyword)),
  19. _ => query
  20. };
  21. }
  22. if (!string.IsNullOrWhiteSpace(request.StartAt) && DateTime.TryParse(request.StartAt, out var startAt))
  23. {
  24. query = query.Where(c => c.CreatedAt >= startAt);
  25. }
  26. if (!string.IsNullOrWhiteSpace(request.EndAt) && DateTime.TryParse(request.EndAt, out var endAt))
  27. {
  28. query = query.Where(c => c.CreatedAt <= endAt);
  29. }
  30. // 탭별 건수 (State 필터 전)
  31. var counts = await query.GroupBy(c => 1).Select(c => new Response.StateCounts
  32. {
  33. Success = c.Count(x => x.ResponseCode == "SUCCESS"),
  34. Failed = c.Count(x => x.ResponseCode != null && x.ResponseCode != "SUCCESS"),
  35. Pending = c.Count(x => x.ResponseCode == null)
  36. }).FirstOrDefaultAsync(ct) ?? new Response.StateCounts();
  37. if (request.State.HasValue)
  38. {
  39. query = request.State.Value switch
  40. {
  41. 1 => query.Where(c => c.ResponseCode == "SUCCESS"),
  42. 2 => query.Where(c => c.ResponseCode != null && c.ResponseCode != "SUCCESS"),
  43. 3 => query.Where(c => c.ResponseCode == null),
  44. _ => query
  45. };
  46. }
  47. var total = await query.CountAsync(ct);
  48. var skip = (request.Page - 1) * request.PerPage;
  49. var list = await query
  50. .OrderByDescending(c => c.ID)
  51. .Skip(skip)
  52. .Take(request.PerPage)
  53. .Select(c => new
  54. {
  55. c.ID,
  56. c.MemberID,
  57. MemberEmail = c.Member != null ? c.Member.Email : string.Empty,
  58. MemberName = c.Member != null ? c.Member.Name : null,
  59. c.PaymentKey,
  60. c.OrderID,
  61. c.CancelAmount,
  62. c.CancelReason,
  63. c.CancelRequester,
  64. c.Status,
  65. c.ResponseCode,
  66. c.ResponseMessage,
  67. c.CreatedAt
  68. })
  69. .ToListAsync(ct);
  70. var rows = list.Select((c, idx) => new Response.Row
  71. {
  72. Num = total - skip - idx,
  73. ID = c.ID,
  74. MemberID = c.MemberID,
  75. MemberEmail = c.MemberEmail,
  76. MemberName = c.MemberName,
  77. PaymentKey = c.PaymentKey,
  78. OrderID = c.OrderID,
  79. CancelAmount = c.CancelAmount,
  80. CancelReason = c.CancelReason,
  81. CancelRequester = c.CancelRequester,
  82. Status = c.Status,
  83. ResponseCode = c.ResponseCode,
  84. ResponseMessage = c.ResponseMessage,
  85. CreatedAt = c.CreatedAt
  86. }).ToList();
  87. return new Response
  88. {
  89. Total = total,
  90. Counts = counts,
  91. List = rows
  92. };
  93. }
  94. }