Handler.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Crypto.List.Search
  5. {
  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.Coin.AsNoTracking()
  11. .Include(c => c.CoinCategoryMap).ThenInclude(m => m.CoinCategory)
  12. .AsQueryable();
  13. if (request.CategoryID.HasValue)
  14. {
  15. query = query.Where(c => c.CoinCategoryMap.Any(m => m.CategoryID == request.CategoryID.Value));
  16. }
  17. if (!string.IsNullOrWhiteSpace(request.Keyword))
  18. {
  19. var kw = request.Keyword.Trim();
  20. query = query.Where(c => c.Symbol.Contains(kw) || c.KorName.Contains(kw) || c.EngName.Contains(kw));
  21. }
  22. if (request.IsActive.HasValue)
  23. {
  24. query = query.Where(c => c.IsActive == request.IsActive.Value);
  25. }
  26. if (request.IsWarning.HasValue)
  27. {
  28. query = query.Where(c => c.IsWarning == request.IsWarning.Value);
  29. }
  30. if (request.IsNew.HasValue)
  31. {
  32. query = query.Where(c => c.IsNew == request.IsNew.Value);
  33. }
  34. if (request.IsDelisted.HasValue)
  35. {
  36. query = query.Where(c => c.IsDelisted == request.IsDelisted.Value);
  37. }
  38. var total = await query.CountAsync(ct);
  39. var list = await query
  40. .OrderByDescending(c => c.ID)
  41. .Skip((request.PageNum - 1) * request.PerPage)
  42. .Take(request.PerPage)
  43. .Select(c => new
  44. {
  45. c.ID,
  46. c.Symbol,
  47. c.KorName,
  48. c.EngName,
  49. c.LogoImage,
  50. CategoryNames = c.CoinCategoryMap.Select(m => m.CoinCategory.Name).ToList(),
  51. c.IsActive,
  52. c.IsWarning,
  53. c.IsNew,
  54. c.IsDelisted,
  55. c.UpdatedAt,
  56. c.CreatedAt
  57. })
  58. .ToListAsync(ct);
  59. var startNum = total - ((request.PageNum - 1) * request.PerPage);
  60. return new Response(
  61. total,
  62. [..list.Select((c, i) => new Response.Row(
  63. Num: startNum - i,
  64. c.ID,
  65. c.Symbol,
  66. c.KorName,
  67. c.EngName,
  68. c.LogoImage,
  69. c.CategoryNames,
  70. c.IsActive,
  71. c.IsWarning,
  72. c.IsNew,
  73. c.IsDelisted,
  74. c.UpdatedAt,
  75. c.CreatedAt
  76. ))]
  77. );
  78. }
  79. }
  80. }