Handler.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Note.GetInbox;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.Note.AsNoTracking()
  10. .Where(n => n.ReceiverMemberID == request.MemberID && !n.IsDeletedByReceiver);
  11. if (request.IsRead.HasValue)
  12. {
  13. query = query.Where(n => n.IsRead == request.IsRead.Value);
  14. }
  15. var total = await query.CountAsync(ct);
  16. var unread = await db.Note.AsNoTracking()
  17. .CountAsync(n => n.ReceiverMemberID == request.MemberID && !n.IsDeletedByReceiver && !n.IsRead, ct);
  18. var list = await query
  19. .OrderByDescending(n => n.CreatedAt)
  20. .Skip((request.PageNum - 1) * request.PerPage)
  21. .Take(request.PerPage)
  22. .Select(n => new NoteItem(
  23. n.ID, n.SenderMemberID,
  24. n.SenderMemberID == 0 ? "시스템" : (n.Sender != null ? n.Sender.Name : null),
  25. n.Title, n.IsRead, n.IsSystem, n.CreatedAt
  26. ))
  27. .ToListAsync(ct);
  28. return new Response(total, unread, list);
  29. }
  30. }