Handler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Forum.PostCheer.Get;
  6. /// <summary>글의 응원 합계·건수 + 최근 N건 조회 — D3 M4 (익명 허용). 응원은 열람 조건이 아니므로 공개 표시.</summary>
  7. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  8. {
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var take = Math.Clamp(request.Take <= 0 ? 20 : request.Take, 1, 100);
  12. var agg = await db.PostCheer.AsNoTracking()
  13. .Where(c => c.PostID == request.PostID)
  14. .GroupBy(c => 1)
  15. .Select(g => new
  16. {
  17. TotalAmount = g.Sum(c => (long)c.Amount),
  18. Count = g.Count()
  19. })
  20. .FirstOrDefaultAsync(ct);
  21. var recent = await db.PostCheer.AsNoTracking()
  22. .Where(c => c.PostID == request.PostID)
  23. .OrderByDescending(c => c.CreatedAt)
  24. .Take(take)
  25. .Select(c => new Response.Item
  26. {
  27. ID = c.ID,
  28. FromMemberID = c.FromMemberID,
  29. FromNickname = c.FromMember != null ? c.FromMember.Name : null,
  30. Amount = c.Amount,
  31. Message = c.Message,
  32. CreatedAt = c.CreatedAt
  33. })
  34. .ToListAsync(ct);
  35. return Result.Success(new Response
  36. {
  37. TotalAmount = agg?.TotalAmount ?? 0,
  38. Count = agg?.Count ?? 0,
  39. Recent = recent
  40. });
  41. }
  42. }