refactoring of site groups

This commit is contained in:
sbwalker
2026-02-09 13:58:38 -05:00
parent c0e191537f
commit ddd6dfc475
26 changed files with 789 additions and 886 deletions

View File

@@ -57,8 +57,8 @@ namespace Microsoft.Extensions.DependencyInjection
services.AddScoped<ICookieConsentService, CookieConsentService>();
services.AddScoped<ITimeZoneService, TimeZoneService>();
services.AddScoped<IMigrationHistoryService, MigrationHistoryService>();
services.AddScoped<ISiteGroupDefinitionService, SiteGroupDefinitionService>();
services.AddScoped<ISiteGroupService, SiteGroupService>();
services.AddScoped<ISiteGroupMemberService, SiteGroupMemberService>();
services.AddScoped<IOutputCacheService, OutputCacheService>();
// providers

View File

@@ -18,8 +18,8 @@
@inject IJobService JobService
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject IOutputCacheService CacheService
@inject ISiteGroupDefinitionService SiteGroupDefinitionService
@inject ISiteGroupService SiteGroupService
@inject ISiteGroupMemberService SiteGroupMemberService
@if (_initialized)
{
@@ -448,22 +448,22 @@
</div>
</div>
</Section>
<Section Name="SiteGroups" Heading="Site Groups" ResourceKey="SiteGroups">
<Section Name="SiteGroupMembers" Heading="Site Groups" ResourceKey="SiteGroupMembers">
<div class="container">
@if (!_addSiteGroupDefinition)
@if (!_addSiteGroup)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="group" HelpText="The site groups in this tenant (database)" ResourceKey="SiteGroups">Group: </Label>
<Label Class="col-sm-3" For="group" HelpText="The site groups in this tenant (database)" ResourceKey="SiteGroupMembers">Group: </Label>
<div class="col-sm-9">
<div class="input-group">
<select id="group" class="form-select" value="@_siteGroupDefinitionId" @onchange="(e => SiteGroupChanged(e))">
<select id="group" class="form-select" value="@_siteGroupId" @onchange="(e => SiteGroupChanged(e))">
<option value="-1">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var siteGroupDefinition in _siteGroupDefinitions)
@foreach (var siteGroup in _siteGroups)
{
<option value="@siteGroupDefinition.SiteGroupDefinitionId">@siteGroupDefinition.Name</option>
<option value="@siteGroup.SiteGroupId">@siteGroup.Name</option>
}
</select>
@if (!_addSiteGroupDefinition)
@if (!_addSiteGroup)
{
<button type="button" class="btn btn-primary" @onclick="AddSiteGroup">@SharedLocalizer["Add"]</button>
}
@@ -471,75 +471,62 @@
</div>
</div>
}
@if (_siteGroupDefinitionId != -1 || _addSiteGroupDefinition)
@if (_siteGroupId != -1 || _addSiteGroup)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="groupname" HelpText="Name of the site group" ResourceKey="GroupName">Group Name: </Label>
<Label Class="col-sm-3" For="groupname" HelpText="Name of the site group" ResourceKey="GroupName">Name: </Label>
<div class="col-sm-9">
<input id="groupname" class="form-control" @bind="@_groupName" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="synchronization" HelpText="Specifies if the group supports content synchronization between the primary site and other sites in the group" ResourceKey="Synchronization">Synchronization? </Label>
<Label Class="col-sm-3" For="grouptype" HelpText="The site group type (ie. synchronization, localization)" ResourceKey="GroupType">Type: </Label>
<div class="col-sm-9">
<select id="synchronization" class="form-select" @bind="@_synchronization">
<option value="False">@SharedLocalizer["No"]</option>
<option value="True">@Localizer["Yes"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="localization" HelpText="Specifies if the content of the sites in the group are localized" ResourceKey="Localization">Localization? </Label>
<div class="col-sm-9">
<select id="localization" class="form-select" @bind="@_localization">
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
<select id="grouptype" class="form-select" @bind="@_groupType">
<option value="@SiteGroupTypes.Synchronization">@Localizer[@SiteGroupTypes.Synchronization]</option>
<option value="@SiteGroupTypes.Localization">@Localizer[SiteGroupTypes.Localization]</option>
</select>
</div>
</div>
}
@if (_siteGroupDefinitionId != -1)
@if (_siteGroupId != -1)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="site" HelpText="The sites in this tenant (database)" ResourceKey="Site">Site: </Label>
<Label Class="col-sm-3" For="site" HelpText="The sites which are members of this site group" ResourceKey="Site">Members: </Label>
<div class="col-sm-9">
<div class="input-group">
<select id="site" class="form-select" value="@_siteId" @onchange="(e => SiteChanged(e))">
<option value="-1">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var site in _sites)
{
<option value="@site.SiteId">@site.Name @((!string.IsNullOrEmpty(site.Fingerprint)) ? "(" + Localizer[site.Fingerprint] + ")" : "")</option>
<option value="@site.SiteId">@site.Name</option>
}
</select>
@if (!_addSiteGroupMember)
{
<button type="button" class="btn btn-primary" @onclick="AddSiteGroupMember">@SharedLocalizer["Add"]</button>
}
else
{
<button type="button" class="btn btn-primary" @onclick="AddSiteGroupMember">@SharedLocalizer["Select"]</button>
}
</div>
</div>
</div>
}
@if (_siteGroupDefinitionId != -1)
@if (_siteGroupId != -1 && _siteId != -1)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="member" HelpText="Indicates if the current site is a member of the selected group" ResourceKey="GroupMember">Member? </Label>
<Label Class="col-sm-3" For="primary" HelpText="Indicates if the selected site is the primary member of the site group" ResourceKey="Primary">Primary? </Label>
<div class="col-sm-9">
<select id="member" class="form-select" @bind="@_member">
<select id="primary" class="form-select" @bind="@_primary">
<option value="False">@SharedLocalizer["No"]</option>
<option value="Primary">@Localizer["Primary"]</option>
<option value="Secondary">@Localizer["Secondary"]</option>
<option value="True">@SharedLocalizer["Yes"]</option>
</select>
</div>
</div>
@if (_member == "Secondary" && _synchronization == "True")
@if (_primary == "False" && _groupType == SiteGroupTypes.Synchronization)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="synchronize" HelpText="Specifies the synchronization approach between the primary site and the selected site" ResourceKey="Synchronize">Synchronize? </Label>
<div class="col-sm-9">
<select id="synchronize" class="form-select" @bind="@_synchronize">
<option value="False">@Localizer["Compare"]</option>
@if (_localization == "False")
{
<option value="True">@Localizer["Update"]</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="notify" HelpText="Specifies if site administrators should be notified of any synchronization activity" ResourceKey="Notify">Notify? </Label>
<div class="col-sm-9">
@@ -556,7 +543,7 @@
<input id="synchronized" class="form-control" @bind="@_synchronized" disabled />
@if (!string.IsNullOrEmpty(_synchronized))
{
<button type="button" class="btn btn-primary" @onclick="ResetSiteGroup">@SharedLocalizer["Reset"]</button>
<button type="button" class="btn btn-primary" @onclick="ResetSiteGroupMember">@SharedLocalizer["Reset"]</button>
}
</div>
</div>
@@ -566,17 +553,17 @@
<div class="row mb-1 align-items-center">
<div class="col-sm-3"></div>
<div class="col-sm-9">
@if ((_siteGroupDefinitionId != -1 || _addSiteGroupDefinition))
@if ((_siteGroupId != -1 || _addSiteGroup))
{
<button type="button" class="btn btn-success me-2" @onclick="SaveSiteGroup">@SharedLocalizer["Save"]</button>
<button type="button" class="btn btn-success me-2" @onclick="SaveSiteGroupMember">@SharedLocalizer["Save"]</button>
}
@if ((_siteGroupDefinitionId != -1 && !_addSiteGroupDefinition) && _member != "False")
@if (_siteGroupId != -1 && !_addSiteGroup && _siteId != -1 && !_addSiteGroupMember)
{
<ActionDialog Action="Delete" OnClick="@(async () => await DeleteSiteGroup())" ResourceKey="DeleteSiteGroup" Class="btn btn-danger" Header="Delete Site Group" Message="@string.Format(Localizer["Confirm.SiteGroup.Delete", _groupName])" />
<ActionDialog Action="Delete" OnClick="@(async () => await DeleteSiteGroupMember())" ResourceKey="DeleteSiteGroupMember" Class="btn btn-danger" Header="Delete Site Group" Message="@Localizer["Confirm.SiteGroupMember.Delete"]" />
}
@if (_addSiteGroupDefinition)
@if (_addSiteGroup)
{
<button type="button" class="btn btn-secondary" @onclick="CancelSiteGroup">@SharedLocalizer["Cancel"]</button>
<button type="button" class="btn btn-secondary" @onclick="CancelSiteGroupMember">@SharedLocalizer["Cancel"]</button>
}
</div>
</div>
@@ -684,18 +671,17 @@
private string _defaultalias;
private bool _addAlias = false;
private List<SiteGroupDefinition> _siteGroupDefinitions = new List<SiteGroupDefinition>();
private List<SiteGroup> _siteGroups = new List<SiteGroup>();
private List<Site> _sites = new List<Site>();
private int _siteGroupDefinitionId = -1;
private int _siteGroupId = -1;
private int _siteId;
private string _groupName = string.Empty;
private string _synchronization = "True";
private string _localization = "False";
private string _member = "Primary";
private string _synchronize = "True";
private string _groupType = SiteGroupTypes.Synchronization;
private string _primary = "True";
private string _notify = "True";
private string _synchronized = string.Empty;
private bool _addSiteGroupDefinition = false;
private bool _addSiteGroup = false;
private bool _addSiteGroupMember = false;
private string _tenant = string.Empty;
private string _database = string.Empty;
@@ -1261,82 +1247,78 @@
private async Task LoadSiteGroups()
{
_siteGroupDefinitions = await SiteGroupDefinitionService.GetSiteGroupDefinitionsAsync();
_siteGroupDefinitionId = -1;
_addSiteGroupDefinition = false;
_siteGroups = await SiteGroupService.GetSiteGroupsAsync();
_siteGroupId = -1;
_addSiteGroup = false;
StateHasChanged();
}
private async void SiteGroupChanged(ChangeEventArgs e)
private async Task SiteGroupChanged(ChangeEventArgs e)
{
_siteGroupDefinitionId = int.Parse(e.Value.ToString());
if (_siteGroupDefinitionId != -1)
_siteGroupId = int.Parse(e.Value.ToString());
if (_siteGroupId != -1)
{
var group = _siteGroupDefinitions.FirstOrDefault(item => item.SiteGroupDefinitionId == _siteGroupDefinitionId);
var group = _siteGroups.FirstOrDefault(item => item.SiteGroupId == _siteGroupId);
if (group != null)
{
_groupName = group.Name;
_synchronization = group.Synchronization.ToString();
_localization = group.Localization.ToString();
_groupType = group.Type;
_siteId = -1;
_primary = "False";
_addSiteGroupMember = false;
if (_sites.Count == 0)
{
_sites = await SiteService.GetSitesAsync();
}
_siteId = PageState.Site.SiteId;
_member = "False";
var siteGroups = await SiteGroupService.GetSiteGroupsAsync(-1, _siteGroupDefinitionId);
foreach (var site in _sites)
{
site.Fingerprint = ""; // used as temporary state
var siteGroup = siteGroups.FirstOrDefault(item => item.SiteId == site.SiteId);
if (siteGroup != null)
{
if (group.PrimarySiteId == site.SiteId)
{
site.Fingerprint = "Primary";
}
else
{
site.Fingerprint = "Secondary";
}
if (siteGroup.SiteId == _siteId)
{
_member = site.Fingerprint;
_synchronize = siteGroup.Synchronize.ToString();
_notify = siteGroup.Notify.ToString();
_synchronized = UtcToLocal(siteGroup.SynchronizedOn).ToString();
}
}
}
await LoadSites();
}
}
StateHasChanged();
}
private async void SiteChanged(ChangeEventArgs e)
private async Task LoadSites()
{
_siteId = int.Parse(e.Value.ToString());
var siteGroup = await SiteGroupService.GetSiteGroupAsync(_siteId, _siteGroupDefinitionId);
if (siteGroup != null)
var siteGroupMembers = await SiteGroupMemberService.GetSiteGroupMembersAsync(-1, _siteGroupId);
_sites = await SiteService.GetSitesAsync();
if (_addSiteGroupMember)
{
if (siteGroup.SiteGroupDefinition.PrimarySiteId == _siteId)
{
_member = "Primary";
}
else
{
_member = "Secondary";
}
_synchronize = siteGroup.Synchronize.ToString();
_notify = siteGroup.Notify.ToString();
_synchronized = UtcToLocal(siteGroup.SynchronizedOn).ToString();
// include sites which are not members
_sites = _sites.ExceptBy(siteGroupMembers.Select(item => item.SiteId), item => item.SiteId).ToList();
}
else
{
_member = "False";
// include sites which are members
_sites = _sites.Where(item => siteGroupMembers.Any(item2 => item2.SiteId == item.SiteId)).ToList();
var group = _siteGroups.FirstOrDefault(item => item.SiteGroupId == _siteGroupId);
foreach (var site in _sites)
{
if (group.PrimarySiteId == site.SiteId)
{
site.Name += $" ({Localizer["Primary"]})";
}
else
{
site.Name += $" ({Localizer["Secondary"]})";
}
}
var siteGroupMember = siteGroupMembers.FirstOrDefault(item => item.SiteId == _siteId);
if (siteGroupMember != null)
{
_primary = (siteGroupMember.SiteGroup.PrimarySiteId == _siteId) ? "True" : "False";
_notify = siteGroupMember.Notify.ToString();
_synchronized = UtcToLocal(siteGroupMember.SynchronizedOn).ToString();
}
}
}
private async Task SiteChanged(ChangeEventArgs e)
{
_siteId = int.Parse(e.Value.ToString());
var siteGroupMember = await SiteGroupMemberService.GetSiteGroupMemberAsync(_siteId, _siteGroupId);
if (siteGroupMember != null)
{
_primary = (siteGroupMember.SiteGroup.PrimarySiteId == _siteId) ? "True" : "False";
_notify = siteGroupMember.Notify.ToString();
_synchronized = UtcToLocal(siteGroupMember.SynchronizedOn).ToString();
}
StateHasChanged();
}
@@ -1345,77 +1327,73 @@
{
_groupName = "";
_siteId = PageState.Site.SiteId;
_member = "Primary";
_primary = "True";
_synchronized = "";
_addSiteGroupDefinition = true;
_addSiteGroup = true;
}
private async Task SaveSiteGroup()
private async Task AddSiteGroupMember()
{
SiteGroupDefinition siteGroupDefinition = null;
_addSiteGroupMember = !_addSiteGroupMember;
_siteId = -1;
await LoadSites();
}
private async Task SaveSiteGroupMember()
{
SiteGroup siteGroup = null;
if (_siteGroupDefinitionId == -1)
if (_siteGroupId == -1)
{
if (!string.IsNullOrEmpty(_groupName))
{
siteGroupDefinition = new Models.SiteGroupDefinition
siteGroup = new SiteGroup
{
Name = _groupName,
Type = _groupType,
PrimarySiteId = _siteId,
Synchronization = bool.Parse(_synchronization),
Localization = bool.Parse(_localization),
Synchronize = false
};
siteGroupDefinition = await SiteGroupDefinitionService.AddSiteGroupDefinitionAsync(siteGroupDefinition);
siteGroup = await SiteGroupService.AddSiteGroupAsync(siteGroup);
}
}
else
{
siteGroupDefinition = _siteGroupDefinitions.FirstOrDefault(item => item.SiteGroupDefinitionId == _siteGroupDefinitionId);
if (siteGroupDefinition != null && !string.IsNullOrEmpty(_groupName))
siteGroup = _siteGroups.FirstOrDefault(item => item.SiteGroupId == _siteGroupId);
if (siteGroup != null && !string.IsNullOrEmpty(_groupName))
{
siteGroupDefinition.Name = _groupName;
siteGroupDefinition.PrimarySiteId = (_member == "Primary") ? _siteId : siteGroupDefinition.PrimarySiteId;
siteGroupDefinition.Synchronization = bool.Parse(_synchronization);
siteGroupDefinition.Localization = bool.Parse(_localization);
siteGroupDefinition = await SiteGroupDefinitionService.UpdateSiteGroupDefinitionAsync(siteGroupDefinition);
siteGroup.Name = _groupName;
siteGroup.Type = _groupType;
siteGroup.PrimarySiteId = (_primary == "True") ? _siteId : siteGroup.PrimarySiteId;
siteGroup = await SiteGroupService.UpdateSiteGroupAsync(siteGroup);
}
else
{
siteGroupDefinition = null;
siteGroup = null;
}
}
if (siteGroupDefinition != null)
if (siteGroup != null)
{
var siteGroup = await SiteGroupService.GetSiteGroupAsync(_siteId, siteGroupDefinition.SiteGroupDefinitionId);
if (siteGroup == null)
var siteGroupMember = await SiteGroupMemberService.GetSiteGroupMemberAsync(_siteId, siteGroup.SiteGroupId);
if (siteGroupMember == null)
{
siteGroup = new SiteGroup
siteGroupMember = new SiteGroupMember
{
SiteGroupDefinitionId = siteGroupDefinition.SiteGroupDefinitionId,
SiteGroupId = siteGroup.SiteGroupId,
SiteId = _siteId,
Synchronize = bool.Parse(_synchronize),
Notify = bool.Parse(_notify)
};
await SiteGroupService.AddSiteGroupAsync(siteGroup);
await SiteGroupMemberService.AddSiteGroupMemberAsync(siteGroupMember);
}
else
{
if (_member == "False")
{
await SiteGroupService.DeleteSiteGroupAsync(siteGroup.SiteGroupId);
}
else
{
siteGroup.Synchronize = bool.Parse(_synchronize);
siteGroup.Notify = bool.Parse(_notify);
siteGroup.SynchronizedOn = string.IsNullOrEmpty(_synchronized) ? null : siteGroup.SynchronizedOn;
await SiteGroupService.UpdateSiteGroupAsync(siteGroup);
}
siteGroupMember.Notify = bool.Parse(_notify);
siteGroupMember.SynchronizedOn = string.IsNullOrEmpty(_synchronized) ? null : siteGroupMember.SynchronizedOn;
await SiteGroupMemberService.UpdateSiteGroupMemberAsync(siteGroupMember);
}
if (siteGroupDefinition.Synchronization)
if (siteGroup.Type == SiteGroupTypes.Synchronization)
{
// enable synchronization job if it is not enabled already
var jobs = await JobService.GetJobsAsync();
@@ -1436,33 +1414,33 @@
}
}
private async Task CancelSiteGroup()
private async Task CancelSiteGroupMember()
{
_groupName = "";
await LoadSiteGroups();
}
private async Task DeleteSiteGroup()
private async Task DeleteSiteGroupMember()
{
if (_siteGroupDefinitionId != -1)
if (_siteGroupId != -1)
{
var siteGroup = await SiteGroupService.GetSiteGroupAsync(PageState.Site.SiteId, _siteGroupDefinitionId);
if (siteGroup != null)
var siteGroupMember = await SiteGroupMemberService.GetSiteGroupMemberAsync(PageState.Site.SiteId, _siteGroupId);
if (siteGroupMember != null)
{
await SiteGroupService.DeleteSiteGroupAsync(siteGroup.SiteGroupDefinitionId);
await SiteGroupMemberService.DeleteSiteGroupMemberAsync(siteGroupMember.SiteGroupId);
}
var siteGroups = await SiteGroupService.GetSiteGroupsAsync(-1, _siteGroupDefinitionId);
if (!siteGroups.Any())
var siteGroupMembers = await SiteGroupMemberService.GetSiteGroupMembersAsync(-1, _siteGroupId);
if (!siteGroupMembers.Any())
{
await SiteGroupDefinitionService.DeleteSiteGroupDefinitionAsync(_siteGroupDefinitionId);
await SiteGroupService.DeleteSiteGroupAsync(_siteGroupId);
}
await LoadSiteGroups();
}
}
private async Task ResetSiteGroup()
private async Task ResetSiteGroupMember()
{
_synchronized = "";
}

View File

@@ -498,17 +498,17 @@
<data name="AliasName.HelpText" xml:space="preserve">
<value>A url for this site. This can include domain names (ie. domain.com), subdomains (ie. sub.domain.com) or virtual folders (ie. domain.com/folder).</value>
</data>
<data name="SiteGroups.Text" xml:space="preserve">
<data name="SiteGroupMembers.Text" xml:space="preserve">
<value>Group:</value>
</data>
<data name="SiteGroups.HelpText" xml:space="preserve">
<data name="SiteGroupMembers.HelpText" xml:space="preserve">
<value>The site groups in this tenant (database)</value>
</data>
<data name="GroupMember.Text" xml:space="preserve">
<value>Member?</value>
<data name="Primary.Text" xml:space="preserve">
<value>Primary?</value>
</data>
<data name="GroupMember.HelpText" xml:space="preserve">
<value>Indicates if the current site is a member of the selected group</value>
<data name="Primary.HelpText" xml:space="preserve">
<value>Indicates if the selected site is the primary member of the site group</value>
</data>
<data name="GroupName.Text" xml:space="preserve">
<value>Name:</value>
@@ -516,18 +516,6 @@
<data name="GroupName.HelpText" xml:space="preserve">
<value>Name of the site group</value>
</data>
<data name="Synchronization.Text" xml:space="preserve">
<value>Synchronization?</value>
</data>
<data name="Synchronization.HelpText" xml:space="preserve">
<value>Specifies if the group supports content synchronization between the primary site and other sites in the group</value>
</data>
<data name="Localization.Text" xml:space="preserve">
<value>Localization?</value>
</data>
<data name="Localization.HelpText" xml:space="preserve">
<value>Specifies if the content of the sites in the group are localized</value>
</data>
<data name="Primary" xml:space="preserve">
<value>Primary</value>
</data>
@@ -540,11 +528,11 @@
<data name="Update" xml:space="preserve">
<value>Update</value>
</data>
<data name="DeleteSiteGroup.Header" xml:space="preserve">
<value>Delete Site Group</value>
<data name="DeleteSiteGroupMember.Header" xml:space="preserve">
<value>Delete Site Group Member</value>
</data>
<data name="Confirm.SiteGroup.Delete" xml:space="preserve">
<value>Are You Sure You Wish To Delete {0}?</value>
<data name="Confirm.SiteGroupMember.Delete" xml:space="preserve">
<value>Are You Sure You Wish To Delete This Member From The Site Group?</value>
</data>
<data name="Message.Required.GroupName" xml:space="preserve">
<value>Group Name Is Required</value>
@@ -559,21 +547,27 @@
<value>Specifies if site administrators should be notified of any synchronization activity</value>
</data>
<data name="Site.Text" xml:space="preserve">
<value>Site:</value>
<value>Members:</value>
</data>
<data name="Site.HelpText" xml:space="preserve">
<value>The sites in this tenant (database)</value>
<value>The sites which are members of this site group</value>
</data>
<data name="Synchronized.Text" xml:space="preserve">
<value>Synchronized:</value>
</data>
<data name="GroupType.Text" xml:space="preserve">
<value>Type:</value>
</data>
<data name="GroupType.HelpText" xml:space="preserve">
<value>The site group type (ie. synchronization, localization)</value>
</data>
<data name="Synchronized.HelpText" xml:space="preserve">
<value>The date/time of the last synchronization for the site</value>
</data>
<data name="Synchronize.Text" xml:space="preserve">
<value>Synchronize?</value>
<data name="Synchronization" xml:space="preserve">
<value>Synchronization</value>
</data>
<data name="Synchronize.HelpText" xml:space="preserve">
<value>Specifies the synchronization approach between the primary site and the selected site</value>
<data name="Localization" xml:space="preserve">
<value>Localization</value>
</data>
</root>

View File

@@ -1,94 +0,0 @@
using Oqtane.Models;
using System.Threading.Tasks;
using System.Net.Http;
using System.Collections.Generic;
using Oqtane.Documentation;
using Oqtane.Shared;
using System.Linq;
namespace Oqtane.Services
{
/// <summary>
/// Service to manage <see cref="Role"/>s on a <see cref="Site"/>
/// </summary>
public interface ISiteGroupDefinitionService
{
/// <summary>
/// Get all <see cref="SiteGroupDefinition"/>s
/// </summary>
/// <returns></returns>
Task<List<SiteGroupDefinition>> GetSiteGroupDefinitionsAsync();
/// <summary>
/// Get all <see cref="SiteGroupDefinition"/>s
/// </summary>
/// <returns></returns>
Task<List<SiteGroupDefinition>> GetSiteGroupDefinitionsAsync(int primarySiteId);
/// <summary>
/// Get one specific <see cref="SiteGroupDefinition"/>
/// </summary>
/// <param name="siteGroupDefinitionId">ID-reference of a <see cref="SiteGroupDefinition"/></param>
/// <returns></returns>
Task<SiteGroupDefinition> GetSiteGroupDefinitionAsync(int siteGroupDefinitionId);
/// <summary>
/// Add / save a new <see cref="SiteGroupDefinition"/> to the database.
/// </summary>
/// <param name="group"></param>
/// <returns></returns>
Task<SiteGroupDefinition> AddSiteGroupDefinitionAsync(SiteGroupDefinition siteGroupDefinition);
/// <summary>
/// Update a <see cref="SiteGroupDefinition"/> in the database.
/// </summary>
/// <param name="group"></param>
/// <returns></returns>
Task<SiteGroupDefinition> UpdateSiteGroupDefinitionAsync(SiteGroupDefinition siteGroupDefinition);
/// <summary>
/// Delete a <see cref="SiteGroupDefinition"/> in the database.
/// </summary>
/// <param name="siteGroupDefinitionId">ID-reference of a <see cref="SiteGroupDefinition"/></param>
/// <returns></returns>
Task DeleteSiteGroupDefinitionAsync(int siteGroupDefinitionId);
}
[PrivateApi("Don't show in the documentation, as everything should use the Interface")]
public class SiteGroupDefinitionService : ServiceBase, ISiteGroupDefinitionService
{
public SiteGroupDefinitionService(HttpClient http, SiteState siteState) : base(http, siteState) { }
private string Apiurl => CreateApiUrl("SiteGroupDefinition");
public async Task<List<SiteGroupDefinition>> GetSiteGroupDefinitionsAsync()
{
return await GetSiteGroupDefinitionsAsync(-1);
}
public async Task<List<SiteGroupDefinition>> GetSiteGroupDefinitionsAsync(int primarySiteId)
{
return await GetJsonAsync<List<SiteGroupDefinition>>($"{Apiurl}?siteid={primarySiteId}", Enumerable.Empty<SiteGroupDefinition>().ToList());
}
public async Task<SiteGroupDefinition> GetSiteGroupDefinitionAsync(int siteGroupDefinitionId)
{
return await GetJsonAsync<SiteGroupDefinition>($"{Apiurl}/{siteGroupDefinitionId}");
}
public async Task<SiteGroupDefinition> AddSiteGroupDefinitionAsync(SiteGroupDefinition siteGroupDefinition)
{
return await PostJsonAsync<SiteGroupDefinition>(Apiurl, siteGroupDefinition);
}
public async Task<SiteGroupDefinition> UpdateSiteGroupDefinitionAsync(SiteGroupDefinition siteGroupDefinition)
{
return await PutJsonAsync<SiteGroupDefinition>($"{Apiurl}/{siteGroupDefinition.SiteGroupDefinitionId}", siteGroupDefinition);
}
public async Task DeleteSiteGroupDefinitionAsync(int siteGroupDefinitionId)
{
await DeleteAsync($"{Apiurl}/{siteGroupDefinitionId}");
}
}
}

View File

@@ -0,0 +1,104 @@
using Oqtane.Models;
using System.Threading.Tasks;
using System.Net.Http;
using System.Collections.Generic;
using Oqtane.Documentation;
using Oqtane.Shared;
using System.Linq;
namespace Oqtane.Services
{
/// <summary>
/// Service to manage <see cref="Role"/>s on a <see cref="Site"/>
/// </summary>
public interface ISiteGroupMemberService
{
/// <summary>
/// Get all <see cref="SiteGroupMember"/>s
/// </summary>
/// <returns></returns>
Task<List<SiteGroupMember>> GetSiteGroupMembersAsync(int siteId, int siteGroupId);
/// <summary>
/// Get one specific <see cref="SiteGroupMember"/>
/// </summary>
/// <param name="siteGroupMemberId">ID-reference of a <see cref="SiteGroupMember"/></param>
/// <returns></returns>
Task<SiteGroupMember> GetSiteGroupMemberAsync(int siteGroupMemberId);
/// <summary>
/// Get one specific <see cref="SiteGroupMember"/>
/// </summary>
/// <param name="siteId">ID-reference of a <see cref="Site"/></param>
/// <param name="siteGroupId">ID-reference of a <see cref="SiteGroup"/></param>
/// <returns></returns>
Task<SiteGroupMember> GetSiteGroupMemberAsync(int siteId, int siteGroupId);
/// <summary>
/// Add / save a new <see cref="SiteGroupMember"/> to the database.
/// </summary>
/// <param name="siteGroupMember"></param>
/// <returns></returns>
Task<SiteGroupMember> AddSiteGroupMemberAsync(SiteGroupMember siteGroupMember);
/// <summary>
/// Update a <see cref="SiteGroupMember"/> in the database.
/// </summary>
/// <param name="siteGroupMember"></param>
/// <returns></returns>
Task<SiteGroupMember> UpdateSiteGroupMemberAsync(SiteGroupMember siteGroupMember);
/// <summary>
/// Delete a <see cref="SiteGroupMember"/> in the database.
/// </summary>
/// <param name="siteGroupMemberId">ID-reference of a <see cref="SiteGroupMember"/></param>
/// <returns></returns>
Task DeleteSiteGroupMemberAsync(int siteGroupMemberId);
}
[PrivateApi("Don't show in the documentation, as everything should use the Interface")]
public class SiteGroupMemberService : ServiceBase, ISiteGroupMemberService
{
public SiteGroupMemberService(HttpClient http, SiteState siteState) : base(http, siteState) { }
private string Apiurl => CreateApiUrl("SiteGroupMember");
public async Task<List<SiteGroupMember>> GetSiteGroupMembersAsync(int siteId, int siteGroupId)
{
return await GetJsonAsync<List<SiteGroupMember>>($"{Apiurl}?siteid={siteId}&groupid={siteGroupId}", Enumerable.Empty<SiteGroupMember>().ToList());
}
public async Task<SiteGroupMember> GetSiteGroupMemberAsync(int siteGroupMemberId)
{
return await GetJsonAsync<SiteGroupMember>($"{Apiurl}/{siteGroupMemberId}");
}
public async Task<SiteGroupMember> GetSiteGroupMemberAsync(int siteId, int siteGroupId)
{
var siteGroupMembers = await GetSiteGroupMembersAsync(siteId, siteGroupId);
if (siteGroupMembers != null && siteGroupMembers.Count > 0)
{
return siteGroupMembers[0];
}
else
{
return null;
}
}
public async Task<SiteGroupMember> AddSiteGroupMemberAsync(SiteGroupMember siteGroupMember)
{
return await PostJsonAsync<SiteGroupMember>(Apiurl, siteGroupMember);
}
public async Task<SiteGroupMember> UpdateSiteGroupMemberAsync(SiteGroupMember siteGroupMember)
{
return await PutJsonAsync<SiteGroupMember>($"{Apiurl}/{siteGroupMember.SiteGroupId}", siteGroupMember);
}
public async Task DeleteSiteGroupMemberAsync(int siteGroupMemberId)
{
await DeleteAsync($"{Apiurl}/{siteGroupMemberId}");
}
}
}

View File

@@ -17,43 +17,41 @@ namespace Oqtane.Services
/// Get all <see cref="SiteGroup"/>s
/// </summary>
/// <returns></returns>
Task<List<SiteGroup>> GetSiteGroupsAsync(int siteId, int siteGroupDefinitionId);
Task<List<SiteGroup>> GetSiteGroupsAsync();
/// <summary>
/// Get all <see cref="SiteGroup"/>s
/// </summary>
/// <returns></returns>
Task<List<SiteGroup>> GetSiteGroupsAsync(int primarySiteId);
/// <summary>
/// Get one specific <see cref="SiteGroup"/>
/// </summary>
/// <param name="siteSiteGroupDefinitionId">ID-reference of a <see cref="SiteGroup"/></param>
/// <param name="siteGroupId">ID-reference of a <see cref="SiteGroup"/></param>
/// <returns></returns>
Task<SiteGroup> GetSiteGroupAsync(int siteSiteGroupDefinitionId);
/// <summary>
/// Get one specific <see cref="SiteGroup"/>
/// </summary>
/// <param name="siteId">ID-reference of a <see cref="Site"/></param>
/// <param name="siteGroupDefinitionId">ID-reference of a <see cref="SiteGroupDefinition"/></param>
/// <returns></returns>
Task<SiteGroup> GetSiteGroupAsync(int siteId, int siteGroupDefinitionId);
Task<SiteGroup> GetSiteGroupAsync(int siteGroupId);
/// <summary>
/// Add / save a new <see cref="SiteGroup"/> to the database.
/// </summary>
/// <param name="siteGroup"></param>
/// <param name="group"></param>
/// <returns></returns>
Task<SiteGroup> AddSiteGroupAsync(SiteGroup siteGroup);
/// <summary>
/// Update a <see cref="SiteGroup"/> in the database.
/// </summary>
/// <param name="siteGroup"></param>
/// <param name="group"></param>
/// <returns></returns>
Task<SiteGroup> UpdateSiteGroupAsync(SiteGroup siteGroup);
/// <summary>
/// Delete a <see cref="SiteGroup"/> in the database.
/// </summary>
/// <param name="siteSiteGroupDefinitionId">ID-reference of a <see cref="SiteGroup"/></param>
/// <param name="siteGroupId">ID-reference of a <see cref="SiteGroup"/></param>
/// <returns></returns>
Task DeleteSiteGroupAsync(int siteSiteGroupDefinitionId);
Task DeleteSiteGroupAsync(int siteGroupId);
}
[PrivateApi("Don't show in the documentation, as everything should use the Interface")]
@@ -63,27 +61,19 @@ namespace Oqtane.Services
private string Apiurl => CreateApiUrl("SiteGroup");
public async Task<List<SiteGroup>> GetSiteGroupsAsync(int siteId, int siteGroupDefinitionId)
public async Task<List<SiteGroup>> GetSiteGroupsAsync()
{
return await GetJsonAsync<List<SiteGroup>>($"{Apiurl}?siteid={siteId}&groupid={siteGroupDefinitionId}", Enumerable.Empty<SiteGroup>().ToList());
return await GetSiteGroupsAsync(-1);
}
public async Task<SiteGroup> GetSiteGroupAsync(int siteSiteGroupDefinitionId)
public async Task<List<SiteGroup>> GetSiteGroupsAsync(int primarySiteId)
{
return await GetJsonAsync<SiteGroup>($"{Apiurl}/{siteSiteGroupDefinitionId}");
return await GetJsonAsync<List<SiteGroup>>($"{Apiurl}?siteid={primarySiteId}", Enumerable.Empty<SiteGroup>().ToList());
}
public async Task<SiteGroup> GetSiteGroupAsync(int siteId, int siteGroupDefinitionId)
public async Task<SiteGroup> GetSiteGroupAsync(int siteGroupId)
{
var siteGroups = await GetSiteGroupsAsync(siteId, siteGroupDefinitionId);
if (siteGroups != null && siteGroups.Count > 0)
{
return siteGroups[0];
}
else
{
return null;
}
return await GetJsonAsync<SiteGroup>($"{Apiurl}/{siteGroupId}");
}
public async Task<SiteGroup> AddSiteGroupAsync(SiteGroup siteGroup)
@@ -93,12 +83,12 @@ namespace Oqtane.Services
public async Task<SiteGroup> UpdateSiteGroupAsync(SiteGroup siteGroup)
{
return await PutJsonAsync<SiteGroup>($"{Apiurl}/{siteGroup.SiteGroupDefinitionId}", siteGroup);
return await PutJsonAsync<SiteGroup>($"{Apiurl}/{siteGroup.SiteGroupId}", siteGroup);
}
public async Task DeleteSiteGroupAsync(int siteSiteGroupDefinitionId)
public async Task DeleteSiteGroupAsync(int siteGroupId)
{
await DeleteAsync($"{Apiurl}/{siteSiteGroupDefinitionId}");
await DeleteAsync($"{Apiurl}/{siteGroupId}");
}
}
}

