Handler.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Application.Abstractions.Cache;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Api.Banner.Item.GetByCode;
  6. public sealed class Handler(IAppDbContext db, ICacheService cache) : IQueryHandler<Query, Response>
  7. {
  8. public async Task<Response> Handle(Query request, CancellationToken ct)
  9. {
  10. var cacheKey = CacheKeys.BannerByCode(request.Code);
  11. var cached = await cache.GetAsync<Response>(cacheKey, ct);
  12. if (cached is not null)
  13. {
  14. return cached;
  15. }
  16. var position = await db.BannerPosition.AsNoTracking().FirstOrDefaultAsync(c => c.Code == request.Code, ct);
  17. if (position is null)
  18. {
  19. return new Response(0, []);
  20. }
  21. var query = db.BannerItem.AsNoTracking().Include(c => c.BannerPosition).Where(c => c.PositionID == position.ID);
  22. var total = await query.CountAsync(ct);
  23. var list = await query
  24. .OrderBy(c => c.Order)
  25. .ThenByDescending(c => c.ID)
  26. .Select(c => new
  27. {
  28. c.ID,
  29. c.PositionID,
  30. PositionCode = c.BannerPosition.Code,
  31. PositionSubject = c.BannerPosition.Subject,
  32. c.Subject,
  33. c.DesktopImage,
  34. c.MobileImage,
  35. c.Link,
  36. c.Order,
  37. c.IsActive,
  38. c.StartAt,
  39. c.EndAt,
  40. c.UpdatedAt,
  41. c.CreatedAt
  42. })
  43. .ToListAsync(ct);
  44. var response = new Response(
  45. total,
  46. [..list.Select(c => new Response.Row(
  47. c.ID,
  48. c.PositionID,
  49. c.PositionCode,
  50. c.PositionSubject,
  51. c.Subject,
  52. c.DesktopImage,
  53. c.MobileImage,
  54. c.Link,
  55. c.Order,
  56. c.IsActive,
  57. c.StartAt,
  58. c.EndAt,
  59. c.UpdatedAt,
  60. c.CreatedAt
  61. ))]
  62. );
  63. await cache.SetAsync(cacheKey, response, ct);
  64. return response;
  65. }
  66. }