diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index b89cb778..9aa6090f 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -480,10 +480,11 @@
- +
@@ -517,7 +518,7 @@ @if (_siteGroupId != -1 && _siteId != -1) {
- +
- @if (_primary == "False" && _groupType == SiteGroupTypes.Synchronization) + @if (_primary == "False" && (_groupType == SiteGroupTypes.Synchronization || _groupType == SiteGroupTypes.Comparison)) {
- -
- -
-
-
- +
@@ -678,7 +670,6 @@ private string _groupName = string.Empty; private string _groupType = SiteGroupTypes.Synchronization; private string _primary = "True"; - private string _notify = "True"; private string _synchronized = string.Empty; private bool _addSiteGroup = false; private bool _addSiteGroupMember = false; @@ -1304,7 +1295,6 @@ if (siteGroupMember != null) { _primary = (siteGroupMember.SiteGroup.PrimarySiteId == _siteId) ? "True" : "False"; - _notify = siteGroupMember.Notify.ToString(); _synchronized = UtcToLocal(siteGroupMember.SynchronizedOn).ToString(); } } @@ -1317,7 +1307,6 @@ if (siteGroupMember != null) { _primary = (siteGroupMember.SiteGroup.PrimarySiteId == _siteId) ? "True" : "False"; - _notify = siteGroupMember.Notify.ToString(); _synchronized = UtcToLocal(siteGroupMember.SynchronizedOn).ToString(); } StateHasChanged(); @@ -1338,29 +1327,33 @@ _siteId = -1; await LoadSites(); } - + private async Task SaveSiteGroupMember() { + if (string.IsNullOrEmpty(_groupName)) + { + AddModuleMessage(Localizer["Message.Required.GroupName"], MessageType.Warning); + await ScrollToPageTop(); + return; + } + SiteGroup siteGroup = null; if (_siteGroupId == -1) { - if (!string.IsNullOrEmpty(_groupName)) + siteGroup = new SiteGroup { - siteGroup = new SiteGroup - { - Name = _groupName, - Type = _groupType, - PrimarySiteId = _siteId, - Synchronize = false - }; - siteGroup = await SiteGroupService.AddSiteGroupAsync(siteGroup); - } + Name = _groupName, + Type = _groupType, + PrimarySiteId = _siteId, + Synchronize = false + }; + siteGroup = await SiteGroupService.AddSiteGroupAsync(siteGroup); } else { siteGroup = _siteGroups.FirstOrDefault(item => item.SiteGroupId == _siteGroupId); - if (siteGroup != null && !string.IsNullOrEmpty(_groupName)) + if (siteGroup != null) { siteGroup.Name = _groupName; siteGroup.Type = _groupType; @@ -1375,22 +1368,23 @@ if (siteGroup != null) { - var siteGroupMember = await SiteGroupMemberService.GetSiteGroupMemberAsync(_siteId, siteGroup.SiteGroupId); - if (siteGroupMember == null) + if (_siteId != -1) { - siteGroupMember = new SiteGroupMember + var siteGroupMember = await SiteGroupMemberService.GetSiteGroupMemberAsync(_siteId, siteGroup.SiteGroupId); + if (siteGroupMember == null) { - SiteGroupId = siteGroup.SiteGroupId, - SiteId = _siteId, - Notify = bool.Parse(_notify) - }; - await SiteGroupMemberService.AddSiteGroupMemberAsync(siteGroupMember); - } - else - { - siteGroupMember.Notify = bool.Parse(_notify); - siteGroupMember.SynchronizedOn = string.IsNullOrEmpty(_synchronized) ? null : siteGroupMember.SynchronizedOn; - await SiteGroupMemberService.UpdateSiteGroupMemberAsync(siteGroupMember); + siteGroupMember = new SiteGroupMember + { + SiteGroupId = siteGroup.SiteGroupId, + SiteId = _siteId + }; + await SiteGroupMemberService.AddSiteGroupMemberAsync(siteGroupMember); + } + else + { + siteGroupMember.SynchronizedOn = string.IsNullOrEmpty(_synchronized) ? null : siteGroupMember.SynchronizedOn; + await SiteGroupMemberService.UpdateSiteGroupMemberAsync(siteGroupMember); + } } if (siteGroup.Type == SiteGroupTypes.Synchronization) @@ -1407,11 +1401,6 @@ await LoadSiteGroups(); } - else - { - AddModuleMessage(Localizer["Message.Required.GroupName"], MessageType.Warning); - await ScrollToPageTop(); - } } private async Task CancelSiteGroupMember() diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 3ea74b8e..b12fb46d 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -508,7 +508,7 @@ Primary? - Indicates if the selected site is the primary member of the site group + Indicates if the selected member is the primary site of the site group Name: @@ -535,17 +535,11 @@ Are You Sure You Wish To Delete This Member From The Site Group? - Group Name Is Required + Site Group Name Is Required Site Submitted For Synchronization - - Notify? - - - Specifies if site administrators should be notified of any synchronization activity - Members: @@ -559,10 +553,10 @@ Type: - The site group type (ie. synchronization, localization) + The site group type (ie. synchronization, comparison, localization) - The date/time of the last synchronization for the site + The date/time when the site was last synchronized Synchronization @@ -570,4 +564,7 @@ Localization + + Comparison + \ No newline at end of file diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor index 91860090..15fe5b3a 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor @@ -35,9 +35,10 @@
- @if (_siteGroups.Any(item => item.Type == SiteGroupTypes.Synchronization)) + @if (_siteGroups.Any(item => item.Type == SiteGroupTypes.Synchronization || item.Type == SiteGroupTypes.Comparison)) { - +
+ }
} @@ -641,7 +642,7 @@ private async Task SynchronizeSite() { - foreach (var group in _siteGroups.Where(item => item.Type == SiteGroupTypes.Synchronization)) + foreach (var group in _siteGroups.Where(item => item.Type == SiteGroupTypes.Synchronization || item.Type == SiteGroupTypes.Comparison)) { group.Synchronize = true; await SiteGroupService.UpdateSiteGroupAsync(group); diff --git a/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs b/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs index 6b8c3897..3fb1513b 100644 --- a/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs @@ -53,7 +53,7 @@ namespace Oqtane.Infrastructure var siteGroups = siteGroupRepository.GetSiteGroups(); // iterate through site groups which need to be synchronized - foreach (var siteGroup in siteGroups.Where(item => item.Type == SiteGroupTypes.Synchronization && item.Synchronize)) + foreach (var siteGroup in siteGroups.Where(item => item.Synchronize && (item.Type == SiteGroupTypes.Synchronization || item.Type == SiteGroupTypes.Comparison))) { // get data if (siteGroupMembers == null) @@ -64,7 +64,8 @@ namespace Oqtane.Infrastructure } var aliasName = "https://" + aliases.First(item => item.TenantId == tenantManager.GetTenant().TenantId && item.SiteId == siteGroup.PrimarySiteId && item.IsDefault).Name; - log += $"Processing Primary Site: {sites.First(item => item.SiteId == siteGroup.PrimarySiteId).Name} - {CreateLink(aliasName)}
"; + log += (siteGroup.Type == SiteGroupTypes.Synchronization) ? "Synchronizing " : "Comparing "; + log += $"Primary Site: {sites.First(item => item.SiteId == siteGroup.PrimarySiteId).Name} - {CreateLink(aliasName)}
"; // get primary site var primarySite = sites.FirstOrDefault(item => item.SiteId == siteGroup.PrimarySiteId); @@ -90,14 +91,14 @@ namespace Oqtane.Infrastructure siteGroupMember.SynchronizedOn = DateTime.MinValue; } - // replicate site - var siteLog = ReplicateSite(provider, tenantManager, settingRepository, siteGroupMember, primarySite, secondarySite); + // synchronize site + var siteLog = SynchronizeSite(provider, tenantManager, settingRepository, siteGroupMember, primarySite, secondarySite); // set synchronized on date/time siteGroupMember.SynchronizedOn = DateTime.UtcNow; siteGroupMemberRepository.UpdateSiteGroupMember(siteGroupMember); - log += $"Processed Secondary Site: {secondarySite.Name} - {CreateLink(siteGroupMember.AliasName)}
" + siteLog; + log += $"With Secondary Site: {secondarySite.Name} - {CreateLink(siteGroupMember.AliasName)}
" + siteLog; } else { @@ -119,20 +120,20 @@ namespace Oqtane.Infrastructure return log; } - private string ReplicateSite(IServiceProvider provider, ITenantManager tenantManager, ISettingRepository settingRepository, SiteGroupMember siteGroupMember, Site primarySite, Site secondarySite) + private string SynchronizeSite(IServiceProvider provider, ITenantManager tenantManager, ISettingRepository settingRepository, SiteGroupMember siteGroupMember, Site primarySite, Site secondarySite) { var log = ""; - // replicate roles/users - log += ReplicateRoles(provider, settingRepository, siteGroupMember, primarySite.SiteId, secondarySite.SiteId); + // synchronize roles/users + log += SynchronizeRoles(provider, settingRepository, siteGroupMember, primarySite.SiteId, secondarySite.SiteId); - // replicate folders/files - log += ReplicateFolders(provider, settingRepository, siteGroupMember, primarySite.SiteId, secondarySite.SiteId); + // synchronize folders/files + log += SynchronizeFolders(provider, settingRepository, siteGroupMember, primarySite.SiteId, secondarySite.SiteId); - // replicate pages/modules - log += ReplicatePages(provider, settingRepository, tenantManager, siteGroupMember, primarySite.SiteId, secondarySite.SiteId); + // synchronize pages/modules + log += SynchronizePages(provider, settingRepository, tenantManager, siteGroupMember, primarySite.SiteId, secondarySite.SiteId); - // replicate site + // synchronize site if (primarySite.ModifiedOn > siteGroupMember.SynchronizedOn) { secondarySite.TimeZoneId = primarySite.TimeZoneId; @@ -177,23 +178,26 @@ namespace Oqtane.Infrastructure secondarySite.DeletedBy = primarySite.DeletedBy; secondarySite.DeletedOn = primarySite.DeletedOn; - var siteRepository = provider.GetRequiredService(); - siteRepository.UpdateSite(secondarySite); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + var siteRepository = provider.GetRequiredService(); + siteRepository.UpdateSite(secondarySite); + } log += Log(siteGroupMember, $"Site Updated: {secondarySite.Name}"); } // site settings - log += ReplicateSettings(settingRepository, siteGroupMember, EntityNames.Site, primarySite.SiteId, secondarySite.SiteId); + log += SynchronizeSettings(settingRepository, siteGroupMember, EntityNames.Site, primarySite.SiteId, secondarySite.SiteId); if (siteGroupMember.SynchronizedOn == DateTime.MinValue || !string.IsNullOrEmpty(log)) { - // clear cache for secondary site if any content was replicated + // clear cache for secondary site if any content was Synchronized var syncManager = provider.GetRequiredService(); var alias = new Alias { TenantId = tenantManager.GetTenant().TenantId, SiteId = secondarySite.SiteId }; syncManager.AddSyncEvent(alias, EntityNames.Site, secondarySite.SiteId, SyncEventActions.Refresh); } - if (!string.IsNullOrEmpty(log) && siteGroupMember.Notify) + if (!string.IsNullOrEmpty(log) && siteGroupMember.SiteGroup.Type == SiteGroupTypes.Comparison) { // send change log to administrators SendNotifications(provider, secondarySite.SiteId, secondarySite.Name, log); @@ -213,7 +217,7 @@ namespace Oqtane.Infrastructure return fileId; } - private string ReplicateRoles(IServiceProvider provider, ISettingRepository settingRepository, SiteGroupMember siteGroupMember, int primarySiteId, int secondarySiteId) + private string SynchronizeRoles(IServiceProvider provider, ISettingRepository settingRepository, SiteGroupMember siteGroupMember, int primarySiteId, int secondarySiteId) { // get roles var roleRepository = provider.GetRequiredService(); @@ -242,12 +246,18 @@ namespace Oqtane.Infrastructure if (role == null) { - roleRepository.AddRole(secondaryRole); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + roleRepository.AddRole(secondaryRole); + } log += Log(siteGroupMember, $"Role Added: {secondaryRole.Name}"); } else { - roleRepository.UpdateRole(secondaryRole); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + roleRepository.UpdateRole(secondaryRole); + } log += Log(siteGroupMember, $"Role Updated: {secondaryRole.Name}"); secondaryRoles.Remove(role); } @@ -257,17 +267,20 @@ namespace Oqtane.Infrastructure // remove roles in the secondary site which do not exist in the primary site foreach (var secondaryRole in secondaryRoles.Where(item => !primaryRoles.Select(item => item.Name).Contains(item.Name))) { - roleRepository.DeleteRole(secondaryRole.RoleId); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + roleRepository.DeleteRole(secondaryRole.RoleId); + } log += Log(siteGroupMember, $"Role Deleted: {secondaryRole.Name}"); } // settings - log += ReplicateSettings(settingRepository, siteGroupMember, EntityNames.Role, primarySiteId, secondarySiteId); + log += SynchronizeSettings(settingRepository, siteGroupMember, EntityNames.Role, primarySiteId, secondarySiteId); return log; } - private string ReplicateFolders(IServiceProvider provider, ISettingRepository settingRepository, SiteGroupMember siteGroupMember, int primarySiteId, int secondarySiteId) + private string SynchronizeFolders(IServiceProvider provider, ISettingRepository settingRepository, SiteGroupMember siteGroupMember, int primarySiteId, int secondarySiteId) { var folderRepository = provider.GetRequiredService(); var fileRepository = provider.GetRequiredService(); @@ -308,23 +321,29 @@ namespace Oqtane.Infrastructure secondaryFolder.Capacity = primaryFolder.Capacity; secondaryFolder.ImageSizes = primaryFolder.ImageSizes; secondaryFolder.IsSystem = primaryFolder.IsSystem; - secondaryFolder.PermissionList = ReplicatePermissions(primaryFolder.PermissionList, secondarySiteId); + secondaryFolder.PermissionList = SynchronizePermissions(primaryFolder.PermissionList, secondarySiteId); if (folder == null) { - folderRepository.AddFolder(secondaryFolder); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + folderRepository.AddFolder(secondaryFolder); + } log += Log(siteGroupMember, $"Folder Added: {secondaryFolder.Path}"); } else { - folderRepository.UpdateFolder(secondaryFolder); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + folderRepository.UpdateFolder(secondaryFolder); + } log += Log(siteGroupMember, $"Folder Updated: {secondaryFolder.Path}"); secondaryFolders.Remove(folder); } } // folder settings - log += ReplicateSettings(settingRepository, siteGroupMember, EntityNames.Folder, primaryFolder.FolderId, secondaryFolder.FolderId); + log += SynchronizeSettings(settingRepository, siteGroupMember, EntityNames.Folder, primaryFolder.FolderId, secondaryFolder.FolderId); // get files for folder var primaryFiles = fileRepository.GetFiles(primaryFolder.FolderId); @@ -353,14 +372,20 @@ namespace Oqtane.Infrastructure if (file == null) { - fileRepository.AddFile(secondaryFile); - ReplicateFile(folderRepository, primaryFolder, primaryFile, secondaryFolder, secondaryFile); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + fileRepository.AddFile(secondaryFile); + SynchronizeFile(folderRepository, primaryFolder, primaryFile, secondaryFolder, secondaryFile); + } log += Log(siteGroupMember, $"File Added: {CreateLink(siteGroupMember.AliasName + secondaryFolder.Path + secondaryFile.Name)}"); } else { - fileRepository.UpdateFile(secondaryFile); - ReplicateFile(folderRepository, primaryFolder, primaryFile, secondaryFolder, secondaryFile); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + fileRepository.UpdateFile(secondaryFile); + SynchronizeFile(folderRepository, primaryFolder, primaryFile, secondaryFolder, secondaryFile); + } log += Log(siteGroupMember, $"File Updated: {CreateLink(siteGroupMember.AliasName + secondaryFolder.Path + secondaryFile.Name)}"); secondaryFiles.Remove(file); } @@ -370,9 +395,12 @@ namespace Oqtane.Infrastructure // remove files in the secondary site which do not exist in the primary site foreach (var secondaryFile in secondaryFiles.Where(item => !primaryFiles.Select(item => item.Name).Contains(item.Name))) { - fileRepository.DeleteFile(secondaryFile.FileId); - var secondaryPath = Path.Combine(folderRepository.GetFolderPath(secondaryFolder), secondaryFile.Name); - System.IO.File.Delete(secondaryPath); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + fileRepository.DeleteFile(secondaryFile.FileId); + var secondaryPath = Path.Combine(folderRepository.GetFolderPath(secondaryFolder), secondaryFile.Name); + System.IO.File.Delete(secondaryPath); + } log += Log(siteGroupMember, $"File Deleted: {CreateLink(siteGroupMember.AliasName + secondaryFolder.Path + secondaryFile.Name)}"); } } @@ -380,14 +408,17 @@ namespace Oqtane.Infrastructure // remove folders in the secondary site which do not exist in the primary site foreach (var secondaryFolder in secondaryFolders.Where(item => !primaryFolders.Select(item => item.Path).Contains(item.Path))) { - folderRepository.DeleteFolder(secondaryFolder.FolderId); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + folderRepository.DeleteFolder(secondaryFolder.FolderId); + } log += Log(siteGroupMember, $"Folder Deleted: {secondaryFolder.Path}"); } return log; } - private void ReplicateFile(IFolderRepository folderRepository, Folder primaryFolder, Models.File primaryFile, Folder secondaryFolder, Models.File secondaryFile) + private void SynchronizeFile(IFolderRepository folderRepository, Folder primaryFolder, Models.File primaryFile, Folder secondaryFolder, Models.File secondaryFile) { var primaryPath = Path.Combine(folderRepository.GetFolderPath(primaryFolder), primaryFile.Name); if (System.IO.File.Exists(primaryPath)) @@ -401,7 +432,7 @@ namespace Oqtane.Infrastructure } } - private string ReplicatePages(IServiceProvider provider, ISettingRepository settingRepository, ITenantManager tenantManager, SiteGroupMember siteGroupMember, int primarySiteId, int secondarySiteId) + private string SynchronizePages(IServiceProvider provider, ISettingRepository settingRepository, ITenantManager tenantManager, SiteGroupMember siteGroupMember, int primarySiteId, int secondarySiteId) { var pageRepository = provider.GetRequiredService(); var pageModuleRepository = provider.GetRequiredService(); @@ -464,23 +495,29 @@ namespace Oqtane.Infrastructure secondaryPage.DeletedBy = primaryPage.DeletedBy; secondaryPage.DeletedOn = primaryPage.DeletedOn; secondaryPage.IsDeleted = primaryPage.IsDeleted; - secondaryPage.PermissionList = ReplicatePermissions(primaryPage.PermissionList, secondarySiteId); + secondaryPage.PermissionList = SynchronizePermissions(primaryPage.PermissionList, secondarySiteId); if (page == null) { - secondaryPage = pageRepository.AddPage(secondaryPage); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + secondaryPage = pageRepository.AddPage(secondaryPage); + } log += Log(siteGroupMember, $"Page Added: {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); } else { - secondaryPage = pageRepository.UpdatePage(secondaryPage); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + secondaryPage = pageRepository.UpdatePage(secondaryPage); + } log += Log(siteGroupMember, $"Page Updated: {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); secondaryPages.Remove(page); } } // page settings - log += ReplicateSettings(settingRepository, siteGroupMember, EntityNames.Page, primaryPage.PageId, secondaryPage.PageId); + log += SynchronizeSettings(settingRepository, siteGroupMember, EntityNames.Page, primaryPage.PageId, secondaryPage.PageId); // modules if (primaryPageModules == null) @@ -517,7 +554,7 @@ namespace Oqtane.Infrastructure secondaryPageModule.Header = primaryPageModule.Header; secondaryPageModule.Footer = primaryPageModule.Footer; secondaryPageModule.IsDeleted = primaryPageModule.IsDeleted; - secondaryPageModule.Module.PermissionList = ReplicatePermissions(primaryPageModule.Module.PermissionList, secondarySiteId); + secondaryPageModule.Module.PermissionList = SynchronizePermissions(primaryPageModule.Module.PermissionList, secondarySiteId); secondaryPageModule.Module.AllPages = false; secondaryPageModule.Module.IsDeleted = false; @@ -530,15 +567,21 @@ namespace Oqtane.Infrastructure if (module == null) { // add new module - module = moduleRepository.AddModule(secondaryPageModule.Module); - updateContent = true; + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + module = moduleRepository.AddModule(secondaryPageModule.Module); + updateContent = true; + } log += Log(siteGroupMember, $"Module Added: {module.Title} - {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); } if (module != null) { secondaryPageModule.ModuleId = module.ModuleId; secondaryPageModule.Module = null; // remove tracking - secondaryPageModule = pageModuleRepository.AddPageModule(secondaryPageModule); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + secondaryPageModule = pageModuleRepository.AddPageModule(secondaryPageModule); + } log += Log(siteGroupMember, $"Module Instance Added: {module.Title} - {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); secondaryPageModule.Module = module; } @@ -548,13 +591,19 @@ namespace Oqtane.Infrastructure // update existing module if (primaryPageModule.Module.ModifiedOn > siteGroupMember.SynchronizedOn) { - moduleRepository.UpdateModule(secondaryPageModule.Module); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + moduleRepository.UpdateModule(secondaryPageModule.Module); + } updateContent = true; log += Log(siteGroupMember, $"Module Updated: {secondaryPageModule.Title} - {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); } if (primaryPageModule.ModifiedOn > siteGroupMember.SynchronizedOn) { - secondaryPageModule = pageModuleRepository.UpdatePageModule(secondaryPageModule); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + secondaryPageModule = pageModuleRepository.UpdatePageModule(secondaryPageModule); + } log += Log(siteGroupMember, $"Module Instance Updated: {secondaryPageModule.Title} - {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); secondaryPageModules.Remove(pageModule); } @@ -573,7 +622,10 @@ namespace Oqtane.Infrastructure var secondaryModuleContent = ((ISynchronizable)moduleObject).ExtractModule(secondaryPageModule.Module); if (primaryModuleContent != secondaryModuleContent) { - ((ISynchronizable)moduleObject).LoadModule(secondaryPageModule.Module, primaryModuleContent, primaryPageModule.Module.ModuleDefinition.Version); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + ((ISynchronizable)moduleObject).LoadModule(secondaryPageModule.Module, primaryModuleContent, primaryPageModule.Module.ModuleDefinition.Version); + } log += Log(siteGroupMember, $"Module Content Updated: {secondaryPageModule.Title} - {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); } } @@ -586,7 +638,7 @@ namespace Oqtane.Infrastructure } // module settings - log += ReplicateSettings(settingRepository, siteGroupMember, EntityNames.Module, primaryPageModule.ModuleId, secondaryPageModule.ModuleId); + log += SynchronizeSettings(settingRepository, siteGroupMember, EntityNames.Module, primaryPageModule.ModuleId, secondaryPageModule.ModuleId); } } @@ -605,7 +657,10 @@ namespace Oqtane.Infrastructure } if (!primaryPageModules.Any(item => item.PageId == primaryPageId && item.Module.ModuleDefinitionName == secondaryPageModule.Module.ModuleDefinitionName && item.Title.ToLower() == secondaryPageModule.Title.ToLower())) { - pageModuleRepository.DeletePageModule(secondaryPageModule.PageModuleId); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + pageModuleRepository.DeletePageModule(secondaryPageModule.PageModuleId); + } log += Log(siteGroupMember, $"Module Instance Deleted: {secondaryPageModule.Title} - {CreateLink(siteGroupMember.AliasName + secondaryPageModule.Page.Path)}"); } } @@ -613,13 +668,16 @@ namespace Oqtane.Infrastructure // remove pages in the secondary site which do not exist in the primary site foreach (var secondaryPage in secondaryPages.Where(item => !primaryPages.Select(item => item.Path).Contains(item.Path))) { - pageRepository.DeletePage(secondaryPage.PageId); + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization) + { + pageRepository.DeletePage(secondaryPage.PageId); + } log += Log(siteGroupMember, $"Page Deleted: {CreateLink(siteGroupMember.AliasName + secondaryPage.Path)}"); } if (siteGroupMember.SynchronizedOn == DateTime.MinValue || !string.IsNullOrEmpty(log)) { - // clear cache for secondary site if any content was replicated + // clear cache for secondary site if any content was Synchronized var syncManager = provider.GetRequiredService(); var alias = new Alias { TenantId = tenantManager.GetTenant().TenantId, SiteId = secondarySiteId }; syncManager.AddSyncEvent(alias, EntityNames.Site, secondarySiteId, SyncEventActions.Refresh); @@ -628,7 +686,7 @@ namespace Oqtane.Infrastructure return log; } - private List ReplicatePermissions(List permissionList, int siteId) + private List SynchronizePermissions(List permissionList, int siteId) { return permissionList.Select(item => new Permission { @@ -644,7 +702,7 @@ namespace Oqtane.Infrastructure }).ToList(); } - private string ReplicateSettings(ISettingRepository settingRepository, SiteGroupMember siteGroupMember, string entityName, int primaryEntityId, int secondaryEntityId) + private string SynchronizeSettings(ISettingRepository settingRepository, SiteGroupMember siteGroupMember, string entityName, int primaryEntityId, int secondaryEntityId) { var log = ""; var updated = false; @@ -661,7 +719,7 @@ namespace Oqtane.Infrastructure secondarySetting.SettingName = primarySetting.SettingName; secondarySetting.SettingValue = primarySetting.SettingValue; secondarySetting.IsPrivate = primarySetting.IsPrivate; - if (!excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) { settingRepository.AddSetting(secondarySetting); updated = true; @@ -673,7 +731,7 @@ namespace Oqtane.Infrastructure { secondarySetting.SettingValue = primarySetting.SettingValue; secondarySetting.IsPrivate = primarySetting.IsPrivate; - if (!excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) { settingRepository.UpdateSetting(secondarySetting); updated = true; @@ -686,7 +744,7 @@ namespace Oqtane.Infrastructure // any remaining secondary settings need to be deleted foreach (var secondarySetting in secondarySettings) { - if (!excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) + if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) { settingRepository.DeleteSetting(secondarySetting.EntityName, secondarySetting.SettingId); updated = true; @@ -715,7 +773,7 @@ namespace Oqtane.Infrastructure private string Log(SiteGroupMember siteGroupMember, string content) { - // not necessary to log initial replication + // not necessary to log initial synchronization if (siteGroupMember.SynchronizedOn != DateTime.MinValue) { return content + "
"; diff --git a/Oqtane.Server/Migrations/EntityBuilders/SiteGroupMemberEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/SiteGroupMemberEntityBuilder.cs index 92b6cfd2..d5ff717b 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/SiteGroupMemberEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/SiteGroupMemberEntityBuilder.cs @@ -28,7 +28,6 @@ namespace Oqtane.Migrations.EntityBuilders SiteGroupMemberId = AddAutoIncrementColumn(table, "SiteGroupMemberId"); SiteGroupId = AddIntegerColumn(table, "SiteGroupId"); SiteId = AddIntegerColumn(table, "SiteId"); - Notify = AddBooleanColumn(table, "Notify"); SynchronizedOn = AddDateTimeColumn(table, "SynchronizedOn", true); AddAuditableColumns(table); @@ -42,8 +41,6 @@ namespace Oqtane.Migrations.EntityBuilders public OperationBuilder SiteId { get; set; } - public OperationBuilder Notify { get; set; } - public OperationBuilder SynchronizedOn { get; set; } } } diff --git a/Oqtane.Shared/Models/SiteGroupMember.cs b/Oqtane.Shared/Models/SiteGroupMember.cs index 0101a4eb..cb572509 100644 --- a/Oqtane.Shared/Models/SiteGroupMember.cs +++ b/Oqtane.Shared/Models/SiteGroupMember.cs @@ -20,11 +20,6 @@ namespace Oqtane.Models /// public int SiteId { get; set; } - /// - /// Indicates if the site administrator should be notified of any synchronization activity - /// - public bool Notify { get; set; } - /// /// The last date/time the site was synchronized /// diff --git a/Oqtane.Shared/Shared/SiteGroupTypes.cs b/Oqtane.Shared/Shared/SiteGroupTypes.cs index c1b028a5..55e0f7ff 100644 --- a/Oqtane.Shared/Shared/SiteGroupTypes.cs +++ b/Oqtane.Shared/Shared/SiteGroupTypes.cs @@ -3,6 +3,7 @@ namespace Oqtane.Shared public class SiteGroupTypes { public const string Synchronization = "Synchronization"; + public const string Comparison = "Comparison"; public const string Localization = "Localization"; } }