using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Member.GetPosts; public sealed class Handler(IAppDbContext db) : IQueryHandler> { private const string FeedBoardCode = "feed"; 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 feedBoardID = await db.Board.AsNoTracking().Where(b => b.Code == FeedBoardCode).Select(b => (int?)b.ID).FirstOrDefaultAsync(ct); var viewerID = request.ViewerMemberID ?? 0; var isSelf = viewerID > 0 && viewerID == member.ID; var query = db.Post.AsNoTracking() .Where(p => p.MemberID == member.ID && !p.IsDeleted && p.BoardID != (feedBoardID ?? -1)); if (!isSelf) { query = query.Where(p => !p.IsSecret && !p.IsAnonymous); } var total = await query.LongCountAsync(ct); var skip = (request.Page - 1) * request.PerPage; var list = await query .OrderByDescending(p => p.CreatedAt) .Skip(skip) .Take(request.PerPage) .Select(p => new Response.Row { PostID = p.ID, BoardID = p.BoardID, BoardCode = p.Board.Code, BoardName = p.Board.Name, Subject = p.Subject, Thumbnail = p.Thumbnail, Views = p.Views, Likes = p.Likes, Comments = p.Comments, CreatedAt = p.CreatedAt }) .ToListAsync(ct); return new Response { Total = total, List = list }; } }