using HrynCo.NotificationService.DAL.Abstract.Repositories; using HrynCo.NotificationService.DAL.EF.Core; using HrynCo.NotificationService.DAL.EF.Entities; using Microsoft.EntityFrameworkCore; namespace HrynCo.NotificationService.DAL.EF.Repositories; internal sealed class EmailChannelUsageRepository : EfRepository, IEmailChannelUsageRepository { public EmailChannelUsageRepository(NotificationDbContext dbContext) : base(dbContext) { } public async Task GetDailyCountAsync(Guid providerId, DateOnly date, CancellationToken ct = default) { EmailChannelUsageEntity? entity = await DbSet .FirstOrDefaultAsync(x => x.ProviderId == providerId && x.Date == date, ct); return entity?.SentCount ?? 0; } public async Task GetMonthlyCountAsync(Guid providerId, int year, int month, CancellationToken ct = default) { return await DbSet .Where(x => x.ProviderId == providerId && x.Date.Year == year && x.Date.Month == month) .SumAsync(x => x.SentCount, ct); } public async Task IncrementUsageAsync(Guid providerId, DateOnly date, CancellationToken ct = default) { EmailChannelUsageEntity? entity = await DbSet .FirstOrDefaultAsync(x => x.ProviderId == providerId && x.Date == date, ct); if (entity is null) await AddAsync(new EmailChannelUsageEntity { ProviderId = providerId, Date = date, SentCount = 1 }, ct); else { entity.SentCount++; Update(entity); } } }