Enhancement to support audit fields on entities

This commit is contained in:
Shaun Walker
2019-07-31 16:05:36 -04:00
parent 32a2d164c3
commit c9783c3b2f
21 changed files with 213 additions and 150 deletions

View File

@ -9,10 +9,10 @@ namespace Oqtane.Repository
{
public class AliasRepository : IAliasRepository
{
private MasterContext db;
private MasterDBContext db;
private readonly IMemoryCache _cache;
public AliasRepository(MasterContext context, IMemoryCache cache)
public AliasRepository(MasterDBContext context, IMemoryCache cache)
{
db = context;
_cache = cache;

View File

@ -1,33 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Oqtane.Models;
using System;
namespace Oqtane.Repository
{
public class ContextBase : DbContext
{
private Tenant tenant;
public ContextBase(ITenantResolver TenantResolver)
{
tenant = TenantResolver.GetTenant();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(tenant.DBConnectionString
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString())
);
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (tenant.DBSchema != "")
{
modelBuilder.HasDefaultSchema(tenant.DBSchema);
}
base.OnModelCreating(modelBuilder);
}
}
}

View File

@ -0,0 +1,74 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oqtane.Models;
using System;
using System.Linq;
namespace Oqtane.Repository
{
public class DBContextBase : IdentityDbContext<IdentityUser>
{
private Tenant tenant;
private IHttpContextAccessor accessor;
public DBContextBase(ITenantResolver TenantResolver, IHttpContextAccessor accessor)
{
tenant = TenantResolver.GetTenant();
this.accessor = accessor;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(tenant.DBConnectionString
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString())
);
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
if (tenant.DBSchema != "")
{
modelBuilder.HasDefaultSchema(tenant.DBSchema);
}
}
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
string username = accessor.HttpContext.User.Identity.Name;
DateTime date = DateTime.Now;
var created = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added);
foreach(var item in created)
{
if (item.Entity is IAuditable entity)
{
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 entity)
{
item.CurrentValues[nameof(IAuditable.ModifiedBy)] = username;
item.CurrentValues[nameof(IAuditable.ModifiedOn)] = date;
}
}
return base.SaveChanges();
}
}
}

View File

@ -3,9 +3,9 @@ using Oqtane.Models;
namespace Oqtane.Repository
{
public class MasterContext : DbContext
public class MasterDBContext : DbContext
{
public MasterContext(DbContextOptions<MasterContext> options) : base(options) { }
public MasterDBContext(DbContextOptions<MasterDBContext> options) : base(options) { }
public virtual DbSet<Alias> Alias { get; set; }
public virtual DbSet<Tenant> Tenant { get; set; }

View File

@ -7,9 +7,9 @@ namespace Oqtane.Repository
{
public class ModuleRepository : IModuleRepository
{
private TenantContext db;
private TenantDBContext db;
public ModuleRepository(TenantContext context)
public ModuleRepository(TenantDBContext context)
{
db = context;
}

View File

@ -7,9 +7,9 @@ namespace Oqtane.Repository
{
public class PageModuleRepository : IPageModuleRepository
{
private TenantContext db;
private TenantDBContext db;
public PageModuleRepository(TenantContext context)
public PageModuleRepository(TenantDBContext context)
{
db = context;
}

View File

@ -7,9 +7,9 @@ namespace Oqtane.Repository
{
public class PageRepository : IPageRepository
{
private TenantContext db;
private TenantDBContext db;
public PageRepository(TenantContext context)
public PageRepository(TenantDBContext context)
{
db = context;
}

View File

@ -7,9 +7,9 @@ namespace Oqtane.Repository
{
public class SiteRepository : ISiteRepository
{
private TenantContext db;
private TenantDBContext db;
public SiteRepository(TenantContext context)
public SiteRepository(TenantDBContext context)
{
db = context;
}

View File

@ -1,41 +0,0 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oqtane.Models;
using System;
namespace Oqtane.Repository
{
public class TenantContext : IdentityDbContext<IdentityUser>
{
public virtual DbSet<Site> Site { get; set; }
public virtual DbSet<Page> Page { get; set; }
public virtual DbSet<PageModule> PageModule { get; set; }
public virtual DbSet<Module> Module { get; set; }
public virtual DbSet<User> User { get; set; }
private readonly Tenant tenant;
public TenantContext(ITenantResolver TenantResolver)
{
tenant = TenantResolver.GetTenant();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(tenant.DBConnectionString
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString())
);
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (tenant.DBSchema != "")
{
modelBuilder.HasDefaultSchema(tenant.DBSchema);
}
base.OnModelCreating(modelBuilder);
}
}
}

View File

@ -0,0 +1,21 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Oqtane.Models;
namespace Oqtane.Repository
{
public class TenantDBContext : DBContextBase
{
public virtual DbSet<Site> Site { get; set; }
public virtual DbSet<Page> Page { get; set; }
public virtual DbSet<PageModule> PageModule { get; set; }
public virtual DbSet<Module> Module { get; set; }
public virtual DbSet<User> User { get; set; }
public TenantDBContext(ITenantResolver TenantResolver, IHttpContextAccessor accessor) : base(TenantResolver, accessor)
{
// ContextBase handles multi-tenant database connections
}
}
}

View File

@ -10,10 +10,10 @@ namespace Oqtane.Repository
{
public class TenantRepository : ITenantRepository
{
private MasterContext db;
private MasterDBContext db;
private readonly IMemoryCache _cache;
public TenantRepository(MasterContext context, IMemoryCache cache)
public TenantRepository(MasterDBContext context, IMemoryCache cache)
{
db = context;
_cache = cache;

View File

@ -7,12 +7,12 @@ namespace Oqtane.Repository
{
public class TenantResolver : ITenantResolver
{
private MasterContext db;
private MasterDBContext db;
private readonly string aliasname;
private readonly IAliasRepository _aliasrepository;
private readonly ITenantRepository _tenantrepository;
public TenantResolver(MasterContext context, IHttpContextAccessor accessor, IAliasRepository aliasrepository, ITenantRepository tenantrepository)
public TenantResolver(MasterDBContext context, IHttpContextAccessor accessor, IAliasRepository aliasrepository, ITenantRepository tenantrepository)
{
db = context;
_aliasrepository = aliasrepository;

View File

@ -7,9 +7,9 @@ namespace Oqtane.Repository
{
public class UserRepository : IUserRepository
{
private TenantContext db;
private TenantDBContext db;
public UserRepository(TenantContext context)
public UserRepository(TenantDBContext context)
{
db = context;
}