Handler.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Crypto.News.Article.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.RssNewsArticle.AsNoTracking().Include(x => x.RssFeedSource).AsQueryable();
  11. if (request.RssFeedSourceID.HasValue)
  12. {
  13. query = query.Where(x => x.RssFeedSourceID == request.RssFeedSourceID.Value);
  14. }
  15. if (!string.IsNullOrWhiteSpace(request.Keyword))
  16. {
  17. var kw = request.Keyword.Trim();
  18. query = query.Where(x => x.Title.Contains(kw) || (x.Description != null && x.Description.Contains(kw)));
  19. }
  20. var total = await query.CountAsync(ct);
  21. var list = await query
  22. .OrderByDescending(x => x.PublishedAt ?? x.CreatedAt)
  23. .Skip((request.PageNum - 1) * request.PerPage)
  24. .Take(request.PerPage)
  25. .Select(x => new
  26. {
  27. x.ID,
  28. FeedSourceName = x.RssFeedSource.Name,
  29. x.Title,
  30. x.Author,
  31. x.Link,
  32. x.PublishedAt,
  33. x.CreatedAt
  34. })
  35. .ToListAsync(ct);
  36. var startNum = total - ((request.PageNum - 1) * request.PerPage);
  37. return new Response(
  38. total,
  39. [..list.Select((c, i) => new Response.Row(
  40. Num: startNum - i,
  41. c.ID,
  42. c.FeedSourceName,
  43. c.Title,
  44. c.Author,
  45. c.Link,
  46. c.PublishedAt,
  47. c.CreatedAt
  48. ))]
  49. );
  50. }
  51. }
  52. }