using MongoDB.Driver;
using Nalu.Web.Data.Models;
namespace Nalu.Web.Data.Repositories;
public class WebhookEventRepository(MongoDbContext db)
{
///
/// Attempts to record a Stripe event for idempotency.
/// Returns true if inserted (first time seen), false if already processed.
///
public async Task TryInsertAsync(string stripeEventId, string eventType, CancellationToken ct = default)
{
if (!db.IsConnected) return true; // fallback: allow processing if DB unavailable
try
{
await db.WebhookEvents.InsertOneAsync(new WebhookEvent
{
StripeEventId = stripeEventId,
EventType = eventType
}, cancellationToken: ct);
return true;
}
catch (MongoWriteException ex) when (ex.WriteError.Category == ServerErrorCategory.DuplicateKey)
{
return false;
}
}
public async Task ExistsAsync(string stripeEventId, CancellationToken ct = default)
{
if (!db.IsConnected) return false;
return await db.WebhookEvents
.Find(w => w.StripeEventId == stripeEventId)
.AnyAsync(ct);
}
}