Handler.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Feed.GetReplies;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var postExists = await db.FeedPost.AsNoTracking().AnyAsync(p => p.ID == request.PostID && !p.IsDeleted, ct);
  10. if (!postExists)
  11. {
  12. return new Response { Total = 0, List = [] };
  13. }
  14. var query = db.FeedComment.AsNoTracking().Where(c => c.FeedPostID == request.PostID);
  15. var total = await query.LongCountAsync(ct);
  16. var skip = (request.Page - 1) * request.PerPage;
  17. var rows = await query
  18. .OrderBy(c => c.CreatedAt)
  19. .Skip(skip)
  20. .Take(request.PerPage)
  21. .Select(c => new
  22. {
  23. c.ID,
  24. c.ParentID,
  25. ParentAuthorSID = c.Parent != null ? c.Parent.Member.SID : null,
  26. ParentAuthorName = c.Parent != null ? c.Parent.Member.Name : null,
  27. c.Content,
  28. c.IsDeleted,
  29. c.MemberID,
  30. AuthorSID = c.Member.SID,
  31. AuthorName = c.Member.Name,
  32. AuthorThumb = c.Member.Thumb,
  33. IsCreator = c.Member.IsCreator,
  34. c.Likes,
  35. c.CreatedAt
  36. })
  37. .ToListAsync(ct);
  38. var viewerID = request.ViewerMemberID;
  39. var commentIDs = rows.Select(r => r.ID).ToList();
  40. var likedSet = new HashSet<int>();
  41. if (viewerID is int vid && vid > 0 && commentIDs.Count > 0)
  42. {
  43. likedSet = [..await db.FeedCommentLike.AsNoTracking()
  44. .Where(r => r.MemberID == vid && commentIDs.Contains(r.FeedCommentID))
  45. .Select(r => r.FeedCommentID)
  46. .ToListAsync(ct)];
  47. }
  48. return new Response
  49. {
  50. Total = total,
  51. List = [..rows.Select(r => new Response.Row
  52. {
  53. ID = r.ID,
  54. ParentID = r.ParentID,
  55. ParentAuthorSID = r.ParentAuthorSID,
  56. ParentAuthorName = r.ParentAuthorName,
  57. Content = r.IsDeleted ? string.Empty : r.Content,
  58. IsDeleted = r.IsDeleted,
  59. AuthorSID = r.AuthorSID,
  60. AuthorName = r.AuthorName,
  61. AuthorThumb = r.AuthorThumb,
  62. IsCreator = r.IsCreator,
  63. Likes = r.Likes,
  64. HasLike = likedSet.Contains(r.ID),
  65. IsOwner = viewerID is int v && v > 0 && r.MemberID == v,
  66. CreatedAt = r.CreatedAt
  67. })]
  68. };
  69. }
  70. }