Removed Sender and Receiver properties from EnvelopeHistory. Added ActionDate and Comment properties. Introduced IsMigration property in EGDbContext to conditionally configure foreign key relationships for EnvelopeHistory. Updated EGDbContextFactory to set IsMigration during context creation for migration operations.
182 lines
6.6 KiB
C#
182 lines
6.6 KiB
C#
using DigitalData.EmailProfilerDispatcher.Abstraction.Entities;
|
|
using DigitalData.UserManager.Domain.Entities;
|
|
using DigitalData.UserManager.Infrastructure;
|
|
using DigitalData.UserManager.Infrastructure.Contracts;
|
|
using EnvelopeGenerator.Domain.Entities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Group = DigitalData.UserManager.Domain.Entities.Group;
|
|
using Module = DigitalData.UserManager.Domain.Entities.Module;
|
|
using DigitalData.EmailProfilerDispatcher;
|
|
using Microsoft.Extensions.Options;
|
|
using EnvelopeGenerator.Application.Configurations;
|
|
using DigitalData.Core.Client;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace EnvelopeGenerator.Infrastructure;
|
|
|
|
//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 class EGDbContext : DbContext, IUserManagerDbContext, IMailDbContext
|
|
{
|
|
public DbSet<Config> Configs { get; set; }
|
|
|
|
public DbSet<EnvelopeReceiver> EnvelopeReceivers { get; set; }
|
|
|
|
public DbSet<Envelope> Envelopes { get; set; }
|
|
|
|
public DbSet<DocumentReceiverElement> DocumentReceiverElements { get; set; }
|
|
|
|
public DbSet<DocumentStatus> DocumentStatus { get; set; }
|
|
|
|
public DbSet<EmailTemplate> EmailTemplate { get; set; }
|
|
|
|
public DbSet<EnvelopeCertificate> EnvelopeCertificates { get; set; }
|
|
|
|
public DbSet<EnvelopeDocument> EnvelopeDocument { get; set; }
|
|
|
|
public DbSet<EnvelopeHistory> EnvelopeHistories { get; set; }
|
|
|
|
public DbSet<EnvelopeType> EnvelopeTypes { get; set; }
|
|
|
|
public DbSet<Receiver> Receivers { get; set; }
|
|
|
|
public DbSet<GroupOfUser> GroupOfUsers { get; set; }
|
|
|
|
public DbSet<Group> Groups { get; set; }
|
|
|
|
public DbSet<ModuleOfUser> ModuleOfUsers { get; set; }
|
|
|
|
public DbSet<Module> Modules { get; set; }
|
|
|
|
public DbSet<User> Users { get; set; }
|
|
|
|
public DbSet<UserRep> UserReps { get; set; }
|
|
|
|
public DbSet<EmailOut> EMailOuts { get; set; }
|
|
|
|
public DbSet<EnvelopeReceiverReadOnly> EnvelopeReceiverReadOnlys { get; set; }
|
|
|
|
public DbSet<ClientUser> ClientUsers { get; set; }
|
|
|
|
private readonly DbTriggerParams _triggers;
|
|
|
|
private readonly ILogger<EGDbContext>? _logger;
|
|
|
|
public bool IsMigration { get; set; } = false;
|
|
|
|
public EGDbContext(DbContextOptions<EGDbContext> options, IOptions<DbTriggerParams> triggerParamOptions, ILogger<EGDbContext>? logger = null) : base(options)
|
|
{
|
|
_triggers = triggerParamOptions.Value;
|
|
_logger = logger;
|
|
|
|
Configs = Set<Config>();
|
|
EnvelopeReceivers = Set<EnvelopeReceiver>();
|
|
Envelopes = Set<Envelope>();
|
|
DocumentReceiverElements = Set<DocumentReceiverElement>();
|
|
DocumentStatus = Set<DocumentStatus>();
|
|
EnvelopeCertificates = Set<EnvelopeCertificate>();
|
|
EnvelopeDocument = Set<EnvelopeDocument>();
|
|
EnvelopeHistories = Set<EnvelopeHistory>();
|
|
EnvelopeTypes = Set<EnvelopeType>();
|
|
Receivers = Set<Receiver>();
|
|
|
|
GroupOfUsers = Set<GroupOfUser>();
|
|
Groups = Set<Group>();
|
|
ModuleOfUsers = Set<ModuleOfUser>();
|
|
Modules = Set<Module>();
|
|
Users = Set<User>();
|
|
UserReps = Set<UserRep>();
|
|
EMailOuts = Set<EmailOut>();
|
|
EnvelopeReceiverReadOnlys = Set<EnvelopeReceiverReadOnly>();
|
|
}
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
{
|
|
modelBuilder.Entity<Config>().HasNoKey();
|
|
|
|
modelBuilder.Entity<EnvelopeReceiver>()
|
|
.HasKey(er => new { er.EnvelopeId, er.ReceiverId });
|
|
|
|
modelBuilder.Entity<EnvelopeDocument>();
|
|
modelBuilder.Entity<DocumentReceiverElement>();
|
|
modelBuilder.Entity<DocumentStatus>();
|
|
modelBuilder.Entity<EmailTemplate>();
|
|
modelBuilder.Entity<Envelope>();
|
|
modelBuilder.Entity<EnvelopeCertificate>();
|
|
modelBuilder.Entity<EnvelopeHistory>();
|
|
modelBuilder.Entity<EnvelopeType>();
|
|
modelBuilder.Entity<Receiver>();
|
|
modelBuilder.Entity<EmailOut>();
|
|
|
|
// Configure the one-to-many relationship of Envelope
|
|
modelBuilder.Entity<Envelope>()
|
|
.HasMany(e => e.Documents)
|
|
.WithOne()
|
|
.HasForeignKey(ed => ed.EnvelopeId);
|
|
|
|
modelBuilder.Entity<Envelope>()
|
|
.HasMany(e => e.History)
|
|
.WithOne()
|
|
.HasForeignKey(eh => eh.EnvelopeId);
|
|
|
|
modelBuilder.Entity<EnvelopeDocument>()
|
|
.HasMany(ed => ed.Elements)
|
|
.WithOne(e => e.Document)
|
|
.HasForeignKey(e => e.DocumentId);
|
|
|
|
modelBuilder.Entity<DocumentReceiverElement>()
|
|
.HasOne(dre => dre.Document)
|
|
.WithMany(ed => ed.Elements)
|
|
.HasForeignKey(dre => dre.DocumentId);
|
|
|
|
if (!IsMigration)
|
|
{
|
|
modelBuilder.Entity<EnvelopeHistory>()
|
|
.HasOne(eh => eh.Receiver)
|
|
.WithMany()
|
|
.HasForeignKey(eh => eh.UserReference)
|
|
.HasPrincipalKey(e => e.EmailAddress);
|
|
|
|
modelBuilder.Entity<EnvelopeHistory>()
|
|
.HasOne(eh => eh.Sender)
|
|
.WithMany()
|
|
.HasForeignKey(eh => eh.UserReference)
|
|
.HasPrincipalKey(e => e.Email);
|
|
}
|
|
|
|
modelBuilder.Entity<EnvelopeReceiverReadOnly>()
|
|
.HasOne(erro => erro.Receiver)
|
|
.WithMany()
|
|
.HasForeignKey(erro => erro.AddedWho)
|
|
.HasPrincipalKey(r => r.EmailAddress);
|
|
|
|
// Configure entities to handle database triggers
|
|
void AddTrigger<T>() where T : class => _triggers
|
|
.Where(t => t.Key == typeof(T).Name)
|
|
.SelectMany(t => t.Value)
|
|
.ForEach(tName =>
|
|
{
|
|
modelBuilder.Entity<T>().ToTable(tb => tb.HasTrigger(tName));
|
|
_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<Config>();
|
|
AddTrigger<DocumentReceiverElement>();
|
|
AddTrigger<DocumentStatus>();
|
|
AddTrigger<EmailTemplate>();
|
|
AddTrigger<Envelope>();
|
|
AddTrigger<EnvelopeCertificate>();
|
|
AddTrigger<EnvelopeDocument>();
|
|
AddTrigger<EnvelopeHistory>();
|
|
AddTrigger<EnvelopeReceiver>();
|
|
AddTrigger<EnvelopeReceiverReadOnly>();
|
|
AddTrigger<EnvelopeType>();
|
|
AddTrigger<Receiver>();
|
|
AddTrigger<EmailOut>();
|
|
|
|
//configure model builder for user manager tables
|
|
modelBuilder.ConfigureUserManager();
|
|
|
|
base.OnModelCreating(modelBuilder);
|
|
}
|
|
} |