using DigitalData.UserManager.Domain.Entities; using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; using Group = DigitalData.UserManager.Domain.Entities.Group; using Module = DigitalData.UserManager.Domain.Entities.Module; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; #if NET using DigitalData.EmailProfilerDispatcher; using DigitalData.EmailProfilerDispatcher.Abstraction.Entities; using DigitalData.UserManager.Infrastructure; using DigitalData.UserManager.Infrastructure.Contracts; using DigitalData.Core.Client; using EnvelopeGenerator.Application.Common.Configurations; #elif NETFRAMEWORK using System.Linq; #endif namespace EnvelopeGenerator.Infrastructure #if NET ; #elif NETFRAMEWORK { #endif public class EGDbContext : EGDbContextBase { public EGDbContext(DbContextOptions options, IOptions triggerParamOptions, ILogger #if NET ? #endif logger = null) : base(options, triggerParamOptions, logger) { } } //TODO: Adding EmailOut instead of EmailOut.Abst is not correct for the arch. Re-design EmailPut consedering this. IMailDbContext shoud move to Abstraction layer (hint: in this case using DBSet in abst. will be problem because entity framework will have to be added. public abstract class EGDbContextBase : DbContext #if NET , IUserManagerDbContext, IMailDbContext #endif { public DbSet Configs { get; set; } public DbSet EnvelopeReceivers { get; set; } public DbSet Envelopes { get; set; } public DbSet DocumentReceiverElements { get; set; } public DbSet DocumentStatus { get; set; } public DbSet EmailTemplate { get; set; } public DbSet EnvelopeDocument { get; set; } public DbSet EnvelopeHistories { get; set; } public DbSet EnvelopeTypes { get; set; } public DbSet Receivers { get; set; } public DbSet GroupOfUsers { get; set; } public DbSet Groups { get; set; } public DbSet ModuleOfUsers { get; set; } public DbSet Modules { get; set; } public DbSet Users { get; set; } public DbSet UserReps { get; set; } #if NET public DbSet EMailOuts { get; set; } #endif public DbSet EnvelopeReceiverReadOnlys { get; set; } public DbSet ClientUsers { get; set; } private readonly DbTriggerParams _triggers; private readonly ILogger #if NET ? #endif _logger; public bool IsMigration { get; set; } = false; public EGDbContextBase(DbContextOptions options, IOptions triggerParamOptions, ILogger #if NET ? #endif logger = null) : base(options) { _triggers = triggerParamOptions.Value; _logger = logger; Configs = Set(); EnvelopeReceivers = Set(); Envelopes = Set(); DocumentReceiverElements = Set(); DocumentStatus = Set(); EnvelopeDocument = Set(); EnvelopeHistories = Set(); EnvelopeTypes = Set(); Receivers = Set(); GroupOfUsers = Set(); Groups = Set(); ModuleOfUsers = Set(); Modules = Set(); Users = Set(); UserReps = Set(); #if NET EMailOuts = Set(); #endif EnvelopeReceiverReadOnlys = Set(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().HasNoKey(); #region EnvelopeReceiver modelBuilder.Entity() .HasKey(er => new { er.EnvelopeId, er.ReceiverId }); modelBuilder.Entity() .HasOne(er => er.Envelope) .WithMany(e => e.EnvelopeReceivers) .HasForeignKey(er => er.EnvelopeId); modelBuilder.Entity() .HasOne(er => er.Receiver) .WithMany(r => r.EnvelopeReceivers) .HasForeignKey(er => er.ReceiverId); #endregion EnvelopeReceiver #region Envelope modelBuilder.Entity() .HasIndex(e => e.Uuid) .IsUnique(); modelBuilder.Entity() .HasMany(e => e.Documents) .WithOne() .HasForeignKey(ed => ed.EnvelopeId); modelBuilder.Entity() .HasMany(e => e.Histories) .WithOne(h => h.Envelope) .HasForeignKey(hist => hist.EnvelopeId); #endregion Envelope #region Receiver modelBuilder.Entity() .HasIndex(e => e.Signature) .IsUnique(); modelBuilder.Entity() .HasIndex(e => e.EmailAddress) .IsUnique(); #endregion Receiver #region EnvelopeDocument modelBuilder.Entity() .HasMany(ed => ed.Elements) .WithOne(e => e.Document) .HasForeignKey(e => e.DocumentId); #endregion EnvelopeDocument #region DocumentReceiverElement modelBuilder.Entity() .HasOne(dre => dre.Document) .WithMany(ed => ed.Elements) .HasForeignKey(dre => dre.DocumentId); #endregion DocumentReceiverElement if (!IsMigration) { modelBuilder.Entity() .HasOne(eh => eh.Receiver) .WithMany() .HasForeignKey(eh => eh.UserReference) .HasPrincipalKey(e => e.EmailAddress); modelBuilder.Entity() .HasOne(eh => eh.Sender) .WithMany() .HasForeignKey(eh => eh.UserReference) .HasPrincipalKey(e => e.Email); } #region EnvelopeReceiverReadOnly modelBuilder.Entity() .HasOne(erro => erro.Receiver) .WithMany() .HasForeignKey(erro => erro.AddedWho) .HasPrincipalKey(r => r.EmailAddress); #endregion EnvelopeReceiverReadOnly #region DocumentStatus modelBuilder.Entity() .HasOne(ds => ds.Envelope) .WithMany() .HasForeignKey(ds => ds.EnvelopeId); modelBuilder.Entity() .HasOne(ds => ds.Receiver) .WithMany() .HasForeignKey(ds => ds.ReceiverId); #endregion DocumentStatus #region Trigger // Configure entities to handle database triggers void AddTrigger() where T : class => _triggers .Where(t => t.Key == typeof(T).Name) .SelectMany(t => t.Value) .ForEach(tName => { #if NET modelBuilder.Entity().ToTable(tb => tb.HasTrigger(tName)); #endif _logger?.LogInformation("Trigger '{triggerName}' has been added to the '{entityName}' entity.", tName, typeof(T).Name); }); // TODO: call add trigger methods with attributes and reflection AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); AddTrigger(); #if NET AddTrigger(); #endif #endregion Trigger //configure model builder for user manager tables #if NET modelBuilder.ConfigureUserManager(); #endif base.OnModelCreating(modelBuilder); } } #if NETFRAMEWORK } #endif