Handler.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Member.GetComments;
  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 member = await db.Member.AsNoTracking().Where(m => m.SID == request.MemberSID && !m.IsWithdraw).Select(m => new { m.ID }).FirstOrDefaultAsync(ct);
  11. if (member is null)
  12. {
  13. return Result.Failure<Response>(Error.NotFound("Member.NotFound", "회원을 찾을 수 없습니다."));
  14. }
  15. var viewerID = request.ViewerMemberID ?? 0;
  16. var isSelf = viewerID > 0 && viewerID == member.ID;
  17. var query = db.Comment.AsNoTracking()
  18. .Where(c => c.MemberID == member.ID && !c.IsDeleted);
  19. if (!isSelf)
  20. {
  21. query = query.Where(c => !c.IsSecret && !c.Post.IsSecret && !c.Post.IsAnonymous && !c.Post.IsDeleted);
  22. }
  23. var total = await query.LongCountAsync(ct);
  24. var skip = (request.Page - 1) * request.PerPage;
  25. var list = await query
  26. .OrderByDescending(c => c.CreatedAt)
  27. .Skip(skip)
  28. .Take(request.PerPage)
  29. .Select(c => new Response.Row
  30. {
  31. CommentID = c.ID,
  32. PostID = c.PostID,
  33. PostSubject = c.Post.Subject,
  34. BoardCode = c.Board.Code,
  35. BoardName = c.Board.Name,
  36. Content = c.Content,
  37. Likes = c.Likes,
  38. CreatedAt = c.CreatedAt
  39. })
  40. .ToListAsync(ct);
  41. return new Response
  42. {
  43. Total = total,
  44. List = list
  45. };
  46. }
  47. }