using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Member.GetComments; public sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { var member = await db.Member.AsNoTracking().Where(m => m.SID == request.MemberSID && !m.IsWithdraw).Select(m => new { m.ID }).FirstOrDefaultAsync(ct); if (member is null) { return Result.Failure(Error.NotFound("Member.NotFound", "회원을 찾을 수 없습니다.")); } var viewerID = request.ViewerMemberID ?? 0; var isSelf = viewerID > 0 && viewerID == member.ID; var query = db.Comment.AsNoTracking() .Where(c => c.MemberID == member.ID && !c.IsDeleted); if (!isSelf) { query = query.Where(c => !c.IsSecret && !c.Post.IsSecret && !c.Post.IsAnonymous && !c.Post.IsDeleted); } var total = await query.LongCountAsync(ct); var skip = (request.Page - 1) * request.PerPage; var list = await query .OrderByDescending(c => c.CreatedAt) .Skip(skip) .Take(request.PerPage) .Select(c => new Response.Row { CommentID = c.ID, PostID = c.PostID, PostSubject = c.Post.Subject, BoardCode = c.Board.Code, BoardName = c.Board.Name, Content = c.Content, Likes = c.Likes, CreatedAt = c.CreatedAt }) .ToListAsync(ct); return new Response { Total = total, List = list }; } }