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

@ -57,6 +57,6 @@
htmltext.Content = content; htmltext.Content = content;
await htmltextservice.AddHtmlTextAsync(htmltext); await htmltextservice.AddHtmlTextAsync(htmltext);
} }
UriHelper.NavigateTo(NavigateUrl(), true); UriHelper.NavigateTo(NavigateUrl(true));
} }
} }

View File

@ -109,14 +109,46 @@
} }
if (site != null || reload == true) if (site != null || reload == true)
{ {
// get Url path and querystring
string path = new Uri(_absoluteUri).PathAndQuery.Substring(1); string path = new Uri(_absoluteUri).PathAndQuery.Substring(1);
if (path.EndsWith("/")) { path = path.Substring(0, path.Length - 1); }
// parse querystring and remove
Dictionary<string, string> querystring = new Dictionary<string, string>();
if (path.IndexOf("?") != -1)
{
querystring = ParseQueryString(path);
path = path.Substring(0, path.IndexOf("?"));
}
// format path and remove alias
path = path.Replace("//", "/");
if (!path.EndsWith("/")) { path += "/"; }
if (alias.Path != "") if (alias.Path != "")
{ {
path = path.Replace(alias.Path, ""); path = path.Replace(alias.Path + "/", "");
if (path.StartsWith("/")) { path = path.Substring(1); }
} }
Dictionary<string, string> querystring = ParseQueryString(path);
// extract admin route elements from path
string[] segments = path.Split('/');
int result;
if (segments.Length >= 3 && int.TryParse(segments[segments.Length - 3], out result))
{
// path has moduleid and control specification ie. page/moduleid/control/
control = segments[segments.Length - 2];
moduleid = result;
path = path.Replace(moduleid.ToString() + "/" + control + "/", "");
}
else
{
if (segments.Length >= 2 && int.TryParse(segments[segments.Length - 2], out result))
{
// path has only moduleid specification ie. page/moduleid/
moduleid = result;
path = path.Replace(moduleid.ToString() + "/", "");
}
}
// remove trailing slash so it can be used as a key for Pages
if (path.EndsWith("/")) path = path.Substring(0, path.Length - 1);
if (querystring.ContainsKey("reload")) if (querystring.ContainsKey("reload"))
{ {
@ -146,31 +178,6 @@
pages = PageState.Pages; pages = PageState.Pages;
} }
// format path so that it can be located in the pages collection
if (path.IndexOf("?") != -1)
{
// remove querystring from path
path = path.Substring(0, path.IndexOf("?"));
}
// remove admin route elements from path
string[] segments = path.Split('/');
int result;
// admin routes are in the form of path/moduleid/control or path/moduleid
if (segments.Length >= 2 && int.TryParse(segments[segments.Length - 2], out result))
{
control = segments[segments.Length - 1];
moduleid = result;
path = path.Replace("/" + moduleid.ToString() + "/" + control, "");
}
else
{
if (segments.Length >= 1 && int.TryParse(segments[segments.Length - 1], out result))
{
moduleid = result;
path = path.Replace("/" + moduleid.ToString(), "");
}
}
if (PageState == null || reload == true) if (PageState == null || reload == true)
{ {
page = pages.Where(item => item.Path == path).FirstOrDefault(); page = pages.Where(item => item.Path == path).FirstOrDefault();

View File

@ -2,14 +2,15 @@
using Oqtane.Shared.Modules.HtmlText.Models; using Oqtane.Shared.Modules.HtmlText.Models;
using Oqtane.Repository; using Oqtane.Repository;
using Oqtane.Modules; using Oqtane.Modules;
using Microsoft.AspNetCore.Http;
namespace Oqtane.Server.Modules.HtmlText.Repository namespace Oqtane.Server.Modules.HtmlText.Repository
{ {
public class HtmlTextContext : ContextBase, IService public class HtmlTextContext : DBContextBase, IService
{ {
public virtual DbSet<HtmlTextInfo> HtmlText { get; set; } public virtual DbSet<HtmlTextInfo> HtmlText { get; set; }
public HtmlTextContext(ITenantResolver TenantResolver):base(TenantResolver) public HtmlTextContext(ITenantResolver TenantResolver, IHttpContextAccessor accessor) : base(TenantResolver, accessor)
{ {
// ContextBase handles multi-tenant database connections // ContextBase handles multi-tenant database connections
} }

View File

@ -9,10 +9,10 @@ namespace Oqtane.Repository
{ {
public class AliasRepository : IAliasRepository public class AliasRepository : IAliasRepository
{ {
private MasterContext db; private MasterDBContext db;
private readonly IMemoryCache _cache; private readonly IMemoryCache _cache;
public AliasRepository(MasterContext context, IMemoryCache cache) public AliasRepository(MasterDBContext context, IMemoryCache cache)
{ {
db = context; db = context;
_cache = cache; _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 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<Alias> Alias { get; set; }
public virtual DbSet<Tenant> Tenant { get; set; } public virtual DbSet<Tenant> Tenant { get; set; }

View File

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

View File

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

View File

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

View File

@ -7,9 +7,9 @@ namespace Oqtane.Repository
{ {
public class SiteRepository : ISiteRepository public class SiteRepository : ISiteRepository
{ {
private TenantContext db; private TenantDBContext db;
public SiteRepository(TenantContext context) public SiteRepository(TenantDBContext context)
{ {
db = 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 public class TenantRepository : ITenantRepository
{ {
private MasterContext db; private MasterDBContext db;
private readonly IMemoryCache _cache; private readonly IMemoryCache _cache;
public TenantRepository(MasterContext context, IMemoryCache cache) public TenantRepository(MasterDBContext context, IMemoryCache cache)
{ {
db = context; db = context;
_cache = cache; _cache = cache;

View File

@ -7,12 +7,12 @@ namespace Oqtane.Repository
{ {
public class TenantResolver : ITenantResolver public class TenantResolver : ITenantResolver
{ {
private MasterContext db; private MasterDBContext db;
private readonly string aliasname; private readonly string aliasname;
private readonly IAliasRepository _aliasrepository; private readonly IAliasRepository _aliasrepository;
private readonly ITenantRepository _tenantrepository; 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; db = context;
_aliasrepository = aliasrepository; _aliasrepository = aliasrepository;

View File

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

View File

@ -8,6 +8,10 @@ CREATE TABLE [dbo].[Site](
[SiteId] [int] IDENTITY(1,1) NOT NULL, [SiteId] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](200) NOT NULL, [Name] [nvarchar](200) NOT NULL,
[Logo] [nvarchar](50) NOT NULL, [Logo] [nvarchar](50) NOT NULL,
[CreatedBy] [nvarchar](256) NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedBy] [nvarchar](256) NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
CONSTRAINT [PK_Site] PRIMARY KEY CLUSTERED CONSTRAINT [PK_Site] PRIMARY KEY CLUSTERED
( (
[SiteId] ASC [SiteId] ASC
@ -68,6 +72,10 @@ CREATE TABLE [dbo].[HtmlText](
[HtmlTextId] [int] IDENTITY(1,1) NOT NULL, [HtmlTextId] [int] IDENTITY(1,1) NOT NULL,
[ModuleId] [int] NOT NULL, [ModuleId] [int] NOT NULL,
[Content] [nvarchar](max) NOT NULL, [Content] [nvarchar](max) NOT NULL,
[CreatedBy] [nvarchar](256) NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedBy] [nvarchar](256) NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
CONSTRAINT [PK_HtmlText] PRIMARY KEY CLUSTERED CONSTRAINT [PK_HtmlText] PRIMARY KEY CLUSTERED
( (
[HtmlTextId] ASC [HtmlTextId] ASC
@ -77,7 +85,7 @@ GO
CREATE TABLE [dbo].[User]( CREATE TABLE [dbo].[User](
[UserId] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](50) NOT NULL, [Username] [nvarchar](256) NOT NULL,
[DisplayName] [nvarchar](50) NOT NULL, [DisplayName] [nvarchar](50) NOT NULL,
[Roles] [nvarchar](50) NOT NULL, [Roles] [nvarchar](50) NOT NULL,
[IsSuperUser] [bit] NOT NULL, [IsSuperUser] [bit] NOT NULL,
@ -125,11 +133,11 @@ Create seed data
SET IDENTITY_INSERT [dbo].[Site] ON SET IDENTITY_INSERT [dbo].[Site] ON
GO GO
INSERT [dbo].[Site] ([SiteId], [Name], [Logo]) INSERT [dbo].[Site] ([SiteId], [Name], [Logo], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (1, N'Site1', N'oqtane.png') VALUES (1, N'Site1', N'oqtane.png', '', getdate(), '', getdate())
GO GO
INSERT [dbo].[Site] ([SiteId], [Name], [Logo]) INSERT [dbo].[Site] ([SiteId], [Name], [Logo], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (2, N'Site2', N'oqtane.png') VALUES (2, N'Site2', N'oqtane.png', '', getdate(), '', getdate())
GO GO
SET IDENTITY_INSERT [dbo].[Site] OFF SET IDENTITY_INSERT [dbo].[Site] OFF
GO GO
@ -292,23 +300,23 @@ GO
SET IDENTITY_INSERT [dbo].[HtmlText] ON SET IDENTITY_INSERT [dbo].[HtmlText] ON
GO GO
INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content]) INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (1, 3, N'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. <br /><br /><a href="http://localhost:44357/site2/">Go To Site2</a>') VALUES (1, 3, N'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. <br /><br /><a href="http://localhost:44357/site2/">Go To Site2</a>', '', getdate(), '', getdate())
GO GO
INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content]) INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (2, 5, N'Enim sed faucibus turpis in eu mi bibendum neque egestas. Quis hendrerit dolor magna eget est lorem. Dui faucibus in ornare quam viverra orci sagittis. Integer eget aliquet nibh praesent tristique magna sit. Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Tortor id aliquet lectus proin. Diam volutpat commodo sed egestas egestas fringilla. Posuere sollicitudin aliquam ultrices sagittis orci. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Eget gravida cum sociis natoque penatibus et. Sagittis orci a scelerisque purus semper. Eget velit aliquet sagittis id consectetur purus. Volutpat blandit aliquam etiam erat. Et tortor consequat id porta nibh venenatis cras. Volutpat odio facilisis mauris sit amet. Varius duis at consectetur lorem.') VALUES (2, 5, N'Enim sed faucibus turpis in eu mi bibendum neque egestas. Quis hendrerit dolor magna eget est lorem. Dui faucibus in ornare quam viverra orci sagittis. Integer eget aliquet nibh praesent tristique magna sit. Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Tortor id aliquet lectus proin. Diam volutpat commodo sed egestas egestas fringilla. Posuere sollicitudin aliquam ultrices sagittis orci. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Eget gravida cum sociis natoque penatibus et. Sagittis orci a scelerisque purus semper. Eget velit aliquet sagittis id consectetur purus. Volutpat blandit aliquam etiam erat. Et tortor consequat id porta nibh venenatis cras. Volutpat odio facilisis mauris sit amet. Varius duis at consectetur lorem.', '', getdate(), '', getdate())
GO GO
INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content]) INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (3, 6, N'Id consectetur purus ut faucibus pulvinar elementum integer. Bibendum neque egestas congue quisque egestas diam in arcu. Eget nullam non nisi est sit amet facilisis. Sit amet consectetur adipiscing elit pellentesque. Id aliquet risus feugiat in. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Commodo odio aenean sed adipiscing. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Aliquet enim tortor at auctor urna nunc. Nulla pellentesque dignissim enim sit amet. Suscipit adipiscing bibendum est ultricies integer quis auctor. Lacinia quis vel eros donec ac odio tempor. Aliquam vestibulum morbi blandit cursus risus at.') VALUES (3, 6, N'Id consectetur purus ut faucibus pulvinar elementum integer. Bibendum neque egestas congue quisque egestas diam in arcu. Eget nullam non nisi est sit amet facilisis. Sit amet consectetur adipiscing elit pellentesque. Id aliquet risus feugiat in. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Commodo odio aenean sed adipiscing. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Aliquet enim tortor at auctor urna nunc. Nulla pellentesque dignissim enim sit amet. Suscipit adipiscing bibendum est ultricies integer quis auctor. Lacinia quis vel eros donec ac odio tempor. Aliquam vestibulum morbi blandit cursus risus at.', '', getdate(), '', getdate())
GO GO
INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content]) INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (4, 7, N'Ornare arcu dui vivamus arcu felis bibendum ut. Tortor vitae purus faucibus ornare. Lectus sit amet est placerat in egestas erat imperdiet sed. Aliquam sem et tortor consequat id. Fermentum iaculis eu non diam phasellus vestibulum. Ultricies integer quis auctor elit sed. Fermentum odio eu feugiat pretium nibh ipsum. Ut consequat semper viverra nam libero. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. At risus viverra adipiscing at in tellus. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. At varius vel pharetra vel turpis nunc eget lorem dolor. Morbi non arcu risus quis varius. Turpis massa sed elementum tempus egestas.') VALUES (4, 7, N'Ornare arcu dui vivamus arcu felis bibendum ut. Tortor vitae purus faucibus ornare. Lectus sit amet est placerat in egestas erat imperdiet sed. Aliquam sem et tortor consequat id. Fermentum iaculis eu non diam phasellus vestibulum. Ultricies integer quis auctor elit sed. Fermentum odio eu feugiat pretium nibh ipsum. Ut consequat semper viverra nam libero. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. At risus viverra adipiscing at in tellus. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. At varius vel pharetra vel turpis nunc eget lorem dolor. Morbi non arcu risus quis varius. Turpis massa sed elementum tempus egestas.', '', getdate(), '', getdate())
GO GO
INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content]) INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (5, 16, N'Id consectetur purus ut faucibus pulvinar elementum integer. Bibendum neque egestas congue quisque egestas diam in arcu. Eget nullam non nisi est sit amet facilisis. Sit amet consectetur adipiscing elit pellentesque. Id aliquet risus feugiat in. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Commodo odio aenean sed adipiscing. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Aliquet enim tortor at auctor urna nunc. Nulla pellentesque dignissim enim sit amet. Suscipit adipiscing bibendum est ultricies integer quis auctor. Lacinia quis vel eros donec ac odio tempor. Aliquam vestibulum morbi blandit cursus risus at. <br /><br /><a href="http://localhost:44357/">Go To Site1</a>') VALUES (5, 16, N'Id consectetur purus ut faucibus pulvinar elementum integer. Bibendum neque egestas congue quisque egestas diam in arcu. Eget nullam non nisi est sit amet facilisis. Sit amet consectetur adipiscing elit pellentesque. Id aliquet risus feugiat in. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Commodo odio aenean sed adipiscing. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Aliquet enim tortor at auctor urna nunc. Nulla pellentesque dignissim enim sit amet. Suscipit adipiscing bibendum est ultricies integer quis auctor. Lacinia quis vel eros donec ac odio tempor. Aliquam vestibulum morbi blandit cursus risus at. <br /><br /><a href="http://localhost:44357/">Go To Site1</a>', '', getdate(), '', getdate())
GO GO
INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content]) INSERT [dbo].[HtmlText] ([HtmlTextId], [ModuleId], [Content], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
VALUES (6, 17, N'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.') VALUES (6, 17, N'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', '', getdate(), '', getdate())
GO GO
SET IDENTITY_INSERT [dbo].[HtmlText] OFF SET IDENTITY_INSERT [dbo].[HtmlText] OFF
GO GO

View File

@ -101,14 +101,14 @@ namespace Oqtane.Server
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddDbContext<MasterContext>(options => services.AddDbContext<MasterDBContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection") options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString()) .Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString())
)); ));
services.AddDbContext<TenantContext>(options => { }); services.AddDbContext<TenantDBContext>(options => { });
services.AddIdentity<IdentityUser, IdentityRole>() services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<TenantContext>() .AddEntityFrameworkStores<TenantDBContext>()
.AddDefaultTokenProviders(); .AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options => services.Configure<IdentityOptions>(options =>
@ -235,14 +235,14 @@ namespace Oqtane.Server
{ {
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddDbContext<MasterContext>(options => services.AddDbContext<MasterDBContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection") options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString()) .Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString())
)); ));
services.AddDbContext<TenantContext>(options => { }); services.AddDbContext<TenantDBContext>(options => { });
services.AddIdentity<IdentityUser, IdentityRole>() services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<TenantContext>() .AddEntityFrameworkStores<TenantDBContext>()
.AddDefaultTokenProviders(); .AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options => services.Configure<IdentityOptions>(options =>

View File

@ -1,14 +1,21 @@
using System;
using Oqtane.Models;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace Oqtane.Shared.Modules.HtmlText.Models namespace Oqtane.Shared.Modules.HtmlText.Models
{ {
[Table("HtmlText")] [Table("HtmlText")]
public class HtmlTextInfo public class HtmlTextInfo : IAuditable
{ {
[Key] [Key]
public int HtmlTextId { get; set; } public int HtmlTextId { get; set; }
public int ModuleId { get; set; } public int ModuleId { get; set; }
public string Content { get; set; } public string Content { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }
public string ModifiedBy { get; set; }
public DateTime ModifiedOn { get; set; }
} }
} }

View File

@ -0,0 +1,12 @@
using System;
namespace Oqtane.Models
{
public interface IAuditable
{
string CreatedBy { get; set; }
DateTime CreatedOn { get; set; }
string ModifiedBy { get; set; }
DateTime ModifiedOn { get; set; }
}
}

View File

@ -1,9 +1,16 @@
namespace Oqtane.Models using System;
namespace Oqtane.Models
{ {
public class Site public class Site : IAuditable
{ {
public int SiteId { get; set; } public int SiteId { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string Logo { get; set; } public string Logo { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }
public string ModifiedBy { get; set; }
public DateTime ModifiedOn { get; set; }
} }
} }