Handler.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Feed.GetPost;
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  9. {
  10. var post = await db.FeedPost.AsNoTracking()
  11. .Where(p => p.ID == request.PostID && !p.IsDeleted)
  12. .Select(p => new
  13. {
  14. p.ID,
  15. p.MemberID,
  16. AuthorSID = p.Member.SID,
  17. AuthorName = p.Member.Name,
  18. AuthorThumb = p.Member.Thumb,
  19. IsCreator = p.Member.IsCreator,
  20. ChannelSID = p.Member.Channel != null ? p.Member.Channel.SID : null,
  21. p.Content,
  22. Images = p.FeedPostImage.OrderBy(i => i.ID).Select(i => new { i.Url, i.Width, i.Height }).ToList(),
  23. Medias = p.FeedPostMedia.OrderBy(m => m.ID).Select(m => m.Url).ToList(),
  24. p.Likes,
  25. p.Comments,
  26. p.Bookmarks,
  27. p.Views,
  28. Tags = p.FeedPostTag.Select(pt => new { pt.FeedTag.Name, pt.FeedTag.Slug }).ToList(),
  29. p.CreatedAt
  30. })
  31. .FirstOrDefaultAsync(ct);
  32. if (post is null)
  33. {
  34. return Result.Failure<Response>(Error.NotFound("Feed.PostNotFound", "게시글을 찾을 수 없습니다."));
  35. }
  36. var hasLike = false;
  37. var hasBookmark = false;
  38. if (request.ViewerMemberID is int viewerID && viewerID > 0)
  39. {
  40. hasLike = await db.FeedLike.AsNoTracking().AnyAsync(l => l.FeedPostID == post.ID && l.MemberID == viewerID, ct);
  41. hasBookmark = await db.FeedBookmark.AsNoTracking().AnyAsync(b => b.FeedPostID == post.ID && b.MemberID == viewerID, ct);
  42. }
  43. return new Response
  44. {
  45. PostID = post.ID,
  46. AuthorSID = post.AuthorSID,
  47. AuthorName = post.AuthorName,
  48. AuthorThumb = post.AuthorThumb,
  49. IsCreator = post.IsCreator,
  50. ChannelSID = post.ChannelSID,
  51. Content = post.Content,
  52. Images = [..post.Images.Select(i => new Response.ImageItem { Url = i.Url, Width = i.Width, Height = i.Height })],
  53. Medias = [..post.Medias],
  54. Likes = post.Likes,
  55. Comments = post.Comments,
  56. Bookmarks = post.Bookmarks,
  57. Views = post.Views,
  58. Tags = [..post.Tags.Select(t => new Response.TagRef { Name = t.Name, Slug = t.Slug })],
  59. CreatedAt = post.CreatedAt,
  60. HasLike = hasLike,
  61. HasBookmark = hasBookmark,
  62. IsOwner = request.ViewerMemberID is int vID && vID > 0 && post.MemberID == vID
  63. };
  64. }
  65. }