diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index ae9d8f50..63b59984 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -484,23 +484,10 @@
- @if (_synchronization != "False") - { -
- -
- -
-
- }
@@ -539,14 +526,35 @@
- @if (_member == "Secondary") + @if (_member == "Secondary" && _synchronization == "True") {
- +
- +
+
+ +
+ +
+
+ @if (!string.IsNullOrEmpty(_synchronized)) + { +
+ +
+ +
+
+ } } }
@@ -594,7 +602,7 @@
- @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host) && _siteGroupDefinitions.Any(item => item.PrimarySiteId == PageState.Site.SiteId && item.Synchronization != null)) + @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host) && _siteGroupDefinitions.Any(item => item.PrimarySiteId == PageState.Site.SiteId && item.Synchronization)) { } @@ -679,10 +687,11 @@ private int _siteGroupDefinitionId = -1; private int _siteId; private string _groupName = string.Empty; - private string _synchronization = "Update"; - private string _notify = "True"; + private string _synchronization = "True"; private string _localization = "False"; private string _member = "Primary"; + private string _synchronize = "True"; + private string _notify = "True"; private string _synchronized = string.Empty; private bool _addSiteGroupDefinition = false; @@ -1265,15 +1274,7 @@ if (group != null) { _groupName = group.Name; - if (group.Synchronization == null) - { - _synchronization = "False"; - } - else - { - _synchronization = (group.Synchronization.Value) ? "Update" : "Compare"; - } - _notify = group.Notify.ToString(); + _synchronization = group.Synchronization.ToString(); _localization = group.Localization.ToString(); if (_sites.Count == 0) @@ -1302,6 +1303,8 @@ if (siteGroup.SiteId == _siteId) { _member = site.Fingerprint; + _synchronize = siteGroup.Synchronize.ToString(); + _notify = siteGroup.Notify.ToString(); _synchronized = UtcToLocal(siteGroup.SynchronizedOn).ToString(); } } @@ -1347,10 +1350,6 @@ { SiteGroupDefinition siteGroupDefinition = null; - bool? synchronization = null; - if (_synchronization == "Compare") synchronization = false; - if (_synchronization == "Update") synchronization = true; - if (_siteGroupDefinitionId == -1) { if (!string.IsNullOrEmpty(_groupName)) @@ -1359,8 +1358,7 @@ { Name = _groupName, PrimarySiteId = _siteId, - Synchronization = synchronization, - Notify = bool.Parse(_notify), + Synchronization = bool.Parse(_synchronization), Localization = bool.Parse(_localization), Synchronize = false }; @@ -1374,8 +1372,7 @@ { siteGroupDefinition.Name = _groupName; siteGroupDefinition.PrimarySiteId = (_member == "Primary") ? _siteId : siteGroupDefinition.PrimarySiteId; - siteGroupDefinition.Synchronization = synchronization; - siteGroupDefinition.Notify = bool.Parse(_notify); + siteGroupDefinition.Synchronization = bool.Parse(_synchronization); siteGroupDefinition.Localization = bool.Parse(_localization); siteGroupDefinition = await SiteGroupDefinitionService.UpdateSiteGroupDefinitionAsync(siteGroupDefinition); } @@ -1393,7 +1390,9 @@ siteGroup = new SiteGroup { SiteGroupDefinitionId = siteGroupDefinition.SiteGroupDefinitionId, - SiteId = _siteId + SiteId = _siteId, + Synchronize = bool.Parse(_synchronize), + Notify = bool.Parse(_notify) }; await SiteGroupService.AddSiteGroupAsync(siteGroup); } @@ -1403,6 +1402,12 @@ { await SiteGroupService.DeleteSiteGroupAsync(siteGroup.SiteGroupId); } + else + { + siteGroup.Synchronize = bool.Parse(_synchronize); + siteGroup.Notify = bool.Parse(_notify); + await SiteGroupService.UpdateSiteGroupAsync(siteGroup); + } } await LoadSiteGroups(); @@ -1452,7 +1457,7 @@ } // mark secondary sites for synchronization - foreach (var group in _siteGroupDefinitions.Where(item => item.PrimarySiteId == PageState.Site.SiteId && item.Synchronization != null)) + foreach (var group in _siteGroupDefinitions.Where(item => item.PrimarySiteId == PageState.Site.SiteId && item.Synchronization)) { group.Synchronize = true; await SiteGroupDefinitionService.UpdateSiteGroupDefinitionAsync(group); diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index f0f8f414..b653285a 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -559,7 +559,7 @@ Notify? - Specifies if the administrators of secondary sites should be notified of any synchronization activity + Specifies if site administrators should be notified of any synchronization activity Site: @@ -573,4 +573,10 @@ The date/time of the last synchronization for the site + + Synchronize? + + + Specifies the synchronization approach between the primary site and the selected site + \ No newline at end of file diff --git a/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs b/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs index 7c3a0d8c..ef90905a 100644 --- a/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs @@ -53,7 +53,7 @@ namespace Oqtane.Infrastructure var groups = siteGroupDefinitionRepository.GetSiteGroupDefinitions(); // iterate through groups which need to be synchronized - foreach (var group in groups.Where(item => item.Synchronization != null && item.Synchronize)) + foreach (var group in groups.Where(item => item.Synchronization && item.Synchronize)) { // get data if (siteGroups == null) @@ -177,7 +177,7 @@ namespace Oqtane.Infrastructure secondarySite.DeletedOn = primarySite.DeletedOn; var siteRepository = provider.GetRequiredService(); - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { siteRepository.UpdateSite(secondarySite); } @@ -195,7 +195,7 @@ namespace Oqtane.Infrastructure syncManager.AddSyncEvent(alias, EntityNames.Site, secondarySite.SiteId, SyncEventActions.Refresh); } - if (!string.IsNullOrEmpty(log) && siteGroup.SiteGroupDefinition.Notify) + if (!string.IsNullOrEmpty(log) && siteGroup.Notify) { // send change log to administrators SendNotifications(provider, secondarySite.SiteId, secondarySite.Name, log); @@ -244,7 +244,7 @@ namespace Oqtane.Infrastructure if (role == null) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { roleRepository.AddRole(secondaryRole); } @@ -252,7 +252,7 @@ namespace Oqtane.Infrastructure } else { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { roleRepository.UpdateRole(secondaryRole); } @@ -265,7 +265,7 @@ 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))) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { roleRepository.DeleteRole(secondaryRole.RoleId); } @@ -323,7 +323,7 @@ namespace Oqtane.Infrastructure if (folder == null) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { folderRepository.AddFolder(secondaryFolder); } @@ -331,7 +331,7 @@ namespace Oqtane.Infrastructure } else { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { folderRepository.UpdateFolder(secondaryFolder); } @@ -370,7 +370,7 @@ namespace Oqtane.Infrastructure if (file == null) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { fileRepository.AddFile(secondaryFile); ReplicateFile(folderRepository, primaryFolder, primaryFile, secondaryFolder, secondaryFile); @@ -379,7 +379,7 @@ namespace Oqtane.Infrastructure } else { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { fileRepository.UpdateFile(secondaryFile); ReplicateFile(folderRepository, primaryFolder, primaryFile, secondaryFolder, secondaryFile); @@ -393,7 +393,7 @@ 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))) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { fileRepository.DeleteFile(secondaryFile.FileId); var secondaryPath = Path.Combine(folderRepository.GetFolderPath(secondaryFolder), secondaryFile.Name); @@ -406,7 +406,7 @@ 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))) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { folderRepository.DeleteFolder(secondaryFolder.FolderId); } @@ -490,7 +490,7 @@ namespace Oqtane.Infrastructure if (page == null) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { secondaryPage = pageRepository.AddPage(secondaryPage); } @@ -498,7 +498,7 @@ namespace Oqtane.Infrastructure } else { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { secondaryPage = pageRepository.UpdatePage(secondaryPage); } @@ -558,7 +558,7 @@ namespace Oqtane.Infrastructure if (module == null) { // add new module - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { module = moduleRepository.AddModule(secondaryPageModule.Module); updateContent = true; @@ -569,7 +569,7 @@ namespace Oqtane.Infrastructure { secondaryPageModule.ModuleId = module.ModuleId; secondaryPageModule.Module = null; // remove tracking - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { secondaryPageModule = pageModuleRepository.AddPageModule(secondaryPageModule); } @@ -582,7 +582,7 @@ namespace Oqtane.Infrastructure // update existing module if (primaryPageModule.Module.ModifiedOn > siteGroup.SynchronizedOn) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { moduleRepository.UpdateModule(secondaryPageModule.Module); updateContent = true; @@ -591,7 +591,7 @@ namespace Oqtane.Infrastructure } if (primaryPageModule.ModifiedOn > siteGroup.SynchronizedOn) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { secondaryPageModule = pageModuleRepository.UpdatePageModule(secondaryPageModule); } @@ -613,7 +613,7 @@ namespace Oqtane.Infrastructure var secondaryModuleContent = ((ISynchronizable)moduleObject).ExtractModule(secondaryPageModule.Module); if (primaryModuleContent != secondaryModuleContent) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { ((ISynchronizable)moduleObject).LoadModule(secondaryPageModule.Module, primaryModuleContent, primaryPageModule.Module.ModuleDefinition.Version); } @@ -648,7 +648,7 @@ namespace Oqtane.Infrastructure } if (!primaryPageModules.Any(item => item.PageId == primaryPageId && item.Module.ModuleDefinitionName == secondaryPageModule.Module.ModuleDefinitionName && item.Title.ToLower() == secondaryPageModule.Title.ToLower())) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { pageModuleRepository.DeletePageModule(secondaryPageModule.PageModuleId); } @@ -659,7 +659,7 @@ 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))) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value) + if (siteGroup.Synchronize) { pageRepository.DeletePage(secondaryPage.PageId); } @@ -710,7 +710,7 @@ namespace Oqtane.Infrastructure secondarySetting.SettingName = primarySetting.SettingName; secondarySetting.SettingValue = primarySetting.SettingValue; secondarySetting.IsPrivate = primarySetting.IsPrivate; - if (siteGroup.SiteGroupDefinition.Synchronization.Value && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) + if (siteGroup.Synchronize && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) { settingRepository.AddSetting(secondarySetting); updated = true; @@ -722,7 +722,7 @@ namespace Oqtane.Infrastructure { secondarySetting.SettingValue = primarySetting.SettingValue; secondarySetting.IsPrivate = primarySetting.IsPrivate; - if (siteGroup.SiteGroupDefinition.Synchronization.Value && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) + if (siteGroup.Synchronize && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) { settingRepository.UpdateSetting(secondarySetting); updated = true; @@ -735,7 +735,7 @@ namespace Oqtane.Infrastructure // any remaining secondary settings need to be deleted foreach (var secondarySetting in secondarySettings) { - if (siteGroup.SiteGroupDefinition.Synchronization.Value && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) + if (siteGroup.Synchronize && !excludedSettings.Any(item => item.EntityName == secondarySetting.EntityName && item.SettingName == secondarySetting.SettingName)) { settingRepository.DeleteSetting(secondarySetting.EntityName, secondarySetting.SettingId); updated = true; diff --git a/Oqtane.Server/Migrations/EntityBuilders/SiteGroupDefinitionEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/SiteGroupDefinitionEntityBuilder.cs index 180e896d..72974ecb 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/SiteGroupDefinitionEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/SiteGroupDefinitionEntityBuilder.cs @@ -24,8 +24,7 @@ namespace Oqtane.Migrations.EntityBuilders SiteGroupDefinitionId = AddAutoIncrementColumn(table, "SiteGroupDefinitionId"); Name = AddStringColumn(table, "Name", 200); PrimarySiteId = AddIntegerColumn(table, "PrimarySiteId"); - Synchronization = AddBooleanColumn(table, "Synchronization", true); - Notify = AddBooleanColumn(table, "Notify"); + Synchronization = AddBooleanColumn(table, "Synchronization"); Synchronize = AddBooleanColumn(table, "Synchronize"); Localization = AddBooleanColumn(table, "Localization"); @@ -42,8 +41,6 @@ namespace Oqtane.Migrations.EntityBuilders public OperationBuilder Synchronization { get; set; } - public OperationBuilder Notify { get; set; } - public OperationBuilder Synchronize { get; set; } public OperationBuilder Localization { get; set; } diff --git a/Oqtane.Server/Migrations/EntityBuilders/SiteGroupEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/SiteGroupEntityBuilder.cs index e9e385ce..a6663315 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/SiteGroupEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/SiteGroupEntityBuilder.cs @@ -28,6 +28,8 @@ namespace Oqtane.Migrations.EntityBuilders SiteGroupId = AddAutoIncrementColumn(table, "SiteGroupId"); SiteGroupDefinitionId = AddIntegerColumn(table, "SiteGroupDefinitionId"); SiteId = AddIntegerColumn(table, "SiteId"); + Synchronize = AddBooleanColumn(table, "Synchronize"); + Notify = AddBooleanColumn(table, "Notify"); SynchronizedOn = AddDateTimeColumn(table, "SynchronizedOn", true); AddAuditableColumns(table); @@ -41,6 +43,10 @@ namespace Oqtane.Migrations.EntityBuilders public OperationBuilder SiteId { get; set; } + public OperationBuilder Synchronize { get; set; } + + public OperationBuilder Notify { get; set; } + public OperationBuilder SynchronizedOn { get; set; } } } diff --git a/Oqtane.Shared/Models/SiteGroup.cs b/Oqtane.Shared/Models/SiteGroup.cs index 2668f55e..e6edc2e5 100644 --- a/Oqtane.Shared/Models/SiteGroup.cs +++ b/Oqtane.Shared/Models/SiteGroup.cs @@ -20,6 +20,16 @@ namespace Oqtane.Models /// public int SiteId { get; set; } + /// + /// Specifies the site synchronization approach (false = compare, true = update) + /// + public bool Synchronize { 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/Models/SiteGroupDefinition.cs b/Oqtane.Shared/Models/SiteGroupDefinition.cs index a5e91a7b..4db114e4 100644 --- a/Oqtane.Shared/Models/SiteGroupDefinition.cs +++ b/Oqtane.Shared/Models/SiteGroupDefinition.cs @@ -18,14 +18,9 @@ namespace Oqtane.Models public int PrimarySiteId { get; set; } /// - /// Indicates if the group supports synchronization (null = no, false = compare, true = update) + /// Indicates if the group supports synchronization /// - public bool? Synchronization { get; set; } - - /// - /// Indicates if the site administrator should be notified of any synchronization activity - /// - public bool Notify { get; set; } + public bool Synchronization { get; set; } /// /// Specifies if the group needs to be synchronized