Handler.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. {
  7. public sealed class Handler(IAppDbContext db, ICacheService cache) : IQueryHandler<Query, Response>
  8. {
  9. public async Task<Response> Handle(Query request, CancellationToken ct)
  10. {
  11. var cacheKey = CacheKeys.FaqItemByCode(request.Code ?? "all");
  12. var cached = await cache.GetAsync<Response>(cacheKey, ct);
  13. if (cached is not null)
  14. {
  15. return cached;
  16. }
  17. var query = db.FaqItem.AsNoTracking().Include(i => i.FaqCategory).AsQueryable();
  18. if (!string.IsNullOrWhiteSpace(request.Code))
  19. {
  20. query = query.Where(i => i.FaqCategory.Code == request.Code);
  21. }
  22. var total = await query.CountAsync(ct);
  23. var list = await query
  24. .OrderBy(i => i.Order)
  25. .ThenByDescending(i => i.ID)
  26. .Select(c => new
  27. {
  28. c.ID,
  29. c.CategoryID,
  30. CategoryCode = c.FaqCategory.Code,
  31. CategorySubject = c.FaqCategory.Subject,
  32. c.Question,
  33. c.Answer,
  34. c.Order,
  35. c.IsActive,
  36. c.UpdatedAt,
  37. c.CreatedAt
  38. })
  39. .ToListAsync(ct);
  40. var response = new Response
  41. {
  42. Total = total,
  43. List = [..list.Select(c => new Response.Item
  44. {
  45. ID = c.ID,
  46. CategoryID = c.CategoryID,
  47. CategoryCode = c.CategoryCode,
  48. CategorySubject = c.CategorySubject,
  49. Question = c.Question,
  50. Answer = c.Answer,
  51. Order = c.Order,
  52. IsActive = c.IsActive,
  53. UpdatedAt = c.UpdatedAt,
  54. CreatedAt = c.CreatedAt
  55. })]
  56. };
  57. await cache.SetAsync(cacheKey, response, ct);
  58. return response;
  59. }
  60. }
  61. }