introducing Site Groups

This commit is contained in:
sbwalker
2026-01-27 16:51:30 -05:00
parent 6006e6f63c
commit 3be2b9c720
51 changed files with 2558 additions and 352 deletions

View File

@@ -19,7 +19,7 @@ using Microsoft.Extensions.Caching.Memory;
namespace Oqtane.Modules.HtmlText.Manager
{
[PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
public class HtmlTextManager : MigratableModuleBase, IInstallable, IPortable, ISearchable
public class HtmlTextManager : MigratableModuleBase, IInstallable, IPortable, ISynchronizable, ISearchable
{
private readonly IHtmlTextRepository _htmlText;
private readonly IDBContextDependencies _DBContextDependencies;
@@ -41,7 +41,45 @@ namespace Oqtane.Modules.HtmlText.Manager
_cache = cache;
}
// IInstallable implementation
public bool Install(Tenant tenant, string version)
{
if (tenant.DBType == Constants.DefaultDBType && version == "1.0.1")
{
// version 1.0.0 used SQL scripts rather than migrations, so we need to seed the migration history table
_sqlRepository.ExecuteNonQuery(tenant, MigrationUtils.BuildInsertScript("HtmlText.01.00.00.00"));
}
return Migrate(new HtmlTextContext(_DBContextDependencies), tenant, MigrationType.Up);
}
public bool Uninstall(Tenant tenant)
{
return Migrate(new HtmlTextContext(_DBContextDependencies), tenant, MigrationType.Down);
}
// IPortable implementation
public string ExportModule(Module module)
{
return GetModuleContent(module);
}
public void ImportModule(Module module, string content, string version)
{
SaveModuleContent(module, content, version);
}
// ISynchronizable implementation
public string ExtractModule(Module module)
{
return GetModuleContent(module);
}
public void LoadModule(Module module, string content, string version)
{
SaveModuleContent(module, content, version);
}
private string GetModuleContent(Module module)
{
string content = "";
var htmltexts = _htmlText.GetHtmlTexts(module.ModuleId);
@@ -53,6 +91,23 @@ namespace Oqtane.Modules.HtmlText.Manager
return content;
}
private void SaveModuleContent(Module module, string content, string version)
{
content = WebUtility.HtmlDecode(content);
var htmlText = new Models.HtmlText();
htmlText.ModuleId = module.ModuleId;
htmlText.Content = content;
_htmlText.AddHtmlText(htmlText);
//clear the cache for the module
var alias = _tenantManager.GetAlias();
if (alias != null)
{
_cache.Remove($"HtmlText:{alias.SiteKey}:{module.ModuleId}");
}
}
// ISearchable implementation
public Task<List<SearchContent>> GetSearchContentsAsync(PageModule pageModule, DateTime lastIndexedOn)
{
var searchContents = new List<SearchContent>();
@@ -70,36 +125,5 @@ namespace Oqtane.Modules.HtmlText.Manager
return Task.FromResult(searchContents);
}
public void ImportModule(Module module, string content, string version)
{
content = WebUtility.HtmlDecode(content);
var htmlText = new Models.HtmlText();
htmlText.ModuleId = module.ModuleId;
htmlText.Content = content;
_htmlText.AddHtmlText(htmlText);
//clear the cache for the module
var alias = _tenantManager.GetAlias();
if(alias != null)
{
_cache.Remove($"HtmlText:{alias.SiteKey}:{module.ModuleId}");
}
}
public bool Install(Tenant tenant, string version)
{
if (tenant.DBType == Constants.DefaultDBType && version == "1.0.1")
{
// version 1.0.0 used SQL scripts rather than migrations, so we need to seed the migration history table
_sqlRepository.ExecuteNonQuery(tenant, MigrationUtils.BuildInsertScript("HtmlText.01.00.00.00"));
}
return Migrate(new HtmlTextContext(_DBContextDependencies), tenant, MigrationType.Up);
}
public bool Uninstall(Tenant tenant)
{
return Migrate(new HtmlTextContext(_DBContextDependencies), tenant, MigrationType.Down);
}
}
}

View File

@@ -2,17 +2,29 @@ using System.Linq;
using Oqtane.Documentation;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Oqtane.Repository;
namespace Oqtane.Modules.HtmlText.Repository
{
[PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
public interface IHtmlTextRepository
{
IEnumerable<Models.HtmlText> GetHtmlTexts(int moduleId);
Models.HtmlText GetHtmlText(int htmlTextId);
Models.HtmlText AddHtmlText(Models.HtmlText htmlText);
void DeleteHtmlText(int htmlTextId);
}
[PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
public class HtmlTextRepository : IHtmlTextRepository, ITransientService
{
private readonly IDbContextFactory<HtmlTextContext> _factory;
private readonly IModuleRepository _moduleRepository;
public HtmlTextRepository(IDbContextFactory<HtmlTextContext> factory)
public HtmlTextRepository(IDbContextFactory<HtmlTextContext> factory, IModuleRepository moduleRepository)
{
_factory = factory;
_moduleRepository = moduleRepository;
}
public IEnumerable<Models.HtmlText> GetHtmlTexts(int moduleId)
@@ -32,6 +44,11 @@ namespace Oqtane.Modules.HtmlText.Repository
using var db = _factory.CreateDbContext();
db.HtmlText.Add(htmlText);
db.SaveChanges();
// update module ModifiedOn date
var module = _moduleRepository.GetModule(htmlText.ModuleId);
_moduleRepository.UpdateModule(module);
return htmlText;
}
@@ -39,8 +56,15 @@ namespace Oqtane.Modules.HtmlText.Repository
{
using var db = _factory.CreateDbContext();
Models.HtmlText htmlText = db.HtmlText.FirstOrDefault(item => item.HtmlTextId == htmlTextId);
if (htmlText != null) db.HtmlText.Remove(htmlText);
db.SaveChanges();
if (htmlText != null)
{
db.HtmlText.Remove(htmlText);
db.SaveChanges();
// update module ModifiedOn date
var module = _moduleRepository.GetModule(htmlText.ModuleId);
_moduleRepository.UpdateModule(module);
}
}
}
}

View File

@@ -1,14 +0,0 @@
using System.Collections.Generic;
using Oqtane.Documentation;
namespace Oqtane.Modules.HtmlText.Repository
{
[PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
public interface IHtmlTextRepository
{
IEnumerable<Models.HtmlText> GetHtmlTexts(int moduleId);
Models.HtmlText GetHtmlText(int htmlTextId);
Models.HtmlText AddHtmlText(Models.HtmlText htmlText);
void DeleteHtmlText(int htmlTextId);
}
}

View File

@@ -0,0 +1,13 @@
using Oqtane.Models;
namespace Oqtane.Modules
{
public interface ISynchronizable
{
// You Must Set The "ServerManagerType" In Your IModule Interface
string ExtractModule(Module module);
void LoadModule(Module module, string content, string version);
}
}