Handler.cs 2.9 KB

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