using IdentityShroud.Core.Model; using IdentityShroud.Core.Security; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace IdentityShroud.Core; public class DbConfiguration { public string ConnectionString { get; set; } = ""; public bool LogSensitiveData { get; set; } = false; } public class Db( IOptions configuration, ILoggerFactory? loggerFactory) : DbContext { public virtual DbSet Clients { get; set; } public virtual DbSet Realms { get; set; } public virtual DbSet Keys { get; set; } public virtual DbSet Deks { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { var dekIdConverter = new ValueConverter( id => id.Id, guid => new DekId(guid)); var kekIdConverter = new ValueConverter( id => id.Id, guid => new KekId(guid)); modelBuilder.Entity() .Property(d => d.Id) .HasConversion(dekIdConverter); modelBuilder.Entity() .OwnsOne(d => d.KeyData, keyData => { keyData.Property(k => k.KekId).HasConversion(kekIdConverter); }); modelBuilder.Entity() .OwnsOne(k => k.Key, key => { key.Property(k => k.KekId).HasConversion(kekIdConverter); }); modelBuilder.Entity() .OwnsOne(c => c.Secret, secret => { secret.Property(s => s.DekId).HasConversion(dekIdConverter); }); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(""); optionsBuilder.UseNpgsql( configuration.Value.ConnectionString, o => o.MigrationsAssembly("IdentityShroud.Migrations")); // , o => o.UseNodaTime().UseVector().MigrationsAssembly("Migrations.KnowledgeBaseDB")); optionsBuilder.UseSnakeCaseNamingConvention(); if (configuration.Value.LogSensitiveData) optionsBuilder.EnableSensitiveDataLogging(); if (loggerFactory is { } ) { optionsBuilder.UseLoggerFactory(loggerFactory); } } }