Handler.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Member.GetPosts;
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. private const string FeedBoardCode = "feed";
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var member = await db.Member.AsNoTracking().Where(m => m.SID == request.MemberSID && !m.IsWithdraw).Select(m => new { m.ID }).FirstOrDefaultAsync(ct);
  12. if (member is null)
  13. {
  14. return Result.Failure<Response>(Error.NotFound("Member.NotFound", "회원을 찾을 수 없습니다."));
  15. }
  16. var feedBoardID = await db.Board.AsNoTracking().Where(b => b.Code == FeedBoardCode).Select(b => (int?)b.ID).FirstOrDefaultAsync(ct);
  17. var viewerID = request.ViewerMemberID ?? 0;
  18. var isSelf = viewerID > 0 && viewerID == member.ID;
  19. var query = db.Post.AsNoTracking()
  20. .Where(p => p.MemberID == member.ID && !p.IsDeleted && p.BoardID != (feedBoardID ?? -1));
  21. if (!isSelf)
  22. {
  23. query = query.Where(p => !p.IsSecret && !p.IsAnonymous);
  24. }
  25. var total = await query.LongCountAsync(ct);
  26. var skip = (request.Page - 1) * request.PerPage;
  27. var list = await query
  28. .OrderByDescending(p => p.CreatedAt)
  29. .Skip(skip)
  30. .Take(request.PerPage)
  31. .Select(p => new Response.Row
  32. {
  33. PostID = p.ID,
  34. BoardID = p.BoardID,
  35. BoardCode = p.Board.Code,
  36. BoardName = p.Board.Name,
  37. Subject = p.Subject,
  38. Thumbnail = p.Thumbnail,
  39. Views = p.Views,
  40. Likes = p.Likes,
  41. Comments = p.Comments,
  42. CreatedAt = p.CreatedAt
  43. })
  44. .ToListAsync(ct);
  45. return new Response
  46. {
  47. Total = total,
  48. List = list
  49. };
  50. }
  51. }