From f9c34ef8fdcca49a5d2ce860a0faed1a2ce03dfe Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 12 Feb 2025 21:11:08 +0100 Subject: [PATCH] =?UTF-8?q?refactor(EGDbContext):=20AddTrigger=20zur=20Kon?= =?UTF-8?q?figuration=20von=20Triggern=20=C3=BCber=20appsettings.json=20er?= =?UTF-8?q?stellt=20und=20implementiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EGDbContext.cs | 265 ++++++++++-------- 1 file changed, 150 insertions(+), 115 deletions(-) diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index e9a08d14..673777c2 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -7,145 +7,180 @@ 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 UserReceivers { get; set; } - - public DbSet Configs { get; set; } - - public DbSet EnvelopeReceivers { get; set; } - - public DbSet Envelopes { get; set; } - - public DbSet DocumentReceiverElements { get; set; } +namespace EnvelopeGenerator.Infrastructure; - public DbSet DocumentStatus { get; set; } - - public DbSet EmailTemplate { get; set; } +//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 UserReceivers { get; set; } - public DbSet EnvelopeCertificates { get; set; } + public DbSet Configs { get; set; } - public DbSet EnvelopeDocument { get; set; } + public DbSet EnvelopeReceivers { get; set; } - public DbSet EnvelopeHistories { get; set; } + public DbSet Envelopes { get; set; } - public DbSet EnvelopeTypes { get; set; } + public DbSet DocumentReceiverElements { get; set; } - public DbSet Receivers { get; set; } + public DbSet DocumentStatus { get; set; } - public DbSet GroupOfUsers { get; set; } + public DbSet EmailTemplate { get; set; } - public DbSet Groups { get; set; } + public DbSet EnvelopeCertificates { get; set; } - public DbSet ModuleOfUsers { get; set; } + public DbSet EnvelopeDocument { get; set; } - public DbSet Modules { get; set; } + public DbSet EnvelopeHistories { get; set; } - public DbSet Users { get; set; } + public DbSet EnvelopeTypes { get; set; } - public DbSet UserReps { get; set; } + public DbSet Receivers { get; set; } - public DbSet EMailOuts { get; set; } + public DbSet GroupOfUsers { get; set; } - public DbSet EnvelopeReceiverReadOnlys { get; set; } + public DbSet Groups { get; set; } - public EGDbContext(DbContextOptions options) : base(options) - { - UserReceivers = Set(); - Configs = Set(); - EnvelopeReceivers = Set(); - Envelopes = Set(); - DocumentReceiverElements = Set(); - DocumentStatus = Set(); - EnvelopeCertificates = Set(); - EnvelopeDocument = Set(); - EnvelopeHistories = Set(); - EnvelopeTypes = Set(); - Receivers = Set(); + public DbSet ModuleOfUsers { get; set; } - GroupOfUsers = Set(); - Groups = Set(); - ModuleOfUsers = Set(); - Modules = Set(); - Users = Set(); - UserReps = Set(); - EMailOuts = Set(); - EnvelopeReceiverReadOnlys = Set(); - } + public DbSet Modules { get; set; } - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity().HasNoKey(); + public DbSet Users { get; set; } - modelBuilder.Entity() - .HasKey(er => new { er.EnvelopeId, er.ReceiverId }); + public DbSet UserReps { get; set; } - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); - modelBuilder.Entity(); + public DbSet EMailOuts { get; set; } - // Configure the one-to-many relationship of Envelope - modelBuilder.Entity() - .HasMany(e => e.Documents) - .WithOne() - .HasForeignKey(ed => ed.EnvelopeId); + public DbSet EnvelopeReceiverReadOnlys { get; set; } - modelBuilder.Entity() - .HasMany(e => e.History) - .WithOne() - .HasForeignKey(eh => eh.EnvelopeId); + private readonly DbTriggerParams _triggers; - modelBuilder.Entity() - .HasMany(ed => ed.Elements) - .WithOne(e => e.Document) - .HasForeignKey(e => e.DocumentId); + private readonly ILogger _logger; - modelBuilder.Entity() - .HasOne(dre => dre.Document) - .WithMany(ed => ed.Elements) - .HasForeignKey(dre => dre.DocumentId); + public EGDbContext(DbContextOptions options, IOptions triggerParamOptions, ILogger logger) : base(options) + { + _triggers = triggerParamOptions.Value; + _logger = logger; + + UserReceivers = Set(); + Configs = Set(); + EnvelopeReceivers = Set(); + Envelopes = Set(); + DocumentReceiverElements = Set(); + DocumentStatus = Set(); + EnvelopeCertificates = Set(); + EnvelopeDocument = Set(); + EnvelopeHistories = Set(); + EnvelopeTypes = Set(); + Receivers = Set(); + + GroupOfUsers = Set(); + Groups = Set(); + ModuleOfUsers = Set(); + Modules = Set(); + Users = Set(); + UserReps = Set(); + EMailOuts = Set(); + EnvelopeReceiverReadOnlys = Set(); + } - 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); - - modelBuilder.Entity() - .HasOne(erro => erro.Receiver) - .WithMany() - .HasForeignKey(erro => erro.AddedWho) - .HasPrincipalKey(r => r.EmailAddress); - - // Configure entities to handle database triggers - modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_HISTORY_AFT_INS")); - modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_HISTORY_AFT_INS")); - modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBEMLP_EMAIL_OUT_AFT_INS")); - modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBEMLP_EMAIL_OUT_AFT_UPD")); - modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_RECEIVER_READ_ONLY_UPD")); - - //configure model builder for user manager tables - modelBuilder.ConfigureUserManager(); - - base.OnModelCreating(modelBuilder); - } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasNoKey(); + + modelBuilder.Entity() + .HasKey(er => new { er.EnvelopeId, er.ReceiverId }); + + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + modelBuilder.Entity(); + + // Configure the one-to-many relationship of Envelope + modelBuilder.Entity() + .HasMany(e => e.Documents) + .WithOne() + .HasForeignKey(ed => ed.EnvelopeId); + + modelBuilder.Entity() + .HasMany(e => e.History) + .WithOne() + .HasForeignKey(eh => eh.EnvelopeId); + + modelBuilder.Entity() + .HasMany(ed => ed.Elements) + .WithOne(e => e.Document) + .HasForeignKey(e => e.DocumentId); + + modelBuilder.Entity() + .HasOne(dre => dre.Document) + .WithMany(ed => ed.Elements) + .HasForeignKey(dre => dre.DocumentId); + + 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); + + modelBuilder.Entity() + .HasOne(erro => erro.Receiver) + .WithMany() + .HasForeignKey(erro => erro.AddedWho) + .HasPrincipalKey(r => r.EmailAddress); + + // Configure entities to handle database triggers + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_HISTORY_AFT_INS")); + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_HISTORY_AFT_INS")); + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBEMLP_EMAIL_OUT_AFT_INS")); + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBEMLP_EMAIL_OUT_AFT_UPD")); + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_RECEIVER_READ_ONLY_UPD")); + + void AddTrigger() where T : class => _triggers + .Where(t => t.Key == typeof(T).Name) + .SelectMany(t => t.Value) + .ForEach(tName => + { + modelBuilder.Entity().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(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + AddTrigger(); + + //configure model builder for user manager tables + modelBuilder.ConfigureUserManager(); + + base.OnModelCreating(modelBuilder); } } \ No newline at end of file