Handler.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Notification.GetList;
  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.Notification.AsNoTracking().Where(n => n.MemberID == request.MemberID);
  10. if (request.Type.HasValue)
  11. {
  12. query = query.Where(n => n.Type == request.Type.Value);
  13. }
  14. var total = await query.CountAsync(ct);
  15. var unread = await db.Notification.AsNoTracking()
  16. .CountAsync(n => n.MemberID == request.MemberID && !n.IsRead, ct);
  17. var list = await query
  18. .OrderByDescending(n => n.CreatedAt)
  19. .Skip((request.PageNum - 1) * request.PerPage)
  20. .Take(request.PerPage)
  21. .Select(n => new NotificationItem(
  22. n.ID, n.Type, n.Title, n.Message,
  23. n.IsRead, n.ActionUrl, n.ImageUrl, n.CreatedAt
  24. ))
  25. .ToListAsync(ct);
  26. return new Response(total, unread, list);
  27. }
  28. }