View File

@@ -11,7 +11,7 @@
@inject ILogService logger
@inject ISettingService SettingService
@inject IJSRuntime jsRuntime
@inject ISiteGroupDefinitionService SiteGroupDefinitionService
@inject ISiteGroupService SiteGroupService
@inject IServiceProvider ServiceProvider
@inject ILogService LoggingService
@inject IStringLocalizer<ControlPanelInteractive> Localizer
@@ -35,7 +35,7 @@
<button type="button" data-bs-dismiss="offcanvas" class="btn btn-primary col-12" @onclick=@(async () => Navigate("Admin"))>@Localizer["AdminDash"]</button>
</div>
</div>
@if (_siteGroupDefinitions.Any(item => item.Synchronization))
@if (_siteGroups.Any(item => item.Type == SiteGroupTypes.Synchronization))
{
<button type="button" class="btn btn-success col-12 mt-1" @onclick="SynchronizeSite">@Localizer["Synchronize"]</button>
}
@@ -262,7 +262,7 @@
private List<Page> _pages = new List<Page>();
private List<Module> _modules = new List<Module>();
private List<ThemeControl> _containers = new List<ThemeControl>();
private List<SiteGroupDefinition> _siteGroupDefinitions = new List<SiteGroupDefinition>();
private List<SiteGroup> _siteGroups = new List<SiteGroup>();
private string _category = "Common";
private string _pane = "";
@@ -293,7 +293,7 @@
_allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Page.SiteId);
_moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList();
_categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',', StringSplitOptions.RemoveEmptyEntries)).Distinct().Where(item => item != "Headless").ToList();
_siteGroupDefinitions = await SiteGroupDefinitionService.GetSiteGroupDefinitionsAsync(PageState.Site.SiteId);
_siteGroups = await SiteGroupService.GetSiteGroupsAsync(PageState.Site.SiteId);
}
}
@@ -641,10 +641,10 @@
private async Task SynchronizeSite()
{
foreach (var group in _siteGroupDefinitions.Where(item => item.Synchronization))
foreach (var group in _siteGroups.Where(item => item.Type == SiteGroupTypes.Synchronization))
{
group.Synchronize = true;
await SiteGroupDefinitionService.UpdateSiteGroupDefinitionAsync(group);
await SiteGroupService.UpdateSiteGroupAsync(group);
}
NavigationManager.NavigateTo(Utilities.NavigateUrl(PageState.Alias.Path, PageState.Page.Path, ""), true);
}