using System.Text.Json; using Femto.Common.Integration; using Femto.Modules.Media.Data; using Microsoft.EntityFrameworkCore; namespace Femto.Modules.Media.Infrastructure.Integration; internal class Outbox(MediaContext context) { public async Task AddMessage(Guid aggregateId, TMessage message, CancellationToken cancellationToken) where TMessage : IIntegrationEvent { await context.Outbox.AddAsync( new( message.EventId, aggregateId, typeof(TMessage).Name, JsonSerializer.Serialize(message) ), cancellationToken ); } public async Task> GetPendingMessages(CancellationToken cancellationToken) { var now = DateTime.UtcNow; return await context .Outbox.Where(message => message.Status == OutboxEntryStatus.Pending) .Where(message => message.NextRetryAt == null || message.NextRetryAt <= now) .OrderBy(message => message.CreatedAt) .ToListAsync(cancellationToken); } }