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
});
}
}