using EventSubscriber.Application; using Microsoft.EntityFrameworkCore; namespace Projection.ReadModel; /// EF Core implementation of the notification log. Idempotency is enforced atomically /// by the primary key on key: a duplicate insert raises a unique violation, which is /// caught and reported as "already recorded" rather than failing the request. public sealed class EfNotificationLog(ProjectionDbContext db) : INotificationLog { public async Task TryRecordAsync(RecordedNotification notification, CancellationToken ct = default) { db.ProcessedNotifications.Add(new ProcessedNotificationRow { Key = notification.Key, Actie = notification.Actie, ZaakId = notification.ZaakId, ReceivedAt = DateTimeOffset.UtcNow, }); try { await db.SaveChangesAsync(ct); return true; } catch (DbUpdateException) { // Already recorded by an earlier (or concurrent) delivery — drop this duplicate. db.ChangeTracker.Clear(); return false; } } public async Task> AllAsync(CancellationToken ct = default) => await db.ProcessedNotifications .OrderBy(r => r.ReceivedAt) .Select(r => new RecordedNotification(r.Key, r.Actie, r.ZaakId)) .ToListAsync(ct); }