using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; using SPMS.Domain.Entities; using SPMS.Domain.Interfaces; namespace SPMS.Infrastructure.Persistence.Repositories; public class MessageRepository : Repository, IMessageRepository { public MessageRepository(AppDbContext context) : base(context) { } public async Task GetByMessageCodeAsync(string messageCode) { return await _dbSet .FirstOrDefaultAsync(m => m.MessageCode == messageCode && !m.IsDeleted); } public async Task GetByMessageCodeAndServiceAsync(string messageCode, long serviceId) { return await _dbSet .FirstOrDefaultAsync(m => m.MessageCode == messageCode && m.ServiceId == serviceId && !m.IsDeleted); } public async Task GetTodaySequenceAsync(long serviceId) { var todayStart = DateTime.UtcNow.Date; var todayEnd = todayStart.AddDays(1); return await _dbSet .CountAsync(m => m.ServiceId == serviceId && m.CreatedAt >= todayStart && m.CreatedAt < todayEnd); } public async Task<(IReadOnlyList Items, int TotalCount)> GetPagedByServiceAsync( long serviceId, int page, int size, Expression>? predicate = null) { var query = _dbSet .Where(m => m.ServiceId == serviceId && !m.IsDeleted); if (predicate != null) query = query.Where(predicate); var totalCount = await query.CountAsync(); var items = await query .OrderByDescending(m => m.CreatedAt) .Skip((page - 1) * size) .Take(size) .ToListAsync(); return (items, totalCount); } }