using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Forum.PostCheer.Get; /// 글의 응원 합계·건수 + 최근 N건 조회 — D3 M4 (익명 허용). 응원은 열람 조건이 아니므로 공개 표시. public sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { var take = Math.Clamp(request.Take <= 0 ? 20 : request.Take, 1, 100); var agg = await db.PostCheer.AsNoTracking() .Where(c => c.PostID == request.PostID) .GroupBy(c => 1) .Select(g => new { TotalAmount = g.Sum(c => (long)c.Amount), Count = g.Count() }) .FirstOrDefaultAsync(ct); var recent = await db.PostCheer.AsNoTracking() .Where(c => c.PostID == request.PostID) .OrderByDescending(c => c.CreatedAt) .Take(take) .Select(c => new Response.Item { ID = c.ID, FromMemberID = c.FromMemberID, FromNickname = c.FromMember != null ? c.FromMember.Name : null, Amount = c.Amount, Message = c.Message, CreatedAt = c.CreatedAt }) .ToListAsync(ct); return Result.Success(new Response { TotalAmount = agg?.TotalAmount ?? 0, Count = agg?.Count ?? 0, Recent = recent }); } }