Handler.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Application.Features.Api.Feed.Shared;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Api.Feed.GetTimeline;
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  7. {
  8. public async Task<Response> Handle(Query request, CancellationToken ct)
  9. {
  10. var followingIDs = await db.MemberFollow.AsNoTracking()
  11. .Where(f => f.FollowerMemberID == request.MemberID && !f.IsMuted)
  12. .Select(f => f.FolloweeMemberID)
  13. .ToListAsync(ct);
  14. if (followingIDs.Count == 0)
  15. {
  16. return new Response { Total = 0, List = [] };
  17. }
  18. var query = db.FeedPost.AsNoTracking().Where(p => !p.IsDeleted && followingIDs.Contains(p.MemberID));
  19. var total = await query.LongCountAsync(ct);
  20. var skip = (request.Page - 1) * request.PerPage;
  21. var rows = await query
  22. .OrderByDescending(p => p.CreatedAt)
  23. .Skip(skip)
  24. .Take(request.PerPage)
  25. .Select(p => new
  26. {
  27. p.ID,
  28. AuthorSID = p.Member.SID,
  29. AuthorName = p.Member.Name,
  30. AuthorThumb = p.Member.Thumb,
  31. AuthorSummary = p.Member.Summary,
  32. IsCreator = p.Member.IsCreator,
  33. ChannelSID = p.Member.Channel != null ? p.Member.Channel.SID : null,
  34. p.Content,
  35. p.Thumbnail,
  36. p.Images,
  37. p.Medias,
  38. p.Likes,
  39. p.Comments,
  40. p.Bookmarks,
  41. p.Views,
  42. Tags = p.FeedPostTag.Select(pt => new { pt.FeedTag.Name, pt.FeedTag.Slug }).ToList(),
  43. p.CreatedAt
  44. })
  45. .ToListAsync(ct);
  46. return new Response
  47. {
  48. Total = total,
  49. List = [..rows.Select(r => new FeedCardRow
  50. {
  51. PostID = r.ID,
  52. AuthorSID = r.AuthorSID,
  53. AuthorName = r.AuthorName,
  54. AuthorThumb = r.AuthorThumb,
  55. AuthorSummary = r.AuthorSummary,
  56. IsCreator = r.IsCreator,
  57. ChannelSID = r.ChannelSID,
  58. Subject = FeedContent.Excerpt(r.Content, 60),
  59. ContentExcerpt = FeedContent.Excerpt(r.Content, 200),
  60. Thumbnail = r.Thumbnail,
  61. Images = r.Images,
  62. Medias = r.Medias,
  63. Likes = r.Likes,
  64. Comments = r.Comments,
  65. Bookmarks = r.Bookmarks,
  66. Views = r.Views,
  67. Tags = [..r.Tags.Select(t => new FeedCardRow.TagRef { Name = t.Name, Slug = t.Slug })],
  68. CreatedAt = r.CreatedAt
  69. })]
  70. };
  71. }
  72. }