Handler.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Application.Abstractions.Cache;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Api.Faq.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.FaqItemByCode(request.Code ?? "all");
  11. var cached = await cache.GetAsync<Response>(cacheKey, ct);
  12. if (cached is not null)
  13. {
  14. return cached;
  15. }
  16. var query = db.FaqItem.AsNoTracking().Include(i => i.FaqCategory).AsQueryable();
  17. if (!string.IsNullOrWhiteSpace(request.Code))
  18. {
  19. query = query.Where(i => i.FaqCategory.Code == request.Code);
  20. }
  21. var total = await query.CountAsync(ct);
  22. var list = await query
  23. .OrderBy(i => i.Order)
  24. .ThenByDescending(i => i.ID)
  25. .Select(c => new
  26. {
  27. c.ID,
  28. c.CategoryID,
  29. CategoryCode = c.FaqCategory.Code,
  30. CategorySubject = c.FaqCategory.Subject,
  31. c.Question,
  32. c.Answer,
  33. c.Order,
  34. c.IsActive,
  35. c.UpdatedAt,
  36. c.CreatedAt
  37. })
  38. .ToListAsync(ct);
  39. var response = new Response
  40. {
  41. Total = total,
  42. List = [..list.Select(c => new Response.Item
  43. {
  44. ID = c.ID,
  45. CategoryID = c.CategoryID,
  46. CategoryCode = c.CategoryCode,
  47. CategorySubject = c.CategorySubject,
  48. Question = c.Question,
  49. Answer = c.Answer,
  50. Order = c.Order,
  51. IsActive = c.IsActive,
  52. UpdatedAt = c.UpdatedAt,
  53. CreatedAt = c.CreatedAt
  54. })]
  55. };
  56. await cache.SetAsync(cacheKey, response, ct);
  57. return response;
  58. }
  59. }