Handler.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Store.ValueObject;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Admin.Store.Coupon.Search;
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  7. {
  8. public async Task<Response> Handle(Query request, CancellationToken ct)
  9. {
  10. var query = db.Coupon.AsNoTracking()
  11. .Include(c => c.Product)
  12. .Include(c => c.Game)
  13. .AsQueryable();
  14. if (request.GameID.HasValue)
  15. {
  16. query = query.Where(c => c.GameID == request.GameID.Value);
  17. }
  18. if (request.ProductID.HasValue)
  19. {
  20. query = query.Where(c => c.ProductID == request.ProductID.Value);
  21. }
  22. if (!string.IsNullOrWhiteSpace(request.Keyword))
  23. {
  24. var kw = request.Keyword.Trim();
  25. query = query.Where(c => c.Name.Contains(kw));
  26. }
  27. var total = await query.CountAsync(ct);
  28. var list = await query
  29. .OrderByDescending(c => c.ID)
  30. .Skip((request.Page - 1) * request.PerPage)
  31. .Take(request.PerPage)
  32. .Select(c => new
  33. {
  34. c.ID,
  35. c.ProductID,
  36. ProductName = c.Product!.Name,
  37. c.GameID,
  38. GameName = c.Game!.KorName,
  39. c.Name,
  40. c.UsagePolicy,
  41. c.ExpiresAt,
  42. c.GeneratedCount,
  43. c.UsedCount,
  44. AvailableCount = db.CouponCode.Count(cc => cc.CouponID == c.ID && cc.Status == CouponCodeStatus.Available),
  45. c.LowStockThreshold,
  46. c.UpdatedAt,
  47. c.CreatedAt
  48. })
  49. .ToListAsync(ct);
  50. var startNum = total - ((request.Page - 1) * request.PerPage);
  51. return new Response(
  52. total,
  53. [.. list.Select((c, i) => new Response.Row(
  54. Num: startNum - i,
  55. c.ID,
  56. c.ProductID,
  57. c.ProductName,
  58. c.GameID,
  59. c.GameName,
  60. c.Name,
  61. c.UsagePolicy,
  62. c.ExpiresAt,
  63. c.GeneratedCount,
  64. c.UsedCount,
  65. c.AvailableCount,
  66. c.LowStockThreshold,
  67. IsLowStock: c.AvailableCount < c.LowStockThreshold,
  68. c.UpdatedAt,
  69. c.CreatedAt
  70. ))]
  71. );
  72. }
  73. }