Fix #4010: update repositories to using db context factory.

This commit is contained in:
Ben 2024-03-18 15:32:19 +08:00
parent ce710134ac
commit c58254f951
18 changed files with 460 additions and 355 deletions

View File

@ -12,14 +12,16 @@ namespace Oqtane.Repository
{
public class FileRepository : IFileRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly IPermissionRepository _permissions;
private readonly IFolderRepository _folderRepository;
private readonly ITenantManager _tenants;
public FileRepository(TenantDBContext context, IPermissionRepository permissions, IFolderRepository folderRepository, ITenantManager tenants)
public FileRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IPermissionRepository permissions, IFolderRepository folderRepository, ITenantManager tenants)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = dbContextFactory.CreateDbContext();
_permissions = permissions;
_folderRepository = folderRepository;
_tenants = tenants;
@ -38,12 +40,13 @@ namespace Oqtane.Repository
IEnumerable<File> files;
if (tracking)
{
files = _db.File.Where(item => item.FolderId == folderId).Include(item => item.Folder);
files = _queryContext.File.Where(item => item.FolderId == folderId).Include(item => item.Folder);
}
else
{
files = _db.File.AsNoTracking().Where(item => item.FolderId == folderId).Include(item => item.Folder);
files = _queryContext.File.AsNoTracking().Where(item => item.FolderId == folderId).Include(item => item.Folder);
}
foreach (File file in files)
{
file.Folder.PermissionList = permissions.ToList();
@ -55,9 +58,9 @@ namespace Oqtane.Repository
public File AddFile(File file)
{
file.IsDeleted = false;
_db.File.Add(file);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext(); file.IsDeleted = false;
db.File.Add(file);
db.SaveChanges();
file.Folder = _folderRepository.GetFolder(file.FolderId);
file.Url = GetFileUrl(file, _tenants.GetAlias());
return file;
@ -65,8 +68,9 @@ namespace Oqtane.Repository
public File UpdateFile(File file)
{
_db.Entry(file).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(file).State = EntityState.Modified;
db.SaveChanges();
file.Folder = _folderRepository.GetFolder(file.FolderId);
file.Url = GetFileUrl(file, _tenants.GetAlias());
return file;
@ -80,14 +84,14 @@ namespace Oqtane.Repository
public File GetFile(int fileId, bool tracking)
{
File file;
using var db = _dbContextFactory.CreateDbContext(); File file;
if (tracking)
{
file = _db.File.Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId);
file = db.File.Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId);
}
else
{
file = _db.File.AsNoTracking().Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId);
file = db.File.AsNoTracking().Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId);
}
if (file != null)
{
@ -99,7 +103,7 @@ namespace Oqtane.Repository
public File GetFile(int folderId, string fileName)
{
var file = _db.File.AsNoTracking()
using var db = _dbContextFactory.CreateDbContext(); var file = db.File.AsNoTracking()
.Include(item => item.Folder)
.FirstOrDefault(item => item.FolderId == folderId &&
item.Name.ToLower() == fileName);
@ -115,7 +119,8 @@ namespace Oqtane.Repository
public File GetFile(int siteId, string folderPath, string fileName)
{
var file = _db.File.AsNoTracking()
using var db = _dbContextFactory.CreateDbContext();
var file = db.File.AsNoTracking()
.Include(item => item.Folder)
.FirstOrDefault(item => item.Folder.SiteId == siteId &&
item.Folder.Path.ToLower() == folderPath &&
@ -123,7 +128,7 @@ namespace Oqtane.Repository
if (file != null)
{
IEnumerable<Permission> permissions = _permissions.GetPermissions(file.Folder.SiteId, EntityNames.Folder, file.FolderId).ToList();
var permissions = _permissions.GetPermissions(file.Folder.SiteId, EntityNames.Folder, file.FolderId).ToList();
file.Folder.PermissionList = permissions.ToList();
file.Url = GetFileUrl(file, _tenants.GetAlias());
}
@ -133,21 +138,24 @@ namespace Oqtane.Repository
public void DeleteFile(int fileId)
{
File file = _db.File.Find(fileId);
_db.File.Remove(file);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var file = db.File.Find(fileId);
db.File.Remove(file);
db.SaveChanges();
}
public string GetFilePath(int fileId)
{
var file = _db.File.Find(fileId);
using var db = _dbContextFactory.CreateDbContext();
var file = db.File.Find(fileId);
return GetFilePath(file);
}
public string GetFilePath(File file)
{
using var db = _dbContextFactory.CreateDbContext();
if (file == null) return null;
var folder = file.Folder ?? _db.Folder.AsNoTracking().FirstOrDefault(item => item.FolderId == file.FolderId);
var folder = file.Folder ?? db.Folder.AsNoTracking().FirstOrDefault(item => item.FolderId == file.FolderId);
var filepath = Path.Combine(_folderRepository.GetFolderPath(folder), file.Name);
return filepath;
}

View File

@ -11,14 +11,16 @@ namespace Oqtane.Repository
{
public class FolderRepository : IFolderRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly IPermissionRepository _permissions;
private readonly IWebHostEnvironment _environment;
private readonly ITenantManager _tenants;
public FolderRepository(TenantDBContext context, IPermissionRepository permissions,IWebHostEnvironment environment, ITenantManager tenants)
public FolderRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IPermissionRepository permissions,IWebHostEnvironment environment, ITenantManager tenants)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
_permissions = permissions;
_environment = environment;
_tenants = tenants;
@ -26,9 +28,9 @@ namespace Oqtane.Repository
public IEnumerable<Folder> GetFolders(int siteId)
{
IEnumerable<Permission> permissions = _permissions.GetPermissions(siteId, EntityNames.Folder).ToList();
IEnumerable<Folder> folders = _db.Folder.Where(item => item.SiteId == siteId);
foreach(Folder folder in folders)
var permissions = _permissions.GetPermissions(siteId, EntityNames.Folder).ToList();
var folders = _queryContext.Folder.Where(item => item.SiteId == siteId);
foreach (var folder in folders)
{
folder.PermissionList = permissions.Where(item => item.EntityId == folder.FolderId).ToList();
}
@ -37,17 +39,19 @@ namespace Oqtane.Repository
public Folder AddFolder(Folder folder)
{
using var db = _dbContextFactory.CreateDbContext();
folder.IsDeleted = false;
_db.Folder.Add(folder);
_db.SaveChanges();
db.Folder.Add(folder);
db.SaveChanges();
_permissions.UpdatePermissions(folder.SiteId, EntityNames.Folder, folder.FolderId, folder.PermissionList);
return folder;
}
public Folder UpdateFolder(Folder folder)
{
_db.Entry(folder).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(folder).State = EntityState.Modified;
db.SaveChanges();
_permissions.UpdatePermissions(folder.SiteId, EntityNames.Folder, folder.FolderId, folder.PermissionList);
return folder;
}
@ -59,14 +63,15 @@ namespace Oqtane.Repository
public Folder GetFolder(int folderId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
Folder folder;
if (tracking)
{
folder = _db.Folder.Find(folderId);
folder = db.Folder.Find(folderId);
}
else
{
folder = _db.Folder.AsNoTracking().Where(item => item.FolderId == folderId).FirstOrDefault();
folder = db.Folder.AsNoTracking().Where(item => item.FolderId == folderId).FirstOrDefault();
}
if (folder != null)
{
@ -77,7 +82,8 @@ namespace Oqtane.Repository
public Folder GetFolder(int siteId, string path)
{
Folder folder = _db.Folder.Where(item => item.SiteId == siteId && item.Path == path).FirstOrDefault();
using var db = _dbContextFactory.CreateDbContext();
var folder = db.Folder.Where(item => item.SiteId == siteId && item.Path == path).FirstOrDefault();
if (folder != null)
{
folder.PermissionList = _permissions.GetPermissions(folder.SiteId, EntityNames.Folder, folder.FolderId)?.ToList();
@ -87,15 +93,17 @@ namespace Oqtane.Repository
public void DeleteFolder(int folderId)
{
Folder folder = _db.Folder.Find(folderId);
using var db = _dbContextFactory.CreateDbContext();
var folder = db.Folder.Find(folderId);
_permissions.DeletePermissions(folder.SiteId, EntityNames.Folder, folderId);
_db.Folder.Remove(folder);
_db.SaveChanges();
db.Folder.Remove(folder);
db.SaveChanges();
}
public string GetFolderPath(int folderId)
{
Folder folder = _db.Folder.Find(folderId);
using var db = _dbContextFactory.CreateDbContext();
var folder = db.Folder.Find(folderId);
return GetFolderPath(folder);
}

View File

@ -7,64 +7,70 @@ namespace Oqtane.Repository
{
public class LanguageRepository : ILanguageRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
public LanguageRepository(TenantDBContext context)
public LanguageRepository(IDbContextFactory<TenantDBContext> dbContextFactory)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
}
public IEnumerable<Language> GetLanguages(int siteId)
{
return _db.Language.Where(l => l.SiteId == siteId);
return _queryContext.Language.Where(l => l.SiteId == siteId);
}
public Language AddLanguage(Language language)
{
using var db = _dbContextFactory.CreateDbContext();
if (language.IsDefault)
{
// Ensure all other languages are not set to default
_db.Language
db.Language
.Where(l => l.SiteId == language.SiteId)
.ToList()
.ForEach(l => l.IsDefault = false);
}
_db.Language.Add(language);
_db.SaveChanges();
db.Language.Add(language);
db.SaveChanges();
return language;
}
public void UpdateLanguage(Language language)
{
using var db = _dbContextFactory.CreateDbContext();
if (language.LanguageId != 0)
{
_db.Entry(language).State = EntityState.Modified;
db.Entry(language).State = EntityState.Modified;
}
if (language.IsDefault)
{
// Ensure all other languages are not set to default
_db.Language
db.Language
.Where(l => l.SiteId == language.SiteId &&
l.LanguageId != language.LanguageId)
.ToList()
.ForEach(l => l.IsDefault = false);
}
_db.SaveChanges();
db.SaveChanges();
}
public Language GetLanguage(int languageId)
{
return _db.Language.Find(languageId);
using var db = _dbContextFactory.CreateDbContext();
return db.Language.Find(languageId);
}
public void DeleteLanguage(int languageId)
{
var language = _db.Language.Find(languageId);
_db.Language.Remove(language);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var language = db.Language.Find(languageId);
db.Language.Remove(language);
db.SaveChanges();
}
}
}

View File

@ -1,17 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Oqtane.Models;
namespace Oqtane.Repository
{
public class LogRepository : ILogRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
public LogRepository(TenantDBContext context)
public LogRepository(IDbContextFactory<TenantDBContext> dbContextFactory)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
}
public IEnumerable<Log> GetLogs(int siteId, string level, string function, int rows)
@ -20,48 +23,51 @@ namespace Oqtane.Repository
{
if (function == null)
{
return _db.Log.Where(item => item.SiteId == siteId).
return _queryContext.Log.Where(item => item.SiteId == siteId).
OrderByDescending(item => item.LogDate).Take(rows);
}
return _db.Log.Where(item => item.SiteId == siteId && item.Function == function).
return _queryContext.Log.Where(item => item.SiteId == siteId && item.Function == function).
OrderByDescending(item => item.LogDate).Take(rows);
}
if (function == null)
{
return _db.Log.Where(item => item.SiteId == siteId && item.Level == level)
return _queryContext.Log.Where(item => item.SiteId == siteId && item.Level == level)
.OrderByDescending(item => item.LogDate).Take(rows);
}
return _db.Log.Where(item => item.SiteId == siteId && item.Level == level && item.Function == function)
return _queryContext.Log.Where(item => item.SiteId == siteId && item.Level == level && item.Function == function)
.OrderByDescending(item => item.LogDate).Take(rows);
}
public Log GetLog(int logId)
{
return _db.Log.Find(logId);
using var db = _dbContextFactory.CreateDbContext();
return db.Log.Find(logId);
}
public void AddLog(Log log)
{
_db.Log.Add(log);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Log.Add(log);
db.SaveChanges();
}
public int DeleteLogs(int siteId, int age)
{
using var db = _dbContextFactory.CreateDbContext();
// delete logs in batches of 100 records
int count = 0;
var count = 0;
var purgedate = DateTime.UtcNow.AddDays(-age);
var logs = _db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate)
var logs = db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate)
.OrderBy(item => item.LogDate).Take(100).ToList();
while (logs.Count > 0)
{
count += logs.Count;
_db.Log.RemoveRange(logs);
_db.SaveChanges();
logs = _db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate)
db.Log.RemoveRange(logs);
db.SaveChanges();
logs = db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate)
.OrderBy(item => item.LogDate).Take(100).ToList();
}
return count;

View File

@ -14,15 +14,17 @@ namespace Oqtane.Repository
{
public class ModuleRepository : IModuleRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly IPermissionRepository _permissions;
private readonly ISettingRepository _settings;
private readonly IModuleDefinitionRepository _moduleDefinitions;
private readonly IServiceProvider _serviceProvider;
public ModuleRepository(TenantDBContext context, IPermissionRepository permissions, ISettingRepository settings, IModuleDefinitionRepository moduleDefinitions, IServiceProvider serviceProvider)
public ModuleRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IPermissionRepository permissions, ISettingRepository settings, IModuleDefinitionRepository moduleDefinitions, IServiceProvider serviceProvider)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
_permissions = permissions;
_settings = settings;
_moduleDefinitions = moduleDefinitions;
@ -31,21 +33,23 @@ namespace Oqtane.Repository
public IEnumerable<Module> GetModules(int siteId)
{
return _db.Module.Where(item => item.SiteId == siteId).ToList();
return _queryContext.Module.Where(item => item.SiteId == siteId);
}
public Module AddModule(Module module)
{
_db.Module.Add(module);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Module.Add(module);
db.SaveChanges();
_permissions.UpdatePermissions(module.SiteId, EntityNames.Module, module.ModuleId, module.PermissionList);
return module;
}
public Module UpdateModule(Module module)
{
_db.Entry(module).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(module).State = EntityState.Modified;
db.SaveChanges();
_permissions.UpdatePermissions(module.SiteId, EntityNames.Module, module.ModuleId, module.PermissionList);
return module;
}
@ -57,14 +61,15 @@ namespace Oqtane.Repository
public Module GetModule(int moduleId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
Module module;
if (tracking)
{
module = _db.Module.Find(moduleId);
module = db.Module.Find(moduleId);
}
else
{
module = _db.Module.AsNoTracking().FirstOrDefault(item => item.ModuleId == moduleId);
module = db.Module.AsNoTracking().FirstOrDefault(item => item.ModuleId == moduleId);
}
if (module != null)
{
@ -75,11 +80,12 @@ namespace Oqtane.Repository
public void DeleteModule(int moduleId)
{
Module module = _db.Module.Find(moduleId);
using var db = _dbContextFactory.CreateDbContext();
var module = db.Module.Find(moduleId);
_permissions.DeletePermissions(module.SiteId, EntityNames.Module, moduleId);
_settings.DeleteSettings(EntityNames.Module, moduleId);
_db.Module.Remove(module);
_db.SaveChanges();
db.Module.Remove(module);
db.SaveChanges();
}
public string ExportModule(int moduleId)

View File

@ -8,25 +8,26 @@ namespace Oqtane.Repository
{
public class NotificationRepository : INotificationRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
public NotificationRepository(TenantDBContext context)
public NotificationRepository(IDbContextFactory<TenantDBContext> dbContextFactory)
{
_db = context;
_dbContextFactory = dbContextFactory;
}
public IEnumerable<Notification> GetNotifications(int siteId, int fromUserId, int toUserId)
{
using var db = _dbContextFactory.CreateDbContext();
if (toUserId == -1 && fromUserId == -1)
{
return _db.Notification
return db.Notification
.Where(item => item.SiteId == siteId)
.Where(item => item.IsDelivered == false && item.IsDeleted == false)
.Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow)
.ToList();
}
return _db.Notification
return db.Notification
.Where(item => item.SiteId == siteId)
.Where(item => item.ToUserId == toUserId || toUserId == -1)
.Where(item => item.FromUserId == fromUserId || fromUserId == -1)
@ -35,9 +36,10 @@ namespace Oqtane.Repository
public IEnumerable<Notification> GetNotifications(int siteId, int fromUserId, int toUserId, int count, bool isRead)
{
using var db = _dbContextFactory.CreateDbContext();
if (toUserId == -1 && fromUserId == -1)
{
return _db.Notification
return db.Notification
.Where(item => item.SiteId == siteId)
.Where(item => item.IsDelivered == false && item.IsDeleted == false)
.Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow)
@ -47,7 +49,7 @@ namespace Oqtane.Repository
.Take(count);
}
return _db.Notification
return db.Notification
.Where(item => item.SiteId == siteId)
.Where(item => item.ToUserId == toUserId || toUserId == -1)
.Where(item => item.FromUserId == fromUserId || fromUserId == -1)
@ -59,9 +61,10 @@ namespace Oqtane.Repository
public int GetNotificationCount(int siteId, int fromUserId, int toUserId, bool isRead)
{
using var db = _dbContextFactory.CreateDbContext();
if (toUserId == -1 && fromUserId == -1)
{
return _db.Notification
return db.Notification
.Where(item => item.SiteId == siteId)
.Where(item => item.IsDelivered == false && item.IsDeleted == false)
.Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow)
@ -71,7 +74,7 @@ namespace Oqtane.Repository
}
return _db.Notification
return db.Notification
.Where(item => item.SiteId == siteId)
.Where(item => item.ToUserId == toUserId || toUserId == -1)
.Where(item => item.FromUserId == fromUserId || fromUserId == -1)
@ -83,15 +86,17 @@ namespace Oqtane.Repository
public Notification AddNotification(Notification notification)
{
_db.Notification.Add(notification);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Notification.Add(notification);
db.SaveChanges();
return notification;
}
public Notification UpdateNotification(Notification notification)
{
_db.Entry(notification).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(notification).State = EntityState.Modified;
db.SaveChanges();
return notification;
}
public Notification GetNotification(int notificationId)
@ -101,36 +106,39 @@ namespace Oqtane.Repository
public Notification GetNotification(int notificationId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.Notification.Find(notificationId);
return db.Notification.Find(notificationId);
}
else
{
return _db.Notification.AsNoTracking().FirstOrDefault(item => item.NotificationId == notificationId);
return db.Notification.AsNoTracking().FirstOrDefault(item => item.NotificationId == notificationId);
}
}
public void DeleteNotification(int notificationId)
{
Notification notification = _db.Notification.Find(notificationId);
_db.Notification.Remove(notification);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var notification = db.Notification.Find(notificationId);
db.Notification.Remove(notification);
db.SaveChanges();
}
public int DeleteNotifications(int siteId, int age)
{
using var db = _dbContextFactory.CreateDbContext();
// delete notifications in batches of 100 records
int count = 0;
var count = 0;
var purgedate = DateTime.UtcNow.AddDays(-age);
var notifications = _db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate)
var notifications = db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate)
.OrderBy(item => item.DeliveredOn).Take(100).ToList();
while (notifications.Count > 0)
{
count += notifications.Count;
_db.Notification.RemoveRange(notifications);
_db.SaveChanges();
notifications = _db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate)
db.Notification.RemoveRange(notifications);
db.SaveChanges();
notifications = db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate)
.OrderBy(item => item.DeliveredOn).Take(100).ToList();
}
return count;

View File

@ -27,8 +27,7 @@ namespace Oqtane.Repository
public IEnumerable<PageModule> GetPageModules(int siteId)
{
using(var db = _dbContextFactory.CreateDbContext())
{
using var db = _dbContextFactory.CreateDbContext();
var pagemodules = db.PageModule
.Include(item => item.Module) // eager load modules
.Where(item => item.Module.SiteId == siteId).ToList();
@ -44,27 +43,21 @@ namespace Oqtane.Repository
return pagemodules;
}
}
public PageModule AddPageModule(PageModule pageModule)
{
using (var db = _dbContextFactory.CreateDbContext())
{
using var db = _dbContextFactory.CreateDbContext();
db.PageModule.Add(pageModule);
db.SaveChanges();
return pageModule;
}
}
public PageModule UpdatePageModule(PageModule pageModule)
{
using (var db = _dbContextFactory.CreateDbContext())
{
using var db = _dbContextFactory.CreateDbContext();
db.Entry(pageModule).State = EntityState.Modified;
db.SaveChanges();
return pageModule;
}
}
public PageModule GetPageModule(int pageModuleId)
{
@ -73,8 +66,7 @@ namespace Oqtane.Repository
public PageModule GetPageModule(int pageModuleId, bool tracking)
{
using (var db = _dbContextFactory.CreateDbContext())
{
using var db = _dbContextFactory.CreateDbContext();
PageModule pagemodule;
if (tracking)
{
@ -94,13 +86,11 @@ namespace Oqtane.Repository
}
return pagemodule;
}
}
public PageModule GetPageModule(int pageId, int moduleId)
{
using (var db = _dbContextFactory.CreateDbContext())
{
PageModule pagemodule = db.PageModule.Include(item => item.Module) // eager load modules
using var db = _dbContextFactory.CreateDbContext();
var pagemodule = db.PageModule.Include(item => item.Module) // eager load modules
.SingleOrDefault(item => item.PageId == pageId && item.ModuleId == moduleId);
if (pagemodule != null)
{
@ -110,13 +100,11 @@ namespace Oqtane.Repository
}
return pagemodule;
}
}
public void DeletePageModule(int pageModuleId)
{
using (var db = _dbContextFactory.CreateDbContext())
{
PageModule pageModule = db.PageModule.Include(item => item.Module) // eager load modules
using var db = _dbContextFactory.CreateDbContext();
var pageModule = db.PageModule.Include(item => item.Module) // eager load modules
.SingleOrDefault(item => item.PageModuleId == pageModuleId);
_settings.DeleteSettings(EntityNames.PageModule, pageModuleId);
db.PageModule.Remove(pageModule);
@ -129,7 +117,6 @@ namespace Oqtane.Repository
_modules.DeleteModule(pageModule.ModuleId);
}
}
}
private PageModule GetPageModule(PageModule pageModule, List<ModuleDefinition> moduleDefinitions, List<Permission> modulePermissions)
{

View File

@ -9,14 +9,16 @@ namespace Oqtane.Repository
{
public class PageRepository : IPageRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly IPageModuleRepository _pageModules;
private readonly IPermissionRepository _permissions;
private readonly ISettingRepository _settings;
public PageRepository(TenantDBContext context, IPageModuleRepository pageModules, IPermissionRepository permissions, ISettingRepository settings)
public PageRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IPageModuleRepository pageModules, IPermissionRepository permissions, ISettingRepository settings)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
_pageModules = pageModules;
_permissions = permissions;
_settings = settings;
@ -24,9 +26,9 @@ namespace Oqtane.Repository
public IEnumerable<Page> GetPages(int siteId)
{
IEnumerable<Permission> permissions = _permissions.GetPermissions(siteId, EntityNames.Page).ToList();
IEnumerable<Page> pages = _db.Page.Where(item => item.SiteId == siteId && item.UserId == null);
foreach(Page page in pages)
var permissions = _permissions.GetPermissions(siteId, EntityNames.Page).ToList();
var pages = _queryContext.Page.Where(item => item.SiteId == siteId && item.UserId == null);
foreach (var page in pages)
{
page.PermissionList = permissions.Where(item => item.EntityId == page.PageId).ToList();
}
@ -35,16 +37,18 @@ namespace Oqtane.Repository
public Page AddPage(Page page)
{
_db.Page.Add(page);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Page.Add(page);
db.SaveChanges();
_permissions.UpdatePermissions(page.SiteId, EntityNames.Page, page.PageId, page.PermissionList);
return page;
}
public Page UpdatePage(Page page)
{
_db.Entry(page).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(page).State = EntityState.Modified;
db.SaveChanges();
_permissions.UpdatePermissions(page.SiteId, EntityNames.Page, page.PageId, page.PermissionList);
return page;
}
@ -56,15 +60,16 @@ namespace Oqtane.Repository
public Page GetPage(int pageId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
Page page;
if (tracking)
{
page = _db.Page.Find(pageId);
page = db.Page.Find(pageId);
}
else
{
page = _db.Page.AsNoTracking().FirstOrDefault(item => item.PageId == pageId);
page = db.Page.AsNoTracking().FirstOrDefault(item => item.PageId == pageId);
}
if (page != null)
{
@ -75,7 +80,8 @@ namespace Oqtane.Repository
public Page GetPage(string path, int siteId)
{
Page page = _db.Page.FirstOrDefault(item => item.Path == path && item.SiteId == siteId);
using var db = _dbContextFactory.CreateDbContext();
var page = db.Page.FirstOrDefault(item => item.Path == path && item.SiteId == siteId);
if (page != null)
{
page.PermissionList = _permissions.GetPermissions(page.SiteId, EntityNames.Page, page.PageId)?.ToList();
@ -85,18 +91,19 @@ namespace Oqtane.Repository
public void DeletePage(int pageId)
{
Page page = _db.Page.Find(pageId);
using var db = _dbContextFactory.CreateDbContext();
var page = db.Page.Find(pageId);
_permissions.DeletePermissions(page.SiteId, EntityNames.Page, pageId);
_settings.DeleteSettings(EntityNames.Page, pageId);
// remove page modules for page
var pageModules = _db.PageModule.Where(item => item.PageId == pageId).ToList();
var pageModules = db.PageModule.Where(item => item.PageId == pageId).ToList();
foreach (var pageModule in pageModules)
{
_pageModules.DeletePageModule(pageModule.PageModuleId);
}
// must occur after page modules are deleted because of cascading delete relationship
_db.Page.Remove(page);
_db.SaveChanges();
db.Page.Remove(page);
db.SaveChanges();
}
}
}

View File

@ -10,14 +10,14 @@ namespace Oqtane.Repository
{
public class PermissionRepository : IPermissionRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly IRoleRepository _roles;
private readonly IMemoryCache _cache;
private readonly SiteState _siteState;
public PermissionRepository(TenantDBContext context, IRoleRepository roles, IMemoryCache cache, SiteState siteState)
public PermissionRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IRoleRepository roles, IMemoryCache cache, SiteState siteState)
{
_db = context;
_dbContextFactory = dbContextFactory;
_roles = roles;
_cache = cache;
_siteState = siteState;
@ -25,13 +25,14 @@ namespace Oqtane.Repository
public IEnumerable<Permission> GetPermissions(int siteId, string entityName)
{
using var db = _dbContextFactory.CreateDbContext();
var alias = _siteState?.Alias;
if (alias != null)
{
return _cache.GetOrCreate($"permissions:{alias.TenantId}:{siteId}:{entityName}", entry =>
{
var roles = _roles.GetRoles(siteId, true).ToList();
var permissions = _db.Permission.Where(item => item.SiteId == siteId).Where(item => item.EntityName == entityName).ToList();
var permissions = db.Permission.Where(item => item.SiteId == siteId).Where(item => item.EntityName == entityName).ToList();
foreach (var permission in permissions)
{
if (permission.RoleId != null && string.IsNullOrEmpty(permission.RoleName))
@ -69,24 +70,27 @@ namespace Oqtane.Repository
public Permission AddPermission(Permission permission)
{
_db.Permission.Add(permission);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Permission.Add(permission);
db.SaveChanges();
ClearCache(permission.SiteId, permission.EntityName);
return permission;
}
public Permission UpdatePermission(Permission permission)
{
_db.Entry(permission).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(permission).State = EntityState.Modified;
db.SaveChanges();
ClearCache(permission.SiteId, permission.EntityName);
return permission;
}
public void UpdatePermissions(int siteId, string entityName, int entityId, List<Permission> permissions)
{
using var db = _dbContextFactory.CreateDbContext();
// ensure permissions are fully populated
List<Role> roles = _roles.GetRoles(siteId, true).ToList();
var roles = _roles.GetRoles(siteId, true).ToList();
foreach (var permission in permissions)
{
permission.SiteId = siteId;
@ -115,13 +119,13 @@ namespace Oqtane.Repository
if (current.IsAuthorized != permission.IsAuthorized)
{
current.IsAuthorized = permission.IsAuthorized;
_db.Entry(current).State = EntityState.Modified;
db.Entry(current).State = EntityState.Modified;
modified = true;
}
}
else
{
_db.Permission.Add(permission);
db.Permission.Add(permission);
modified = true;
}
}
@ -131,13 +135,13 @@ namespace Oqtane.Repository
if (!permissions.Any(item => item.EntityName == permission.EntityName && item.PermissionName == permission.PermissionName
&& item.EntityId == permission.EntityId && item.RoleId == permission.RoleId && item.UserId == permission.UserId))
{
_db.Permission.Remove(permission);
db.Permission.Remove(permission);
modified = true;
}
}
if (modified)
{
_db.SaveChanges();
db.SaveChanges();
foreach (var entityname in permissions.Select(item => item.EntityName).Distinct())
{
ClearCache(siteId, entityname);
@ -147,28 +151,31 @@ namespace Oqtane.Repository
public Permission GetPermission(int permissionId)
{
return _db.Permission.Find(permissionId);
using var db = _dbContextFactory.CreateDbContext();
return db.Permission.Find(permissionId);
}
public void DeletePermission(int permissionId)
{
Permission permission = _db.Permission.Find(permissionId);
_db.Permission.Remove(permission);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var permission = db.Permission.Find(permissionId);
db.Permission.Remove(permission);
db.SaveChanges();
ClearCache(permission.SiteId, permission.EntityName);
}
public void DeletePermissions(int siteId, string entityName, int entityId)
{
IEnumerable<Permission> permissions = _db.Permission
using var db = _dbContextFactory.CreateDbContext();
var permissions = db.Permission
.Where(item => item.EntityName == entityName)
.Where(item => item.EntityId == entityId)
.Where(item => item.SiteId == siteId);
foreach (Permission permission in permissions)
{
_db.Permission.Remove(permission);
db.Permission.Remove(permission);
}
_db.SaveChanges();
db.SaveChanges();
ClearCache(siteId, entityName);
}

View File

@ -7,29 +7,33 @@ namespace Oqtane.Repository
{
public class ProfileRepository : IProfileRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
public ProfileRepository(TenantDBContext context)
public ProfileRepository(IDbContextFactory<TenantDBContext> dbContextFactory)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
}
public IEnumerable<Profile> GetProfiles(int siteId)
{
return _db.Profile.Where(item => item.SiteId == siteId || item.SiteId == null);
return _queryContext.Profile.Where(item => item.SiteId == siteId || item.SiteId == null);
}
public Profile AddProfile(Profile profile)
{
_db.Profile.Add(profile);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Profile.Add(profile);
db.SaveChanges();
return profile;
}
public Profile UpdateProfile(Profile profile)
{
_db.Entry(profile).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(profile).State = EntityState.Modified;
db.SaveChanges();
return profile;
}
@ -40,21 +44,23 @@ namespace Oqtane.Repository
public Profile GetProfile(int profileId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.Profile.Find(profileId);
return db.Profile.Find(profileId);
}
else
{
return _db.Profile.AsNoTracking().FirstOrDefault(item => item.ProfileId == profileId);
return db.Profile.AsNoTracking().FirstOrDefault(item => item.ProfileId == profileId);
}
}
public void DeleteProfile(int profileId)
{
Profile profile = _db.Profile.Find(profileId);
_db.Profile.Remove(profile);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var profile = db.Profile.Find(profileId);
db.Profile.Remove(profile);
db.SaveChanges();
}
}
}

View File

@ -7,11 +7,13 @@ namespace Oqtane.Repository
{
public class RoleRepository : IRoleRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
public RoleRepository(TenantDBContext context)
public RoleRepository(IDbContextFactory<TenantDBContext> dbContextFactory)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
}
public IEnumerable<Role> GetRoles(int siteId)
@ -23,27 +25,29 @@ namespace Oqtane.Repository
{
if (includeGlobalRoles)
{
return _db.Role.Where(item => item.SiteId == siteId || item.SiteId == null);
return _queryContext.Role.Where(item => item.SiteId == siteId || item.SiteId == null);
}
else
{
return _db.Role.Where(item => item.SiteId == siteId);
return _queryContext.Role.Where(item => item.SiteId == siteId);
}
}
public Role AddRole(Role role)
{
using var db = _dbContextFactory.CreateDbContext();
role.Description = role.Description.Substring(0, (role.Description.Length > 256) ? 256 : role.Description.Length);
_db.Role.Add(role);
_db.SaveChanges();
db.Role.Add(role);
db.SaveChanges();
return role;
}
public Role UpdateRole(Role role)
{
using var db = _dbContextFactory.CreateDbContext();
role.Description = role.Description.Substring(0, (role.Description.Length > 256) ? 256 : role.Description.Length);
_db.Entry(role).State = EntityState.Modified;
_db.SaveChanges();
db.Entry(role).State = EntityState.Modified;
db.SaveChanges();
return role;
}
@ -54,21 +58,23 @@ namespace Oqtane.Repository
public Role GetRole(int roleId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.Role.Find(roleId);
return db.Role.Find(roleId);
}
else
{
return _db.Role.AsNoTracking().FirstOrDefault(item => item.RoleId == roleId);
return db.Role.AsNoTracking().FirstOrDefault(item => item.RoleId == roleId);
}
}
public void DeleteRole(int roleId)
{
Role role = _db.Role.Find(roleId);
_db.Role.Remove(role);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
Role role = db.Role.Find(roleId);
db.Role.Remove(role);
db.SaveChanges();
}
}
}

View File

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.Extensions.Caching.Memory;
using Oqtane.Infrastructure;
using Oqtane.Models;
@ -10,14 +11,16 @@ namespace Oqtane.Repository
{
public class SettingRepository : ISettingRepository
{
private TenantDBContext _tenant;
private readonly IDbContextFactory<TenantDBContext> _tenantContextFactory;
private readonly TenantDBContext _tenantQueryContext;
private MasterDBContext _master;
private readonly ITenantManager _tenantManager;
private readonly IMemoryCache _cache;
public SettingRepository(TenantDBContext tenant, MasterDBContext master, ITenantManager tenantManager, IMemoryCache cache)
public SettingRepository(IDbContextFactory<TenantDBContext> tenantContextFactory, MasterDBContext master, ITenantManager tenantManager, IMemoryCache cache)
{
_tenant = tenant;
_tenantContextFactory = tenantContextFactory;
_tenantQueryContext = tenantContextFactory.CreateDbContext();
_master = master;
_tenantManager = tenantManager;
_cache = cache;
@ -31,7 +34,7 @@ namespace Oqtane.Repository
}
else
{
return _tenant.Setting.Where(item => item.EntityName == entityName);
return _tenantQueryContext.Setting.Where(item => item.EntityName == entityName);
}
}
@ -43,6 +46,7 @@ namespace Oqtane.Repository
public Setting AddSetting(Setting setting)
{
using var tenant = _tenantContextFactory.CreateDbContext();
if (IsMaster(setting.EntityName))
{
_master.Setting.Add(setting);
@ -50,8 +54,8 @@ namespace Oqtane.Repository
}
else
{
_tenant.Setting.Add(setting);
_tenant.SaveChanges();
tenant.Setting.Add(setting);
tenant.SaveChanges();
}
ManageCache(setting.EntityName);
return setting;
@ -59,6 +63,7 @@ namespace Oqtane.Repository
public Setting UpdateSetting(Setting setting)
{
using var tenant = _tenantContextFactory.CreateDbContext();
if (IsMaster(setting.EntityName))
{
_master.Entry(setting).State = EntityState.Modified;
@ -66,8 +71,8 @@ namespace Oqtane.Repository
}
else
{
_tenant.Entry(setting).State = EntityState.Modified;
_tenant.SaveChanges();
tenant.Entry(setting).State = EntityState.Modified;
tenant.SaveChanges();
}
ManageCache(setting.EntityName);
return setting;
@ -75,30 +80,33 @@ namespace Oqtane.Repository
public Setting GetSetting(string entityName, int settingId)
{
using var tenant = _tenantContextFactory.CreateDbContext();
if (IsMaster(entityName))
{
return _master.Setting.Find(settingId);
}
else
{
return _tenant.Setting.Find(settingId);
return tenant.Setting.Find(settingId);
}
}
public Setting GetSetting(string entityName, int entityId, string settingName)
{
using var tenant = _tenantContextFactory.CreateDbContext();
if (IsMaster(entityName))
{
return _master.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault();
}
else
{
return _tenant.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault();
return tenant.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault();
}
}
public void DeleteSetting(string entityName, int settingId)
{
using var tenant = _tenantContextFactory.CreateDbContext();
if (IsMaster(entityName))
{
Setting setting = _master.Setting.Find(settingId);
@ -107,15 +115,16 @@ namespace Oqtane.Repository
}
else
{
Setting setting = _tenant.Setting.Find(settingId);
_tenant.Setting.Remove(setting);
_tenant.SaveChanges();
Setting setting = tenant.Setting.Find(settingId);
tenant.Setting.Remove(setting);
tenant.SaveChanges();
}
ManageCache(entityName);
}
public void DeleteSettings(string entityName, int entityId)
{
using var tenant = _tenantContextFactory.CreateDbContext();
if (IsMaster(entityName))
{
IEnumerable<Setting> settings = _master.Setting
@ -129,14 +138,14 @@ namespace Oqtane.Repository
}
else
{
IEnumerable<Setting> settings = _tenant.Setting
IEnumerable<Setting> settings = tenant.Setting
.Where(item => item.EntityName == entityName)
.Where(item => item.EntityId == entityId);
foreach (Setting setting in settings)
{
_tenant.Setting.Remove(setting);
tenant.Setting.Remove(setting);
}
_tenant.SaveChanges();
tenant.SaveChanges();
}
ManageCache(entityName);
}

View File

@ -17,8 +17,8 @@ namespace Oqtane.Repository
{
public class SiteRepository : ISiteRepository
{
private readonly TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _factory;
private readonly TenantDBContext _queryContext;
private readonly IRoleRepository _roleRepository;
private readonly IProfileRepository _profileRepository;
private readonly IFolderRepository _folderRepository;
@ -33,12 +33,12 @@ namespace Oqtane.Repository
private readonly ILogManager _logger;
private static readonly object _lock = new object();
public SiteRepository(TenantDBContext context, IDbContextFactory<TenantDBContext> factory, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository,
public SiteRepository(IDbContextFactory<TenantDBContext> factory, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository,
IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IThemeRepository themeRepository, IServiceProvider serviceProvider,
IConfigurationRoot config, IServerStateManager serverState, ILogManager logger)
{
_db = context;
_factory = factory;
_queryContext = _factory.CreateDbContext();
_roleRepository = roleRepository;
_profileRepository = profileRepository;
_folderRepository = folderRepository;
@ -107,22 +107,24 @@ namespace Oqtane.Repository
// synchronous methods
public IEnumerable<Site> GetSites()
{
return _db.Site.OrderBy(item => item.Name);
return _queryContext.Site.OrderBy(item => item.Name);
}
public Site AddSite(Site site)
{
using var ctx = _factory.CreateDbContext();
site.SiteGuid = Guid.NewGuid().ToString();
_db.Site.Add(site);
_db.SaveChanges();
ctx.Site.Add(site);
ctx.SaveChanges();
CreateSite(site);
return site;
}
public Site UpdateSite(Site site)
{
_db.Entry(site).State = EntityState.Modified;
_db.SaveChanges();
using var ctx = _factory.CreateDbContext();
ctx.Entry(site).State = EntityState.Modified;
ctx.SaveChanges();
return site;
}
@ -133,21 +135,23 @@ namespace Oqtane.Repository
public Site GetSite(int siteId, bool tracking)
{
using var ctx = _factory.CreateDbContext();
if (tracking)
{
return _db.Site.Find(siteId);
return ctx.Site.Find(siteId);
}
else
{
return _db.Site.AsNoTracking().FirstOrDefault(item => item.SiteId == siteId);
return ctx.Site.AsNoTracking().FirstOrDefault(item => item.SiteId == siteId);
}
}
public void DeleteSite(int siteId)
{
var site = _db.Site.Find(siteId);
_db.Site.Remove(site);
_db.SaveChanges();
using var ctx = _factory.CreateDbContext();
var site = ctx.Site.Find(siteId);
ctx.Site.Remove(site);
ctx.SaveChanges();
}

View File

@ -8,12 +8,14 @@ namespace Oqtane.Repository
{
public class UrlMappingRepository : IUrlMappingRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly ISiteRepository _sites;
public UrlMappingRepository(TenantDBContext context, ISiteRepository sites)
public UrlMappingRepository(IDbContextFactory<TenantDBContext> dbContextFactory, ISiteRepository sites)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
_sites = sites;
}
@ -21,49 +23,54 @@ namespace Oqtane.Repository
{
if (isMapped)
{
return _db.UrlMapping.Where(item => item.SiteId == siteId && !string.IsNullOrEmpty(item.MappedUrl)).Take(200);
return _queryContext.UrlMapping.Where(item => item.SiteId == siteId && !string.IsNullOrEmpty(item.MappedUrl)).Take(200);
}
else
{
return _db.UrlMapping.Where(item => item.SiteId == siteId && string.IsNullOrEmpty(item.MappedUrl)).Take(200);
return _queryContext.UrlMapping.Where(item => item.SiteId == siteId && string.IsNullOrEmpty(item.MappedUrl)).Take(200);
}
}
public UrlMapping AddUrlMapping(UrlMapping urlMapping)
{
_db.UrlMapping.Add(urlMapping);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.UrlMapping.Add(urlMapping);
db.SaveChanges();
return urlMapping;
}
public UrlMapping UpdateUrlMapping(UrlMapping urlMapping)
{
_db.Entry(urlMapping).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(urlMapping).State = EntityState.Modified;
db.SaveChanges();
return urlMapping;
}
public UrlMapping GetUrlMapping(int urlMappingId)
{
using var db = _dbContextFactory.CreateDbContext();
return GetUrlMapping(urlMappingId, true);
}
public UrlMapping GetUrlMapping(int urlMappingId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.UrlMapping.Find(urlMappingId);
return db.UrlMapping.Find(urlMappingId);
}
else
{
return _db.UrlMapping.AsNoTracking().FirstOrDefault(item => item.UrlMappingId == urlMappingId);
return db.UrlMapping.AsNoTracking().FirstOrDefault(item => item.UrlMappingId == urlMappingId);
}
}
public UrlMapping GetUrlMapping(int siteId, string url)
{
using var db = _dbContextFactory.CreateDbContext();
url = (url.Length > 750) ? url.Substring(0, 750) : url;
var urlMapping = _db.UrlMapping.Where(item => item.SiteId == siteId && item.Url == url).FirstOrDefault();
var urlMapping = db.UrlMapping.Where(item => item.SiteId == siteId && item.Url == url).FirstOrDefault();
if (urlMapping == null)
{
var site = _sites.GetSite(siteId);
@ -90,9 +97,10 @@ namespace Oqtane.Repository
public void DeleteUrlMapping(int urlMappingId)
{
UrlMapping urlMapping = _db.UrlMapping.Find(urlMappingId);
_db.UrlMapping.Remove(urlMapping);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
UrlMapping urlMapping = db.UrlMapping.Find(urlMappingId);
db.UrlMapping.Remove(urlMapping);
db.SaveChanges();
}
}
}

View File

@ -8,14 +8,16 @@ namespace Oqtane.Repository
{
public class UserRepository : IUserRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly IFolderRepository _folders;
private readonly IRoleRepository _roles;
private readonly IUserRoleRepository _userroles;
public UserRepository(TenantDBContext context, IFolderRepository folders, IRoleRepository roles, IUserRoleRepository userroles)
public UserRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IFolderRepository folders, IRoleRepository roles, IUserRoleRepository userroles)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
_folders = folders;
_roles = roles;
_userroles = userroles;
@ -23,25 +25,26 @@ namespace Oqtane.Repository
public IEnumerable<User> GetUsers()
{
return _db.User;
return _queryContext.User;
}
public User AddUser(User user)
{
if (_db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null)
using var db = _dbContextFactory.CreateDbContext();
if (db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null)
{
_db.User.Add(user);
_db.SaveChanges();
db.User.Add(user);
db.SaveChanges();
}
else
{
int siteId = user.SiteId;
user = _db.User.AsNoTracking().First(item => item.Username == user.Username);
user = db.User.AsNoTracking().First(item => item.Username == user.Username);
user.SiteId = siteId;
}
// add folder for user
Folder folder = _folders.GetFolder(user.SiteId, "Users/");
var folder = _folders.GetFolder(user.SiteId, "Users/");
if (folder != null)
{
_folders.AddFolder(new Folder
@ -65,10 +68,10 @@ namespace Oqtane.Repository
}
// add auto assigned roles to user for site
List<Role> roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList();
foreach (Role role in roles)
var roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList();
foreach (var role in roles)
{
UserRole userrole = new UserRole();
var userrole = new UserRole();
userrole.UserId = user.UserId;
userrole.RoleId = role.RoleId;
userrole.EffectiveDate = null;
@ -81,8 +84,9 @@ namespace Oqtane.Repository
public User UpdateUser(User user)
{
_db.Entry(user).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return user;
}
@ -93,13 +97,14 @@ namespace Oqtane.Repository
public User GetUser(int userId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.User.Find(userId);
return db.User.Find(userId);
}
else
{
return _db.User.AsNoTracking().FirstOrDefault(item => item.UserId == userId);
return db.User.AsNoTracking().FirstOrDefault(item => item.UserId == userId);
}
}
@ -110,23 +115,25 @@ namespace Oqtane.Repository
public User GetUser(string username, string email)
{
using var db = _dbContextFactory.CreateDbContext();
User user = null;
if (!string.IsNullOrEmpty(username))
{
user = _db.User.Where(item => item.Username == username).FirstOrDefault();
user = db.User.Where(item => item.Username == username).FirstOrDefault();
}
if (user == null && !string.IsNullOrEmpty(email))
{
user = _db.User.Where(item => item.Email == email).FirstOrDefault();
user = db.User.Where(item => item.Email == email).FirstOrDefault();
}
return user;
}
public void DeleteUser(int userId)
{
User user = _db.User.Find(userId);
_db.User.Remove(user);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var user = db.User.Find(userId);
db.User.Remove(user);
db.SaveChanges();
}
}
}

View File

@ -8,18 +8,20 @@ namespace Oqtane.Repository
{
public class UserRoleRepository : IUserRoleRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
private readonly IRoleRepository _roles;
public UserRoleRepository(TenantDBContext context, IRoleRepository roles)
public UserRoleRepository(IDbContextFactory<TenantDBContext> dbContextFactory, IRoleRepository roles)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
_roles = roles;
}
public IEnumerable<UserRole> GetUserRoles(int siteId)
{
return _db.UserRole
return _queryContext.UserRole
.Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users
.Where(item => item.Role.SiteId == siteId || item.Role.SiteId == null);
@ -27,7 +29,7 @@ namespace Oqtane.Repository
public IEnumerable<UserRole> GetUserRoles(int userId, int siteId)
{
return _db.UserRole.Where(item => item.UserId == userId)
return _queryContext.UserRole.Where(item => item.UserId == userId)
.Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users
.Where(item => item.Role.SiteId == siteId || item.Role.SiteId == null || siteId == -1);
@ -35,8 +37,9 @@ namespace Oqtane.Repository
public UserRole AddUserRole(UserRole userRole)
{
_db.UserRole.Add(userRole);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.UserRole.Add(userRole);
db.SaveChanges();
// host roles can only exist at global level - remove any site specific user roles
var role = _roles.GetRole(userRole.RoleId);
@ -50,8 +53,9 @@ namespace Oqtane.Repository
public UserRole UpdateUserRole(UserRole userRole)
{
_db.Entry(userRole).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(userRole).State = EntityState.Modified;
db.SaveChanges();
return userRole;
}
@ -62,16 +66,17 @@ namespace Oqtane.Repository
public UserRole GetUserRole(int userRoleId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.UserRole
return db.UserRole
.Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users
.FirstOrDefault(item => item.UserRoleId == userRoleId);
}
else
{
return _db.UserRole.AsNoTracking()
return db.UserRole.AsNoTracking()
.Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users
.FirstOrDefault(item => item.UserRoleId == userRoleId);
@ -85,16 +90,17 @@ namespace Oqtane.Repository
public UserRole GetUserRole(int userId, int roleId, bool tracking)
{
using var db = _dbContextFactory.CreateDbContext();
if (tracking)
{
return _db.UserRole
return db.UserRole
.Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users
.FirstOrDefault(item => item.UserId == userId && item.RoleId == roleId);
}
else
{
return _db.UserRole.AsNoTracking()
return db.UserRole.AsNoTracking()
.Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users
.FirstOrDefault(item => item.UserId == userId && item.RoleId == roleId);
@ -103,18 +109,20 @@ namespace Oqtane.Repository
public void DeleteUserRole(int userRoleId)
{
UserRole userRole = _db.UserRole.Find(userRoleId);
_db.UserRole.Remove(userRole);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var userRole = db.UserRole.Find(userRoleId);
db.UserRole.Remove(userRole);
db.SaveChanges();
}
public void DeleteUserRoles(int userId)
{
foreach (UserRole userRole in _db.UserRole.Where(item => item.UserId == userId && item.Role.SiteId != null))
using var db = _dbContextFactory.CreateDbContext();
foreach (var userRole in db.UserRole.Where(item => item.UserId == userId && item.Role.SiteId != null))
{
_db.UserRole.Remove(userRole);
db.UserRole.Remove(userRole);
}
_db.SaveChanges();
db.SaveChanges();
}
}
}

View File

@ -8,64 +8,72 @@ namespace Oqtane.Repository
{
public class VisitorRepository : IVisitorRepository
{
private TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _dbContextFactory;
private readonly TenantDBContext _queryContext;
public VisitorRepository(TenantDBContext context)
public VisitorRepository(IDbContextFactory<TenantDBContext> dbContextFactory)
{
_db = context;
_dbContextFactory = dbContextFactory;
_queryContext = _dbContextFactory.CreateDbContext();
}
public IEnumerable<Visitor> GetVisitors(int siteId, DateTime fromDate)
{
return _db.Visitor.AsNoTracking()
return _queryContext.Visitor.AsNoTracking()
.Include(item => item.User) // eager load users
.Where(item => item.SiteId == siteId && item.VisitedOn >= fromDate);
}
public Visitor AddVisitor(Visitor visitor)
{
_db.Visitor.Add(visitor);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Visitor.Add(visitor);
db.SaveChanges();
return visitor;
}
public Visitor UpdateVisitor(Visitor visitor)
{
_db.Entry(visitor).State = EntityState.Modified;
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
db.Entry(visitor).State = EntityState.Modified;
db.SaveChanges();
return visitor;
}
public Visitor GetVisitor(int visitorId)
{
return _db.Visitor.Find(visitorId);
using var db = _dbContextFactory.CreateDbContext();
return db.Visitor.Find(visitorId);
}
public Visitor GetVisitor(int siteId, string IPAddress)
{
return _db.Visitor.FirstOrDefault(item => item.SiteId == siteId && item.IPAddress == IPAddress);
using var db = _dbContextFactory.CreateDbContext();
return db.Visitor.FirstOrDefault(item => item.SiteId == siteId && item.IPAddress == IPAddress);
}
public void DeleteVisitor(int visitorId)
{
Visitor visitor = _db.Visitor.Find(visitorId);
_db.Visitor.Remove(visitor);
_db.SaveChanges();
using var db = _dbContextFactory.CreateDbContext();
var visitor = db.Visitor.Find(visitorId);
db.Visitor.Remove(visitor);
db.SaveChanges();
}
public int DeleteVisitors(int siteId, int age)
{
using var db = _dbContextFactory.CreateDbContext();
// delete visitors in batches of 100 records
int count = 0;
var count = 0;
var purgedate = DateTime.UtcNow.AddDays(-age);
var visitors = _db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate)
var visitors = db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate)
.OrderBy(item => item.VisitedOn).Take(100).ToList();
while (visitors.Count > 0)
{
count += visitors.Count;
_db.Visitor.RemoveRange(visitors);
_db.SaveChanges();
visitors = _db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate)
db.Visitor.RemoveRange(visitors);
db.SaveChanges();
visitors = db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate)
.OrderBy(item => item.VisitedOn).Take(100).ToList();
}
return count;

View File

@ -8,16 +8,18 @@ namespace [Owner].Module.[Module].Repository
{
public class [Module]Repository : I[Module]Repository, ITransientService
{
private readonly [Module]Context _db;
private readonly IDbContextFactory<[Module]Context> _factory;
private readonly [Module]Context _queryContext;
public [Module]Repository([Module]Context context)
public [Module]Repository(IDbContextFactory<[Module]Context> factory)
{
_db = context;
_factory = factory;
_queryContext = _factory.CreateDbContext();
}
public IEnumerable<Models.[Module]> Get[Module]s(int ModuleId)
{
return _db.[Module].Where(item => item.ModuleId == ModuleId);
return _queryContext.[Module].Where(item => item.ModuleId == ModuleId);
}
public Models.[Module] Get[Module](int [Module]Id)
@ -27,35 +29,39 @@ namespace [Owner].Module.[Module].Repository
public Models.[Module] Get[Module](int [Module]Id, bool tracking)
{
using var db = _factory.CreateDbContext();
if (tracking)
{
return _db.[Module].Find([Module]Id);
return db.[Module].Find([Module]Id);
}
else
{
return _db.[Module].AsNoTracking().FirstOrDefault(item => item.[Module]Id == [Module]Id);
return db.[Module].AsNoTracking().FirstOrDefault(item => item.[Module]Id == [Module]Id);
}
}
public Models.[Module] Add[Module](Models.[Module] [Module])
{
_db.[Module].Add([Module]);
_db.SaveChanges();
using var db = _factory.CreateDbContext();
db.[Module].Add([Module]);
db.SaveChanges();
return [Module];
}
public Models.[Module] Update[Module](Models.[Module] [Module])
{
_db.Entry([Module]).State = EntityState.Modified;
_db.SaveChanges();
using var db = _factory.CreateDbContext();
db.Entry([Module]).State = EntityState.Modified;
db.SaveChanges();
return [Module];
}
public void Delete[Module](int [Module]Id)
{
Models.[Module] [Module] = _db.[Module].Find([Module]Id);
_db.[Module].Remove([Module]);
_db.SaveChanges();
using var db = _factory.CreateDbContext();
Models.[Module] [Module] = db.[Module].Find([Module]Id);
db.[Module].Remove([Module]);
db.SaveChanges();
}
}
}