using Microsoft.EntityFrameworkCore; using SPMS.Domain.Entities; using SPMS.Domain.Enums; using SPMS.Domain.Interfaces; namespace SPMS.Infrastructure.Persistence.Repositories; public class NotificationRepository : Repository, INotificationRepository { public NotificationRepository(AppDbContext context) : base(context) { } public async Task<(IReadOnlyList Items, int TotalCount)> GetPagedAsync( long adminId, NotificationCategory? category, DateTime? from, DateTime? to, bool? isRead, int page, int size) { IQueryable query = _dbSet.Where(n => n.TargetAdminId == adminId); if (category.HasValue) query = query.Where(n => n.Category == category.Value); if (from.HasValue) query = query.Where(n => n.CreatedAt >= from.Value); if (to.HasValue) query = query.Where(n => n.CreatedAt <= to.Value); if (isRead.HasValue) query = query.Where(n => n.IsRead == isRead.Value); var totalCount = await query.CountAsync(); var items = await query .OrderByDescending(n => n.CreatedAt) .Skip((page - 1) * size) .Take(size) .ToListAsync(); return (items, totalCount); } public async Task GetUnreadCountAsync(long adminId) => await _dbSet.CountAsync(n => n.TargetAdminId == adminId && !n.IsRead); public async Task> GetRecentAsync(long adminId, int limit) => await _dbSet .Where(n => n.TargetAdminId == adminId) .OrderByDescending(n => n.CreatedAt) .Take(limit) .ToListAsync(); public async Task GetByIdAndAdminAsync(long id, long adminId) => await _dbSet.FirstOrDefaultAsync(n => n.Id == id && n.TargetAdminId == adminId); public async Task MarkAllAsReadAsync(long adminId) => await _dbSet .Where(n => n.TargetAdminId == adminId && !n.IsRead) .ExecuteUpdateAsync(s => s .SetProperty(n => n.IsRead, true) .SetProperty(n => n.ReadAt, DateTime.UtcNow)); }