From c64f350f3655ef9f78a9b048020111a027b0788c Mon Sep 17 00:00:00 2001 From: Charles Nurse Date: Sat, 6 Mar 2021 16:06:29 -0800 Subject: [PATCH] Create new DbContextUtils class and move common SaveChanges code to this class. While MasterDbContext has no entities that support IDeletable it does not hurt to check and minimizes duplication --- .../Repository/Context/DBContextBase.cs | 49 +------------- .../Repository/Context/DbContextUtils.cs | 65 +++++++++++++++++++ .../Repository/Context/MasterDBContext.cs | 33 +--------- 3 files changed, 67 insertions(+), 80 deletions(-) create mode 100644 Oqtane.Server/Repository/Context/DbContextUtils.cs diff --git a/Oqtane.Server/Repository/Context/DBContextBase.cs b/Oqtane.Server/Repository/Context/DBContextBase.cs index e8dc5894..9d488f45 100644 --- a/Oqtane.Server/Repository/Context/DBContextBase.cs +++ b/Oqtane.Server/Repository/Context/DBContextBase.cs @@ -34,54 +34,7 @@ namespace Oqtane.Repository public override int SaveChanges() { - ChangeTracker.DetectChanges(); - - string username = ""; - if (_accessor.HttpContext != null && _accessor.HttpContext.User.Identity.Name != null) - { - username = _accessor.HttpContext.User.Identity.Name; - } - DateTime date = DateTime.UtcNow; - - var created = ChangeTracker.Entries() - .Where(x => x.State == EntityState.Added); - - foreach(var item in created) - { - if (item.Entity is IAuditable) - { - item.CurrentValues[nameof(IAuditable.CreatedBy)] = username; - item.CurrentValues[nameof(IAuditable.CreatedOn)] = date; - } - } - - var modified = ChangeTracker.Entries() - .Where(x => x.State == EntityState.Modified || x.State == EntityState.Added); - - foreach (var item in modified) - { - if (item.Entity is IAuditable) - { - item.CurrentValues[nameof(IAuditable.ModifiedBy)] = username; - item.CurrentValues[nameof(IAuditable.ModifiedOn)] = date; - } - - if (item.Entity is IDeletable && item.State != EntityState.Added) - { - if ((bool)item.CurrentValues[nameof(IDeletable.IsDeleted)] - && !item.GetDatabaseValues().GetValue(nameof(IDeletable.IsDeleted))) - { - item.CurrentValues[nameof(IDeletable.DeletedBy)] = username; - item.CurrentValues[nameof(IDeletable.DeletedOn)] = date; - } - else if (!(bool)item.CurrentValues[nameof(IDeletable.IsDeleted)] - && item.GetDatabaseValues().GetValue(nameof(IDeletable.IsDeleted))) - { - item.CurrentValues[nameof(IDeletable.DeletedBy)] = null; - item.CurrentValues[nameof(IDeletable.DeletedOn)] = null; - } - } - } + DbContextUtils.SaveChanges(this, _accessor); return base.SaveChanges(); } diff --git a/Oqtane.Server/Repository/Context/DbContextUtils.cs b/Oqtane.Server/Repository/Context/DbContextUtils.cs new file mode 100644 index 00000000..1b4014cb --- /dev/null +++ b/Oqtane.Server/Repository/Context/DbContextUtils.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; +using Oqtane.Models; + +namespace Oqtane.Repository +{ + public class DbContextUtils + { + public static void SaveChanges(DbContext context, IHttpContextAccessor accessor) + { + var changeTracker = context.ChangeTracker; + + changeTracker.DetectChanges(); + + string username = ""; + if (accessor.HttpContext != null && accessor.HttpContext.User.Identity.Name != null) + { + username = accessor.HttpContext.User.Identity.Name; + } + DateTime date = DateTime.UtcNow; + + var created = changeTracker.Entries() + .Where(x => x.State == EntityState.Added); + + foreach(var item in created) + { + if (item.Entity is IAuditable) + { + item.CurrentValues[nameof(IAuditable.CreatedBy)] = username; + item.CurrentValues[nameof(IAuditable.CreatedOn)] = date; + } + } + + var modified = changeTracker.Entries() + .Where(x => x.State == EntityState.Modified || x.State == EntityState.Added); + + foreach (var item in modified) + { + if (item.Entity is IAuditable) + { + item.CurrentValues[nameof(IAuditable.ModifiedBy)] = username; + item.CurrentValues[nameof(IAuditable.ModifiedOn)] = date; + } + + if (item.Entity is IDeletable && item.State != EntityState.Added) + { + if ((bool)item.CurrentValues[nameof(IDeletable.IsDeleted)] + && !item.GetDatabaseValues().GetValue(nameof(IDeletable.IsDeleted))) + { + item.CurrentValues[nameof(IDeletable.DeletedBy)] = username; + item.CurrentValues[nameof(IDeletable.DeletedOn)] = date; + } + else if (!(bool)item.CurrentValues[nameof(IDeletable.IsDeleted)] + && item.GetDatabaseValues().GetValue(nameof(IDeletable.IsDeleted))) + { + item.CurrentValues[nameof(IDeletable.DeletedBy)] = null; + item.CurrentValues[nameof(IDeletable.DeletedOn)] = null; + } + } + } + } + } +} diff --git a/Oqtane.Server/Repository/Context/MasterDBContext.cs b/Oqtane.Server/Repository/Context/MasterDBContext.cs index 162c82b9..dd94dedd 100644 --- a/Oqtane.Server/Repository/Context/MasterDBContext.cs +++ b/Oqtane.Server/Repository/Context/MasterDBContext.cs @@ -39,38 +39,7 @@ namespace Oqtane.Repository public override int SaveChanges() { - ChangeTracker.DetectChanges(); - - string username = ""; - if (_accessor.HttpContext != null && _accessor.HttpContext.User.Identity.Name != null) - { - username = _accessor.HttpContext.User.Identity.Name; - } - DateTime date = DateTime.UtcNow; - - var created = ChangeTracker.Entries() - .Where(x => x.State == EntityState.Added); - - foreach (var item in created) - { - if (item.Entity is IAuditable) - { - item.CurrentValues[nameof(IAuditable.CreatedBy)] = username; - item.CurrentValues[nameof(IAuditable.CreatedOn)] = date; - } - } - - var modified = ChangeTracker.Entries() - .Where(x => x.State == EntityState.Modified || x.State == EntityState.Added); - - foreach (var item in modified) - { - if (item.Entity is IAuditable) - { - item.CurrentValues[nameof(IAuditable.ModifiedBy)] = username; - item.CurrentValues[nameof(IAuditable.ModifiedOn)] = date; - } - } + DbContextUtils.SaveChanges(this, _accessor); return base.SaveChanges(); }