Handler.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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.GetAll;
  6. /// <summary>
  7. /// "전체" 피드 — 삭제되지 않은 모든 FeedPost 를 최신순으로.
  8. /// 팔로잉 필터/윈도우 없이 공개 피드 전체를 반환한다.
  9. /// </summary>
  10. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  11. {
  12. public async Task<Response> Handle(Query request, CancellationToken ct)
  13. {
  14. var query = db.FeedPost.AsNoTracking().Where(p => !p.IsDeleted);
  15. var total = await query.LongCountAsync(ct);
  16. var skip = (request.Page - 1) * request.PerPage;
  17. var rows = await query
  18. .OrderByDescending(p => p.CreatedAt)
  19. .Skip(skip)
  20. .Take(request.PerPage)
  21. .Select(p => new
  22. {
  23. p.ID,
  24. AuthorSID = p.Member.SID,
  25. AuthorName = p.Member.Name,
  26. AuthorThumb = p.Member.Thumb,
  27. AuthorSummary = p.Member.Summary,
  28. IsCreator = p.Member.IsCreator,
  29. ChannelSID = p.Member.Channel != null ? p.Member.Channel.SID : null,
  30. p.Content,
  31. p.Thumbnail,
  32. p.Images,
  33. p.Medias,
  34. p.Likes,
  35. p.Comments,
  36. p.Bookmarks,
  37. p.Views,
  38. Tags = p.FeedPostTag.Select(pt => new { pt.FeedTag.Name, pt.FeedTag.Slug }).ToList(),
  39. p.CreatedAt
  40. })
  41. .ToListAsync(ct);
  42. return new Response
  43. {
  44. Total = total,
  45. List = [..rows.Select(r => new FeedCardRow
  46. {
  47. PostID = r.ID,
  48. AuthorSID = r.AuthorSID,
  49. AuthorName = r.AuthorName,
  50. AuthorThumb = r.AuthorThumb,
  51. AuthorSummary = r.AuthorSummary,
  52. IsCreator = r.IsCreator,
  53. ChannelSID = r.ChannelSID,
  54. Subject = FeedContent.Excerpt(r.Content, 60),
  55. ContentExcerpt = FeedContent.Excerpt(r.Content, 200),
  56. Thumbnail = r.Thumbnail,
  57. Images = r.Images,
  58. Medias = r.Medias,
  59. Likes = r.Likes,
  60. Comments = r.Comments,
  61. Bookmarks = r.Bookmarks,
  62. Views = r.Views,
  63. Tags = [..r.Tags.Select(t => new FeedCardRow.TagRef { Name = t.Name, Slug = t.Slug })],
  64. CreatedAt = r.CreatedAt
  65. })]
  66. };
  67. }
  68. }