| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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<Query, Result<Response>>
- {
- private const string FeedBoardCode = "feed";
- public async Task<Result<Response>> 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<Response>(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
- };
- }
- }
|