Handler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.News.GetArticles;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.RssNewsArticle.AsNoTracking().Include(x => x.RssFeedSource).AsQueryable();
  10. if (request.RssFeedSourceID.HasValue)
  11. {
  12. query = query.Where(x => x.RssFeedSourceID == request.RssFeedSourceID.Value);
  13. }
  14. if (!string.IsNullOrWhiteSpace(request.Keyword))
  15. {
  16. var kw = request.Keyword.Trim();
  17. query = query.Where(x => x.Title.Contains(kw) || (x.Description != null && x.Description.Contains(kw)));
  18. }
  19. query = query.OrderByDescending(x => x.PublishedAt ?? x.CreatedAt);
  20. var total = await query.CountAsync(ct);
  21. var list = await query
  22. .Skip((request.Page - 1) * request.PerPage)
  23. .Take(request.PerPage)
  24. .Select(x => new Response.Row(
  25. x.ID,
  26. x.RssFeedSourceID,
  27. x.RssFeedSource.Name,
  28. x.Title,
  29. x.Link,
  30. x.Author,
  31. x.Description,
  32. x.ImageUrl,
  33. x.SourceName,
  34. x.Categories,
  35. x.CommentCount,
  36. x.PublishedAt,
  37. x.CreatedAt
  38. ))
  39. .ToListAsync(ct);
  40. return new Response(total, list);
  41. }
  42. }