using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using MassTransit; using Musify.Application.Contracts.Infrastructure; using Musify.Domain.Entities; using Musify.Infrastructure.Configuration; using AppIDatabase = Musify.Application.Contracts.Infrastructure.IDatabase; namespace Musify.Infrastructure.Persistence { public class Database(DatabaseConfiguration configuration) : DbContext, AppIDatabase { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(configuration.ConnectionString); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.AddInboxStateEntity(); modelBuilder.AddOutboxMessageEntity(); modelBuilder.AddOutboxStateEntity(); } public DbSet Users => Set(); public DbSet Tracks => Set(); public DbSet PlayLists => Set(); public DbSet UserHasTracks => Set(); public DbSet PlayListHasTracks => Set(); public DbSet Uploads => Set(); public DbSet UploadIntents => Set(); public async Task BeginTransactionAsync(System.Data.IsolationLevel isolationLevel, CancellationToken cancellationToken) { var transaction = await Database.BeginTransactionAsync(isolationLevel, cancellationToken); return new DatabaseTransaction(transaction); } private sealed class DatabaseTransaction(IDbContextTransaction inner) : IDatabaseTransaction { public Task CommitAsync(CancellationToken cancellationToken = default) => inner.CommitAsync(cancellationToken); public ValueTask DisposeAsync() => inner.DisposeAsync(); } } }