Merge pull request #4 from oqtane/master

Sync master
This commit is contained in:
jimspillane 2020-05-05 21:26:18 -04:00 committed by GitHub
commit 7ca1f92f52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
80 changed files with 398 additions and 653 deletions

View File

@ -99,7 +99,7 @@
var interop = new Interop(JsRuntime); var interop = new Interop(JsRuntime);
string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken"); string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken");
var fields = new { __RequestVerificationToken = antiforgerytoken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl }; var fields = new { __RequestVerificationToken = antiforgerytoken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl };
await interop.SubmitForm("/pages/login/", fields); await interop.SubmitForm($"/{PageState.Alias.AliasId}/pages/login/", fields);
} }
else else
{ {

View File

@ -13,7 +13,7 @@
<Label For="dateTime" HelpText="The date and time of this log">Date/Time: </Label> <Label For="dateTime" HelpText="The date and time of this log">Date/Time: </Label>
</td> </td>
<td> <td>
<input id="dateTime" class="form-control" @bind="@_logDate" disabled /> <input id="dateTime" class="form-control" @bind="@_logDate" readonly />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -21,7 +21,7 @@
<Label For="level" HelpText="The level of this log">Level: </Label> <Label For="level" HelpText="The level of this log">Level: </Label>
</td> </td>
<td> <td>
<input id="level" class="form-control" @bind="@_level" disabled /> <input id="level" class="form-control" @bind="@_level" readonly />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -29,7 +29,7 @@
<Label For="feature" HelpText="The feature that was affected">Feature: </Label> <Label For="feature" HelpText="The feature that was affected">Feature: </Label>
</td> </td>
<td> <td>
<input id="feature" class="form-control" @bind="@_feature" disabled /> <input id="feature" class="form-control" @bind="@_feature" readonly />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -37,7 +37,7 @@
<Label For="function" HelpText="The function that was performed">Function: </Label> <Label For="function" HelpText="The function that was performed">Function: </Label>
</td> </td>
<td> <td>
<input id="function" class="form-control" @bind="@_function" disabled /> <input id="function" class="form-control" @bind="@_function" readonly />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -45,7 +45,7 @@
<Label For="category" HelpText="The categories that were affected">Category: </Label> <Label For="category" HelpText="The categories that were affected">Category: </Label>
</td> </td>
<td> <td>
<input id="category" class="form-control" @bind="@_category" disabled /> <input id="category" class="form-control" @bind="@_category" readonly />
</td> </td>
</tr> </tr>
@if (_pageName != string.Empty) @if (_pageName != string.Empty)
@ -55,7 +55,7 @@
<Label For="page" HelpText="The page that was affected">Page: </Label> <Label For="page" HelpText="The page that was affected">Page: </Label>
</td> </td>
<td> <td>
<input id="page" class="form-control" @bind="@_pageName" disabled /> <input id="page" class="form-control" @bind="@_pageName" readonly />
</td> </td>
</tr> </tr>
} }
@ -66,7 +66,7 @@
<Label For="module" HelpText="The module that was affected">Module: </Label> <Label For="module" HelpText="The module that was affected">Module: </Label>
</td> </td>
<td> <td>
<input id="module" class="form-control" @bind="@_moduleTitle" disabled /> <input id="module" class="form-control" @bind="@_moduleTitle" readonly />
</td> </td>
</tr> </tr>
} }
@ -77,7 +77,7 @@
<Label For="user" HelpText="The user that caused this log">User: </Label> <Label For="user" HelpText="The user that caused this log">User: </Label>
</td> </td>
<td> <td>
<input id="user" class="form-control" @bind="@_username" disabled /> <input id="user" class="form-control" @bind="@_username" readonly />
</td> </td>
</tr> </tr>
} }
@ -86,7 +86,7 @@
<Label For="url" HelpText="The url the log comes from">Url: </Label> <Label For="url" HelpText="The url the log comes from">Url: </Label>
</td> </td>
<td> <td>
<input id="url" class="form-control" @bind="@_url" disabled /> <input id="url" class="form-control" @bind="@_url" readonly />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -94,7 +94,7 @@
<Label For="template" HelpText="What the log is about">Template: </Label> <Label For="template" HelpText="What the log is about">Template: </Label>
</td> </td>
<td> <td>
<input id="template" class="form-control" @bind="@_template" disabled /> <input id="template" class="form-control" @bind="@_template" readonly />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -102,7 +102,7 @@
<Label For="message" HelpText="The message that the system generated"class="control-label">Message: </Label> <Label For="message" HelpText="The message that the system generated"class="control-label">Message: </Label>
</td> </td>
<td> <td>
<textarea id="message" class="form-control" @bind="@_message" rows="5" disabled></textarea> <textarea id="message" class="form-control" @bind="@_message" rows="5" readonly></textarea>
</td> </td>
</tr> </tr>
@if (!string.IsNullOrEmpty(_exception)) @if (!string.IsNullOrEmpty(_exception))
@ -112,7 +112,7 @@
<Label For="exception" HelpText="The exceptions generated by the system">Exception: </Label> <Label For="exception" HelpText="The exceptions generated by the system">Exception: </Label>
</td> </td>
<td> <td>
<textarea id="exception" class="form-control" @bind="@_exception" rows="5" disabled></textarea> <textarea id="exception" class="form-control" @bind="@_exception" rows="5" readonly></textarea>
</td> </td>
</tr> </tr>
} }
@ -121,7 +121,7 @@
<Label For="properties" HelpText="The properties that were affected">Properties: </Label> <Label For="properties" HelpText="The properties that were affected">Properties: </Label>
</td> </td>
<td> <td>
<textarea id="properties" class="form-control" @bind="@_properties" rows="5" disabled></textarea> <textarea id="properties" class="form-control" @bind="@_properties" rows="5" readonly></textarea>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -129,7 +129,7 @@
<Label For="server" HelpText="The server that was affected">Server: </Label> <Label For="server" HelpText="The server that was affected">Server: </Label>
</td> </td>
<td> <td>
<input id="server" class="form-control" @bind="@_server" disabled /> <input id="server" class="form-control" @bind="@_server" readonly />
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -43,7 +43,7 @@
{ {
try try
{ {
[Module]Service = new [Module]Service(http, sitestate, NavigationManager); [Module]Service = new [Module]Service(http, sitestate);
if (PageState.Action == "Edit") if (PageState.Action == "Edit")
{ {
_id = Int32.Parse(PageState.QueryString["id"]); _id = Int32.Parse(PageState.QueryString["id"]);

View File

@ -78,7 +78,7 @@ else
{ {
try try
{ {
[Module]Service = new [Module]Service(http, sitestate, NavigationManager); [Module]Service = new [Module]Service(http, sitestate);
_[Module]s = await [Module]Service.Get[Module]sAsync(ModuleState.ModuleId); _[Module]s = await [Module]Service.Get[Module]sAsync(ModuleState.ModuleId);
} }
catch (Exception ex) catch (Exception ex)

View File

@ -2,7 +2,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Modules; using Oqtane.Modules;
using Oqtane.Services; using Oqtane.Services;
using Oqtane.Shared; using Oqtane.Shared;
@ -12,44 +11,39 @@ namespace [Owner].[Module]s.Services
{ {
public class [Module]Service : ServiceBase, I[Module]Service, IService public class [Module]Service : ServiceBase, I[Module]Service, IService
{ {
private readonly NavigationManager _navigationManager;
private readonly SiteState _siteState; private readonly SiteState _siteState;
public [Module]Service(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public [Module]Service(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl=> CreateApiUrl(_siteState.Alias, "[Module]");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "[Module]"); }
}
public async Task<List<[Module]>> Get[Module]sAsync(int ModuleId) public async Task<List<[Module]>> Get[Module]sAsync(int ModuleId)
{ {
List<[Module]> [Module]s = await GetJsonAsync<List<[Module]>>(Apiurl + "?moduleid=" + ModuleId.ToString()); List<[Module]> [Module]s = await GetJsonAsync<List<[Module]>>($"{Apiurl}?moduleid={ModuleId}");
return [Module]s.OrderBy(item => item.Name).ToList(); return [Module]s.OrderBy(item => item.Name).ToList();
} }
public async Task<[Module]> Get[Module]Async(int [Module]Id) public async Task<[Module]> Get[Module]Async(int [Module]Id)
{ {
return await GetJsonAsync<[Module]>(Apiurl + "/" + [Module]Id.ToString()); return await GetJsonAsync<[Module]>($"{Apiurl}/{[Module]Id}");
} }
public async Task<[Module]> Add[Module]Async([Module] [Module]) public async Task<[Module]> Add[Module]Async([Module] [Module])
{ {
return await PostJsonAsync<[Module]>(Apiurl + "?entityid=" + [Module].ModuleId, [Module]); return await PostJsonAsync<[Module]>($"{Apiurl}?entityid={[Module].ModuleId}", [Module]);
} }
public async Task<[Module]> Update[Module]Async([Module] [Module]) public async Task<[Module]> Update[Module]Async([Module] [Module])
{ {
return await PutJsonAsync<[Module]>(Apiurl + "/" + [Module].[Module]Id + "?entityid=" + [Module].ModuleId, [Module]); return await PutJsonAsync<[Module]>($"{Apiurl}/{[Module].[Module]Id}?entityid={[Module].ModuleId}", [Module]);
} }
public async Task Delete[Module]Async(int [Module]Id) public async Task Delete[Module]Async(int [Module]Id)
{ {
await DeleteAsync(Apiurl + "/" + [Module]Id.ToString()); await DeleteAsync($"{Apiurl}/{[Module]Id}");
} }
} }
} }

View File

@ -43,7 +43,7 @@
{ {
try try
{ {
[Module]Service = new [Module]Service(http, sitestate, NavigationManager); [Module]Service = new [Module]Service(http, sitestate);
if (PageState.Action == "Edit") if (PageState.Action == "Edit")
{ {
_id = Int32.Parse(PageState.QueryString["id"]); _id = Int32.Parse(PageState.QueryString["id"]);

View File

@ -69,7 +69,7 @@ else
{ {
try try
{ {
[Module]Service = new [Module]Service(http, sitestate, NavigationManager); [Module]Service = new [Module]Service(http, sitestate);
_[Module]s = await [Module]Service.Get[Module]sAsync(ModuleState.ModuleId); _[Module]s = await [Module]Service.Get[Module]sAsync(ModuleState.ModuleId);
} }
catch (Exception ex) catch (Exception ex)

View File

@ -2,7 +2,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Modules; using Oqtane.Modules;
using Oqtane.Services; using Oqtane.Services;
using Oqtane.Shared; using Oqtane.Shared;
@ -12,44 +11,39 @@ namespace [Owner].[Module]s.Services
{ {
public class [Module]Service : ServiceBase, I[Module]Service, IService public class [Module]Service : ServiceBase, I[Module]Service, IService
{ {
private readonly NavigationManager _navigationManager;
private readonly SiteState _siteState; private readonly SiteState _siteState;
public [Module]Service(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public [Module]Service(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl=> CreateApiUrl(_siteState.Alias, "[Module]");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "[Module]"); }
}
public async Task<List<[Module]>> Get[Module]sAsync(int ModuleId) public async Task<List<[Module]>> Get[Module]sAsync(int ModuleId)
{ {
List<[Module]> [Module]s = await GetJsonAsync<List<[Module]>>(Apiurl + "?moduleid=" + ModuleId.ToString()); List<[Module]> [Module]s = await GetJsonAsync<List<[Module]>>($"{Apiurl}?moduleid={ModuleId}");
return [Module]s.OrderBy(item => item.Name).ToList(); return [Module]s.OrderBy(item => item.Name).ToList();
} }
public async Task<[Module]> Get[Module]Async(int [Module]Id) public async Task<[Module]> Get[Module]Async(int [Module]Id)
{ {
return await GetJsonAsync<[Module]>(Apiurl + "/" + [Module]Id.ToString()); return await GetJsonAsync<[Module]>($"{Apiurl}/{[Module]Id}");
} }
public async Task<[Module]> Add[Module]Async([Module] [Module]) public async Task<[Module]> Add[Module]Async([Module] [Module])
{ {
return await PostJsonAsync<[Module]>(Apiurl + "?entityid=" + [Module].ModuleId, [Module]); return await PostJsonAsync<[Module]>($"{Apiurl}?entityid={[Module].ModuleId}", [Module]);
} }
public async Task<[Module]> Update[Module]Async([Module] [Module]) public async Task<[Module]> Update[Module]Async([Module] [Module])
{ {
return await PutJsonAsync<[Module]>(Apiurl + "/" + [Module].[Module]Id + "?entityid=" + [Module].ModuleId, [Module]); return await PutJsonAsync<[Module]>($"{Apiurl}/{[Module].[Module]Id}?entityid={[Module].ModuleId}", [Module]);
} }
public async Task Delete[Module]Async(int [Module]Id) public async Task Delete[Module]Async(int [Module]Id)
{ {
await DeleteAsync(Apiurl + "/" + [Module]Id.ToString()); await DeleteAsync($"{Apiurl}/{[Module]Id}");
} }
} }
} }

View File

@ -101,7 +101,7 @@
</td> </td>
<td> <td>
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))"> <select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
<option value="">&lt;Select Theme&gt;</option> <option value="-">&lt;Select Theme&gt;</option>
@foreach (KeyValuePair<string, string> item in _themes) @foreach (KeyValuePair<string, string> item in _themes)
{ {
if (item.Key == _themetype) if (item.Key == _themetype)
@ -122,7 +122,7 @@
</td> </td>
<td> <td>
<select id="Layout" class="form-control" @bind="@_layouttype"> <select id="Layout" class="form-control" @bind="@_layouttype">
<option value="">&lt;Select Layout&gt;</option> <option value="-">&lt;Select Layout&gt;</option>
@foreach (KeyValuePair<string, string> panelayout in _panelayouts) @foreach (KeyValuePair<string, string> panelayout in _panelayouts)
{ {
if (panelayout.Key == _layouttype) if (panelayout.Key == _layouttype)
@ -200,8 +200,8 @@
private string _url; private string _url;
private string _ispersonalizable = "False"; private string _ispersonalizable = "False";
private string _mode = "view"; private string _mode = "view";
private string _themetype = string.Empty; private string _themetype = "-";
private string _layouttype = string.Empty; private string _layouttype = "-";
private string _icon = string.Empty; private string _icon = string.Empty;
private string _permissions = string.Empty; private string _permissions = string.Empty;
private PermissionGrid _permissionGrid; private PermissionGrid _permissionGrid;
@ -271,7 +271,7 @@
try try
{ {
_themetype = (string)e.Value; _themetype = (string)e.Value;
if (_themetype != string.Empty) if (_themetype != "-")
{ {
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
} }
@ -350,11 +350,8 @@
page.IsNavigation = (_isnavigation == null ? true : Boolean.Parse(_isnavigation)); page.IsNavigation = (_isnavigation == null ? true : Boolean.Parse(_isnavigation));
page.Url = _url; page.Url = _url;
page.EditMode = (_mode == "edit" ? true : false); page.EditMode = (_mode == "edit" ? true : false);
page.ThemeType = _themetype; page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
page.LayoutType = (_layouttype == null ? string.Empty : _layouttype); page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
page.Icon = (_icon == null ? string.Empty : _icon);
page.Permissions = _permissionGrid.GetPermissions();
if (page.ThemeType == PageState.Site.DefaultThemeType) if (page.ThemeType == PageState.Site.DefaultThemeType)
{ {
page.ThemeType = string.Empty; page.ThemeType = string.Empty;
@ -364,7 +361,8 @@
{ {
page.LayoutType = string.Empty; page.LayoutType = string.Empty;
} }
page.Icon = (_icon == null ? string.Empty : _icon);
page.Permissions = _permissionGrid.GetPermissions();
page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable)); page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable));
page.UserId = null; page.UserId = null;

View File

@ -112,7 +112,7 @@
</td> </td>
<td> <td>
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))"> <select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
<option value="">&lt;Select Theme&gt;</option> <option value="-">&lt;Select Theme&gt;</option>
@foreach (KeyValuePair<string, string> item in _themes) @foreach (KeyValuePair<string, string> item in _themes)
{ {
if (item.Key == _themetype) if (item.Key == _themetype)
@ -133,7 +133,7 @@
</td> </td>
<td> <td>
<select id="Layout" class="form-control" @bind="@_layouttype"> <select id="Layout" class="form-control" @bind="@_layouttype">
<option value="">&lt;Select Layout&gt;</option> <option value="-">&lt;Select Layout&gt;</option>
@foreach (KeyValuePair<string, string> panelayout in _panelayouts) @foreach (KeyValuePair<string, string> panelayout in _panelayouts)
{ {
if (panelayout.Key == _layouttype) if (panelayout.Key == _layouttype)
@ -215,8 +215,8 @@
private string _url; private string _url;
private string _ispersonalizable; private string _ispersonalizable;
private string _mode; private string _mode;
private string _themetype; private string _themetype = "-";
private string _layouttype; private string _layouttype = "-";
private string _icon; private string _icon;
private string _permissions; private string _permissions;
private string _createdby; private string _createdby;
@ -272,6 +272,14 @@
_themetype = page.ThemeType; _themetype = page.ThemeType;
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
_layouttype = page.LayoutType; _layouttype = page.LayoutType;
if (_themetype == PageState.Site.DefaultThemeType)
{
_themetype = "-";
}
if (_layouttype == PageState.Site.DefaultLayoutType)
{
_layouttype = "-";
}
_icon = page.Icon; _icon = page.Icon;
_permissions = page.Permissions; _permissions = page.Permissions;
_createdby = page.CreatedBy; _createdby = page.CreatedBy;
@ -337,7 +345,7 @@
try try
{ {
_themetype = (string)e.Value; _themetype = (string)e.Value;
if (_themetype != string.Empty) if (_themetype != "-")
{ {
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
} }
@ -417,11 +425,8 @@
page.IsNavigation = (_isnavigation == null || Boolean.Parse(_isnavigation)); page.IsNavigation = (_isnavigation == null || Boolean.Parse(_isnavigation));
page.Url = _url; page.Url = _url;
page.EditMode = (_mode == "edit"); page.EditMode = (_mode == "edit");
page.ThemeType = _themetype; page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
page.LayoutType = _layouttype ?? string.Empty; page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
page.Icon = _icon ?? string.Empty;
page.Permissions = _permissionGrid.GetPermissions();
if (page.ThemeType == PageState.Site.DefaultThemeType) if (page.ThemeType == PageState.Site.DefaultThemeType)
{ {
page.ThemeType = string.Empty; page.ThemeType = string.Empty;
@ -430,6 +435,8 @@
{ {
page.LayoutType = string.Empty; page.LayoutType = string.Empty;
} }
page.Icon = _icon ?? string.Empty;
page.Permissions = _permissionGrid.GetPermissions();
page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable)); page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable));
page.UserId = null; page.UserId = null;

View File

@ -171,7 +171,7 @@
<table class="table table-borderless"> <table class="table table-borderless">
<tr> <tr>
<td> <td>
<Label For="isEnabled" HelpText="Select whether you would like this site to be avaiable as a proggressive web application">Is Enabled? </Label> <Label For="isEnabled" HelpText="Select whether you would like this site to be available as a Progressive Web Application (PWA)">Is Enabled? </Label>
</td> </td>
<td> <td>
<select id="isEnabled" class="form-control" @bind="@_pwaisenabled"> <select id="isEnabled" class="form-control" @bind="@_pwaisenabled">
@ -182,7 +182,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<Label For="appIcon" HelpText="Include an application icon for your PWA">App Icon: </Label> <Label For="appIcon" HelpText="Include an application icon for your PWA. It should be a PNG which is 192 X 192 pixels in dimension.">App Icon: </Label>
</td> </td>
<td> <td>
<FileManager FileId="@_pwaappiconfileid.ToString()" Filter="png" @ref="_pwaappiconfilemanager" /> <FileManager FileId="@_pwaappiconfileid.ToString()" Filter="png" @ref="_pwaappiconfilemanager" />
@ -190,7 +190,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<Label For="splashIcon" HelpText="Include a splash icon">Splash Icon: </Label> <Label For="splashIcon" HelpText="Include a splash icon for your PWA. It should be a PNG which is 512 X 512 pixels in dimension.">Splash Icon: </Label>
</td> </td>
<td> <td>
<FileManager FileId="@_pwasplashiconfileid.ToString()" Filter="png" @ref="_pwasplashiconfilemanager" /> <FileManager FileId="@_pwasplashiconfileid.ToString()" Filter="png" @ref="_pwasplashiconfilemanager" />
@ -251,7 +251,7 @@
{ {
_themeList = await ThemeService.GetThemesAsync(); _themeList = await ThemeService.GetThemesAsync();
_aliasList = await AliasService.GetAliasesAsync(); _aliasList = await AliasService.GetAliasesAsync();
Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId, PageState.Alias); Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId);
if (site != null) if (site != null)
{ {
_name = site.Name; _name = site.Name;
@ -364,7 +364,7 @@
if (unique) if (unique)
{ {
var site = await SiteService.GetSiteAsync(PageState.Site.SiteId, PageState.Alias); var site = await SiteService.GetSiteAsync(PageState.Site.SiteId);
if (site != null) if (site != null)
{ {
site.Name = _name; site.Name = _name;
@ -395,7 +395,7 @@
site.PwaSplashIconFileId = pwasplashiconfileid; site.PwaSplashIconFileId = pwasplashiconfileid;
} }
site = await SiteService.UpdateSiteAsync(site, PageState.Alias); site = await SiteService.UpdateSiteAsync(site);
_urls = _urls.Replace("\n", ","); _urls = _urls.Replace("\n", ",");
var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

View File

@ -134,18 +134,19 @@
_aliasList = await AliasService.GetAliasesAsync(); _aliasList = await AliasService.GetAliasesAsync();
_alias = _aliasList.Find(item => item.AliasId == Int32.Parse(PageState.QueryString["id"])); _alias = _aliasList.Find(item => item.AliasId == Int32.Parse(PageState.QueryString["id"]));
var site = await SiteService.GetSiteAsync(_alias.SiteId, _alias); SiteService.SetAlias(_alias);
var site = await SiteService.GetSiteAsync(_alias.SiteId);
if (site != null) if (site != null)
{ {
_name = site.Name; _name = site.Name;
_tenantList = await TenantService.GetTenantsAsync(); _tenantList = await TenantService.GetTenantsAsync();
_tenant = _tenantList.Find(item => item.TenantId == site.TenantId).Name; _tenant = _tenantList.Find(item => item.TenantId == site.TenantId).Name;
foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList())
{ {
_urls += alias.Name + "\n"; _urls += alias.Name + "\n";
} }
_themetype = site.DefaultThemeType; _themetype = site.DefaultThemeType;
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
_layouttype = site.DefaultLayoutType; _layouttype = site.DefaultLayoutType;
@ -182,7 +183,7 @@
{ {
_panelayouts = new Dictionary<string, string>(); _panelayouts = new Dictionary<string, string>();
} }
StateHasChanged(); StateHasChanged();
} }
catch (Exception ex) catch (Exception ex)
@ -206,10 +207,11 @@
unique = false; unique = false;
} }
} }
if (unique) if (unique)
{ {
var site = await SiteService.GetSiteAsync(_alias.SiteId, _alias); SiteService.SetAlias(_alias);
var site = await SiteService.GetSiteAsync(_alias.SiteId);
if (site != null) if (site != null)
{ {
site.Name = _name; site.Name = _name;
@ -219,11 +221,11 @@
site.DefaultContainerType = _containertype; site.DefaultContainerType = _containertype;
site.IsDeleted = (_isdeleted == null || Boolean.Parse(_isdeleted)); site.IsDeleted = (_isdeleted == null || Boolean.Parse(_isdeleted));
site = await SiteService.UpdateSiteAsync(site, _alias); site = await SiteService.UpdateSiteAsync(site);
_urls = _urls.Replace("\n", ","); _urls = _urls.Replace("\n", ",");
var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList())
{ {
if (!names.Contains(alias.Name)) if (!names.Contains(alias.Name))
@ -231,7 +233,7 @@
await AliasService.DeleteAliasAsync(alias.AliasId); await AliasService.DeleteAliasAsync(alias.AliasId);
} }
} }
foreach (string name in names) foreach (string name in names)
{ {
if (!_aliasList.Exists(item => item.Name == name)) if (!_aliasList.Exists(item => item.Name == name))

View File

@ -54,7 +54,8 @@ else
{ {
if (alias.SiteId != PageState.Site.SiteId || alias.TenantId != PageState.Site.TenantId) if (alias.SiteId != PageState.Site.SiteId || alias.TenantId != PageState.Site.TenantId)
{ {
await SiteService.DeleteSiteAsync(alias.SiteId, alias); SiteService.SetAlias(alias);
await SiteService.DeleteSiteAsync(alias.SiteId);
await Log(alias, LogLevel.Information, "", null, "Site Deleted {SiteId}", alias.SiteId); await Log(alias, LogLevel.Information, "", null, "Site Deleted {SiteId}", alias.SiteId);
var aliases = await AliasService.GetAliasesAsync(); var aliases = await AliasService.GetAliasesAsync();

View File

@ -16,7 +16,7 @@
<RichTextEditor @ref="@RichTextEditorHtml"> <RichTextEditor @ref="@RichTextEditorHtml">
<ToolbarContent> <ToolbarContent>
<select class="ql-header"> <select class="ql-header">
<option selected=string.Empty></option> <option selected=""></option>
<option value="1"></option> <option value="1"></option>
<option value="2"></option> <option value="2"></option>
<option value="3"></option> <option value="3"></option>
@ -123,7 +123,7 @@
private async Task LoadText() private async Task LoadText()
{ {
var htmltextservice = new HtmlTextService(http, sitestate, NavigationManager); var htmltextservice = new HtmlTextService(http, sitestate);
var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId); var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId);
if (htmltext != null) if (htmltext != null)
{ {
@ -166,7 +166,7 @@
try try
{ {
var htmltextservice = new HtmlTextService(http, sitestate, NavigationManager); var htmltextservice = new HtmlTextService(http, sitestate);
var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId); var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId);
if (htmltext != null) if (htmltext != null)
{ {

View File

@ -25,7 +25,7 @@
{ {
try try
{ {
var htmltextservice = new HtmlTextService(http, sitestate, NavigationManager); var htmltextservice = new HtmlTextService(http, sitestate);
var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId); var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId);
if (htmltext != null) if (htmltext != null)
{ {

View File

@ -2,7 +2,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Modules.HtmlText.Models; using Oqtane.Modules.HtmlText.Models;
using Oqtane.Services; using Oqtane.Services;
using Oqtane.Shared; using Oqtane.Shared;
@ -10,52 +9,35 @@ using Oqtane.Shared;
namespace Oqtane.Modules.HtmlText.Services namespace Oqtane.Modules.HtmlText.Services
{ {
public class HtmlTextService : ServiceBase, IHtmlTextService public class HtmlTextService : ServiceBase, IHtmlTextService
{ {
private readonly NavigationManager _navigationManager;
private readonly SiteState _siteState; private readonly SiteState _siteState;
public HtmlTextService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public HtmlTextService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string ApiUrl => CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "HtmlText"); private string ApiUrl => CreateApiUrl(_siteState.Alias, "HtmlText");
public async Task<HtmlTextInfo> GetHtmlTextAsync(int moduleId) public async Task<HtmlTextInfo> GetHtmlTextAsync(int moduleId)
{ {
HtmlTextInfo htmlText; var htmltext = await GetJsonAsync<List<HtmlTextInfo>>($"{ApiUrl}/{moduleId}?entityid={moduleId}");
try return htmltext.FirstOrDefault();
{
//because GetJsonAsync() returns an error if no content exists for the ModuleId ( https://github.com/aspnet/AspNetCore/issues/14041 )
//null value is transfered as empty list
var htmlTextList = await GetJsonAsync<List<HtmlTextInfo>>(ApiUrl + "/" + moduleId + "?entityid=" + moduleId);
htmlText = htmlTextList.FirstOrDefault();
}
catch
{
htmlText = null;
}
return htmlText;
} }
public async Task AddHtmlTextAsync(HtmlTextInfo htmlText) public async Task AddHtmlTextAsync(HtmlTextInfo htmlText)
{ {
await PostJsonAsync(ApiUrl + "?entityid=" + htmlText.ModuleId, htmlText); await PostJsonAsync($"{ApiUrl}?entityid={htmlText.ModuleId}", htmlText);
} }
public async Task UpdateHtmlTextAsync(HtmlTextInfo htmlText) public async Task UpdateHtmlTextAsync(HtmlTextInfo htmlText)
{ {
await PutJsonAsync(ApiUrl + "/" + htmlText.HtmlTextId + "?entityid=" + htmlText.ModuleId, htmlText); await PutJsonAsync($"{ApiUrl}/{htmlText.HtmlTextId}?entityid={htmlText.ModuleId}", htmlText);
} }
public async Task DeleteHtmlTextAsync(int moduleId) public async Task DeleteHtmlTextAsync(int moduleId)
{ {
await DeleteAsync(ApiUrl + "/" + moduleId + "?entityid=" + moduleId); await DeleteAsync($"{ApiUrl}/{moduleId}?entityid={moduleId}");
} }
} }
} }

View File

@ -87,7 +87,7 @@ namespace Oqtane.Modules
public string ContentUrl(int fileid) public string ContentUrl(int fileid)
{ {
return Utilities.ContentUrl(PageState.Alias.Path, fileid); return Utilities.ContentUrl(PageState.Alias, fileid);
} }
// user feedback methods // user feedback methods

View File

@ -2,6 +2,7 @@
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Security.Claims; using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
@ -29,7 +30,7 @@ namespace Oqtane.Providers
{ {
// get HttpClient lazily from IServiceProvider as you cannot use standard dependency injection due to the AuthenticationStateProvider being initialized prior to NavigationManager ( https://github.com/aspnet/AspNetCore/issues/11867 ) // get HttpClient lazily from IServiceProvider as you cannot use standard dependency injection due to the AuthenticationStateProvider being initialized prior to NavigationManager ( https://github.com/aspnet/AspNetCore/issues/11867 )
var http = _serviceProvider.GetRequiredService<HttpClient>(); var http = _serviceProvider.GetRequiredService<HttpClient>();
string apiurl = ServiceBase.CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "User") + "/authenticate"; string apiurl = "/~/api/User/authenticate";
User user = await http.GetFromJsonAsync<User>(apiurl); User user = await http.GetFromJsonAsync<User>(apiurl);
ClaimsIdentity identity = new ClaimsIdentity(); ClaimsIdentity identity = new ClaimsIdentity();

View File

@ -2,32 +2,19 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
//using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared;
using System.Net; using System.Net;
using System; using System;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Components;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class AliasService : ServiceBase, IAliasService public class AliasService : ServiceBase, IAliasService
{ {
private readonly SiteState _siteState; public AliasService(HttpClient http) :base(http) { }
private readonly NavigationManager _navigationManager;
public AliasService(HttpClient http, SiteState siteState, NavigationManager navigationManager) :base(http) private string Apiurl => CreateApiUrl("Alias");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Alias"); }
}
public async Task<List<Alias>> GetAliasesAsync() public async Task<List<Alias>> GetAliasesAsync()
{ {
@ -37,22 +24,13 @@ namespace Oqtane.Services
public async Task<Alias> GetAliasAsync(int aliasId) public async Task<Alias> GetAliasAsync(int aliasId)
{ {
return await GetJsonAsync<Alias>($"{Apiurl}/{aliasId.ToString()}"); return await GetJsonAsync<Alias>($"{Apiurl}/{aliasId}");
} }
public async Task<Alias> GetAliasAsync(string url, DateTime lastSyncDate) public async Task<Alias> GetAliasAsync(string name, DateTime lastSyncDate)
{ {
Uri uri = new Uri(url); name = (string.IsNullOrEmpty(name)) ? "~" : name;
string name = uri.Authority; return await GetJsonAsync<Alias>($"{Apiurl}/name/{WebUtility.UrlEncode(name)}?sync={lastSyncDate.ToString("yyyyMMddHHmmssfff")}");
if (uri.Segments.Count() > 1)
{
name += "/" + uri.Segments[1];
}
if (name.EndsWith("/"))
{
name = name.Substring(0, name.Length - 1);
}
return await GetJsonAsync<Alias>($"{Apiurl}/name/{WebUtility.UrlEncode(name)}?lastsyncdate={lastSyncDate.ToString("yyyyMMddHHmmssfff")}");
} }
public async Task<Alias> AddAliasAsync(Alias alias) public async Task<Alias> AddAliasAsync(Alias alias)
@ -62,11 +40,11 @@ namespace Oqtane.Services
public async Task<Alias> UpdateAliasAsync(Alias alias) public async Task<Alias> UpdateAliasAsync(Alias alias)
{ {
return await PutJsonAsync<Alias>($"{Apiurl}/{alias.AliasId.ToString()}", alias); return await PutJsonAsync<Alias>($"{Apiurl}/{alias.AliasId}", alias);
} }
public async Task DeleteAliasAsync(int aliasId) public async Task DeleteAliasAsync(int aliasId)
{ {
await DeleteAsync($"{Apiurl}/{aliasId.ToString()}"); await DeleteAsync($"{Apiurl}/{aliasId}");
} }
} }
} }

View File

@ -3,7 +3,6 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using Oqtane.Models; using Oqtane.Models;
using Oqtane.Shared; using Oqtane.Shared;
@ -14,21 +13,15 @@ namespace Oqtane.Services
public class FileService : ServiceBase, IFileService public class FileService : ServiceBase, IFileService
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
private readonly IJSRuntime _jsRuntime; private readonly IJSRuntime _jsRuntime;
public FileService(HttpClient http, SiteState siteState, NavigationManager navigationManager, public FileService(HttpClient http, SiteState siteState, IJSRuntime jsRuntime) : base(http)
IJSRuntime jsRuntime) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
_jsRuntime = jsRuntime; _jsRuntime = jsRuntime;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "File");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "File"); }
}
public async Task<List<File>> GetFilesAsync(int folderId) public async Task<List<File>> GetFilesAsync(int folderId)
{ {
@ -54,7 +47,7 @@ namespace Oqtane.Services
public async Task<File> GetFileAsync(int fileId) public async Task<File> GetFileAsync(int fileId)
{ {
return await GetJsonAsync<File>($"{Apiurl}/{fileId.ToString()}"); return await GetJsonAsync<File>($"{Apiurl}/{fileId}");
} }
public async Task<File> AddFileAsync(File file) public async Task<File> AddFileAsync(File file)
@ -64,17 +57,17 @@ namespace Oqtane.Services
public async Task<File> UpdateFileAsync(File file) public async Task<File> UpdateFileAsync(File file)
{ {
return await PutJsonAsync<File>($"{Apiurl}/{file.FileId.ToString()}", file); return await PutJsonAsync<File>($"{Apiurl}/{file.FileId}", file);
} }
public async Task DeleteFileAsync(int fileId) public async Task DeleteFileAsync(int fileId)
{ {
await DeleteAsync($"{Apiurl}/{fileId.ToString()}"); await DeleteAsync($"{Apiurl}/{fileId}");
} }
public async Task<File> UploadFileAsync(string url, int folderId) public async Task<File> UploadFileAsync(string url, int folderId)
{ {
return await GetJsonAsync<File>($"{Apiurl}/upload?url={WebUtility.UrlEncode(url)}&folderid={folderId.ToString()}"); return await GetJsonAsync<File>($"{Apiurl}/upload?url={WebUtility.UrlEncode(url)}&folderid={folderId}");
} }
public async Task<string> UploadFilesAsync(int folderId, string[] files, string id) public async Task<string> UploadFilesAsync(int folderId, string[] files, string id)
@ -124,7 +117,7 @@ namespace Oqtane.Services
public async Task<byte[]> DownloadFileAsync(int fileId) public async Task<byte[]> DownloadFileAsync(int fileId)
{ {
return await GetByteArrayAsync($"{Apiurl}/download/{fileId.ToString()}"); return await GetByteArrayAsync($"{Apiurl}/download/{fileId}");
} }
} }
} }

View File

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared; using Oqtane.Shared;
using System; using System;
@ -14,26 +13,24 @@ namespace Oqtane.Services
public class FolderService : ServiceBase, IFolderService public class FolderService : ServiceBase, IFolderService
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public FolderService(HttpClient http, SiteState siteState, NavigationManager navigationManager):base(http) public FolderService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string ApiUrl => CreateApiUrl(_siteState.Alias, _navigationManager.Uri, EntityNames.Folder); private string ApiUrl => CreateApiUrl(_siteState.Alias, "Folder");
public async Task<List<Folder>> GetFoldersAsync(int siteId) public async Task<List<Folder>> GetFoldersAsync(int siteId)
{ {
List<Folder> folders = await GetJsonAsync<List<Folder>>($"{ApiUrl}?siteid={siteId.ToString()}"); List<Folder> folders = await GetJsonAsync<List<Folder>>($"{ApiUrl}?siteid={siteId}");
folders = GetFoldersHierarchy(folders); folders = GetFoldersHierarchy(folders);
return folders; return folders;
} }
public async Task<Folder> GetFolderAsync(int folderId) public async Task<Folder> GetFolderAsync(int folderId)
{ {
return await GetJsonAsync<Folder>($"{ApiUrl}/{folderId.ToString()}"); return await GetJsonAsync<Folder>($"{ApiUrl}/{folderId}");
} }
public async Task<Folder> GetFolderAsync(int siteId, [NotNull] string folderPath) public async Task<Folder> GetFolderAsync(int siteId, [NotNull] string folderPath)
@ -55,7 +52,7 @@ namespace Oqtane.Services
public async Task<Folder> UpdateFolderAsync(Folder folder) public async Task<Folder> UpdateFolderAsync(Folder folder)
{ {
return await PutJsonAsync<Folder>($"{ApiUrl}/{folder.FolderId.ToString()}", folder); return await PutJsonAsync<Folder>($"{ApiUrl}/{folder.FolderId}", folder);
} }
public async Task UpdateFolderOrderAsync(int siteId, int folderId, int? parentId) public async Task UpdateFolderOrderAsync(int siteId, int folderId, int? parentId)
@ -63,12 +60,12 @@ namespace Oqtane.Services
var parent = parentId == null var parent = parentId == null
? string.Empty ? string.Empty
: parentId.ToString(); : parentId.ToString();
await PutAsync($"{ApiUrl}/?siteid={siteId.ToString()}&folderid={folderId.ToString()}&parentid={parent}"); await PutAsync($"{ApiUrl}/?siteid={siteId}&folderid={folderId}&parentid={parent}");
} }
public async Task DeleteFolderAsync(int folderId) public async Task DeleteFolderAsync(int folderId)
{ {
await DeleteAsync($"{ApiUrl}/{folderId.ToString()}"); await DeleteAsync($"{ApiUrl}/{folderId}");
} }
private static List<Folder> GetFoldersHierarchy(List<Folder> folders) private static List<Folder> GetFoldersHierarchy(List<Folder> folders)

View File

@ -1,23 +1,15 @@
using Oqtane.Models; using Oqtane.Models;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared; using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class InstallationService : ServiceBase, IInstallationService public class InstallationService : ServiceBase, IInstallationService
{ {
private readonly SiteState _siteState; public InstallationService(HttpClient http):base(http) { }
private readonly NavigationManager _navigationManager;
public InstallationService(HttpClient http, SiteState siteState, NavigationManager navigationManager):base(http) private string ApiUrl => CreateApiUrl("Installation");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string ApiUrl => CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Installation");
public async Task<Installation> IsInstalled() public async Task<Installation> IsInstalled()
{ {

View File

@ -6,14 +6,16 @@ namespace Oqtane.Services
{ {
public interface ISiteService public interface ISiteService
{ {
Task<List<Site>> GetSitesAsync(Alias alias); void SetAlias(Alias alias);
Task<Site> GetSiteAsync(int siteId, Alias alias); Task<List<Site>> GetSitesAsync();
Task<Site> AddSiteAsync(Site site, Alias alias); Task<Site> GetSiteAsync(int siteId);
Task<Site> UpdateSiteAsync(Site site, Alias alias); Task<Site> AddSiteAsync(Site site);
Task DeleteSiteAsync(int siteId, Alias alias); Task<Site> UpdateSiteAsync(Site site);
Task DeleteSiteAsync(int siteId);
} }
} }

View File

@ -11,8 +11,6 @@ namespace Oqtane.Services
Task<User> AddUserAsync(User user); Task<User> AddUserAsync(User user);
Task<User> AddUserAsync(User user, Alias alias);
Task<User> UpdateUserAsync(User user); Task<User> UpdateUserAsync(User user);
Task DeleteUserAsync(int userId); Task DeleteUserAsync(int userId);

View File

@ -2,28 +2,15 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class JobLogService : ServiceBase, IJobLogService public class JobLogService : ServiceBase, IJobLogService
{ {
private readonly SiteState _siteState; public JobLogService(HttpClient http) :base(http) { }
private readonly NavigationManager _navigationManager;
public JobLogService(HttpClient http, SiteState siteState, NavigationManager navigationManager) :base(http) private string Apiurl => CreateApiUrl("JobLog");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "JobLog"); }
}
public async Task<List<JobLog>> GetJobLogsAsync() public async Task<List<JobLog>> GetJobLogsAsync()
{ {
@ -33,7 +20,7 @@ namespace Oqtane.Services
public async Task<JobLog> GetJobLogAsync(int jobLogId) public async Task<JobLog> GetJobLogAsync(int jobLogId)
{ {
return await GetJsonAsync<JobLog>($"{Apiurl}/{jobLogId.ToString()}"); return await GetJsonAsync<JobLog>($"{Apiurl}/{jobLogId}");
} }
public async Task<JobLog> AddJobLogAsync(JobLog joblog) public async Task<JobLog> AddJobLogAsync(JobLog joblog)
@ -43,11 +30,11 @@ namespace Oqtane.Services
public async Task<JobLog> UpdateJobLogAsync(JobLog joblog) public async Task<JobLog> UpdateJobLogAsync(JobLog joblog)
{ {
return await PutJsonAsync<JobLog>($"{Apiurl}/{joblog.JobLogId.ToString()}", joblog); return await PutJsonAsync<JobLog>($"{Apiurl}/{joblog.JobLogId}", joblog);
} }
public async Task DeleteJobLogAsync(int jobLogId) public async Task DeleteJobLogAsync(int jobLogId)
{ {
await DeleteAsync($"{Apiurl}/{jobLogId.ToString()}"); await DeleteAsync($"{Apiurl}/{jobLogId}");
} }
} }
} }

View File

@ -2,29 +2,15 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class JobService : ServiceBase, IJobService public class JobService : ServiceBase, IJobService
{ {
public JobService(HttpClient http) : base(http) { }
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public JobService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) private string Apiurl => CreateApiUrl("Job");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Job"); }
}
public async Task<List<Job>> GetJobsAsync() public async Task<List<Job>> GetJobsAsync()
{ {
@ -34,7 +20,7 @@ namespace Oqtane.Services
public async Task<Job> GetJobAsync(int jobId) public async Task<Job> GetJobAsync(int jobId)
{ {
return await GetJsonAsync<Job>($"{Apiurl}/{jobId.ToString()}"); return await GetJsonAsync<Job>($"{Apiurl}/{jobId}");
} }
public async Task<Job> AddJobAsync(Job job) public async Task<Job> AddJobAsync(Job job)
@ -44,21 +30,21 @@ namespace Oqtane.Services
public async Task<Job> UpdateJobAsync(Job job) public async Task<Job> UpdateJobAsync(Job job)
{ {
return await PutJsonAsync<Job>($"{Apiurl}/{job.JobId.ToString()}", job); return await PutJsonAsync<Job>($"{Apiurl}/{job.JobId}", job);
} }
public async Task DeleteJobAsync(int jobId) public async Task DeleteJobAsync(int jobId)
{ {
await DeleteAsync($"{Apiurl}/{jobId.ToString()}"); await DeleteAsync($"{Apiurl}/{jobId}");
} }
public async Task StartJobAsync(int jobId) public async Task StartJobAsync(int jobId)
{ {
await GetAsync($"{Apiurl}/start/{jobId.ToString()}"); await GetAsync($"{Apiurl}/start/{jobId}");
} }
public async Task StopJobAsync(int jobId) public async Task StopJobAsync(int jobId)
{ {
await GetAsync($"{Apiurl}/stop/{jobId.ToString()}"); await GetAsync($"{Apiurl}/stop/{jobId}");
} }
} }
} }

View File

@ -23,19 +23,16 @@ namespace Oqtane.Services
_navigationManager = navigationManager; _navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Log");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Log"); }
}
public async Task<List<Log>> GetLogsAsync(int siteId, string level, string function, int rows) public async Task<List<Log>> GetLogsAsync(int siteId, string level, string function, int rows)
{ {
return await GetJsonAsync<List<Log>>($"{Apiurl}?siteid={siteId.ToString()}&level={level}&function={function}&rows={rows.ToString()}"); return await GetJsonAsync<List<Log>>($"{Apiurl}?siteid={siteId}&level={level}&function={function}&rows={rows}");
} }
public async Task<Log> GetLogAsync(int logId) public async Task<Log> GetLogAsync(int logId)
{ {
return await GetJsonAsync<Log>($"{Apiurl}/{logId.ToString()}"); return await GetJsonAsync<Log>($"{Apiurl}/{logId}");
} }
public async Task Log(int? pageId, int? moduleId, int? userId, string category, string feature, LogFunction function, LogLevel level, Exception exception, string message, params object[] args) public async Task Log(int? pageId, int? moduleId, int? userId, string category, string feature, LogFunction function, LogLevel level, Exception exception, string message, params object[] args)
@ -52,6 +49,7 @@ namespace Oqtane.Services
} }
else else
{ {
base.Alias = alias;
log.SiteId = alias.SiteId; log.SiteId = alias.SiteId;
} }
log.PageId = pageId; log.PageId = pageId;
@ -69,7 +67,7 @@ namespace Oqtane.Services
log.Message = message; log.Message = message;
log.MessageTemplate = ""; log.MessageTemplate = "";
log.Properties = JsonSerializer.Serialize(args); log.Properties = JsonSerializer.Serialize(args);
await PostJsonAsync(CreateCrossTenantUrl(Apiurl, alias), log); await PostJsonAsync(Apiurl, log);
} }
} }
} }

View File

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using System; using System;
using System.Reflection; using System.Reflection;
using Oqtane.Shared; using Oqtane.Shared;
@ -15,34 +14,29 @@ namespace Oqtane.Services
{ {
private readonly HttpClient _http; private readonly HttpClient _http;
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public ModuleDefinitionService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public ModuleDefinitionService(HttpClient http, SiteState siteState) : base(http)
{ {
_http = http; _http = http;
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "ModuleDefinition");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, EntityNames.ModuleDefinition); }
}
public async Task<List<ModuleDefinition>> GetModuleDefinitionsAsync(int siteId) public async Task<List<ModuleDefinition>> GetModuleDefinitionsAsync(int siteId)
{ {
List<ModuleDefinition> moduledefinitions = await GetJsonAsync<List<ModuleDefinition>>($"{Apiurl}?siteid={siteId.ToString()}"); List<ModuleDefinition> moduledefinitions = await GetJsonAsync<List<ModuleDefinition>>($"{Apiurl}?siteid={siteId}");
return moduledefinitions.OrderBy(item => item.Name).ToList(); return moduledefinitions.OrderBy(item => item.Name).ToList();
} }
public async Task<ModuleDefinition> GetModuleDefinitionAsync(int moduleDefinitionId, int siteId) public async Task<ModuleDefinition> GetModuleDefinitionAsync(int moduleDefinitionId, int siteId)
{ {
return await GetJsonAsync<ModuleDefinition>($"{Apiurl}/{moduleDefinitionId.ToString()}?siteid={siteId.ToString()}"); return await GetJsonAsync<ModuleDefinition>($"{Apiurl}/{moduleDefinitionId}?siteid={siteId}");
} }
public async Task UpdateModuleDefinitionAsync(ModuleDefinition moduleDefinition) public async Task UpdateModuleDefinitionAsync(ModuleDefinition moduleDefinition)
{ {
await PutJsonAsync($"{Apiurl}/{moduleDefinition.ModuleDefinitionId.ToString()}", moduleDefinition); await PutJsonAsync($"{Apiurl}/{moduleDefinition.ModuleDefinitionId}", moduleDefinition);
} }
public async Task InstallModuleDefinitionsAsync() public async Task InstallModuleDefinitionsAsync()
@ -52,7 +46,7 @@ namespace Oqtane.Services
public async Task DeleteModuleDefinitionAsync(int moduleDefinitionId, int siteId) public async Task DeleteModuleDefinitionAsync(int moduleDefinitionId, int siteId)
{ {
await DeleteAsync($"{Apiurl}/{moduleDefinitionId.ToString()}?siteid={siteId.ToString()}"); await DeleteAsync($"{Apiurl}/{moduleDefinitionId}?siteid={siteId}");
} }
public async Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime) public async Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime)

View File

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared; using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
@ -12,23 +11,17 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public ModuleService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public ModuleService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Module");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Module"); }
}
public async Task<List<Module>> GetModulesAsync(int siteId) public async Task<List<Module>> GetModulesAsync(int siteId)
{ {
List<Module> modules = await GetJsonAsync<List<Module>>($"{Apiurl}?siteid={siteId.ToString()}"); List<Module> modules = await GetJsonAsync<List<Module>>($"{Apiurl}?siteid={siteId}");
modules = modules modules = modules
.OrderBy(item => item.Order) .OrderBy(item => item.Order)
.ToList(); .ToList();
@ -37,7 +30,7 @@ namespace Oqtane.Services
public async Task<Module> GetModuleAsync(int moduleId) public async Task<Module> GetModuleAsync(int moduleId)
{ {
return await GetJsonAsync<Module>($"{Apiurl}/{moduleId.ToString()}"); return await GetJsonAsync<Module>($"{Apiurl}/{moduleId}");
} }
public async Task<Module> AddModuleAsync(Module module) public async Task<Module> AddModuleAsync(Module module)
@ -47,7 +40,7 @@ namespace Oqtane.Services
public async Task<Module> UpdateModuleAsync(Module module) public async Task<Module> UpdateModuleAsync(Module module)
{ {
return await PutJsonAsync<Module>($"{Apiurl}/{module.ModuleId.ToString()}", module); return await PutJsonAsync<Module>($"{Apiurl}/{module.ModuleId}", module);
} }
public async Task DeleteModuleAsync(int moduleId) public async Task DeleteModuleAsync(int moduleId)
@ -62,7 +55,7 @@ namespace Oqtane.Services
public async Task<string> ExportModuleAsync(int moduleId) public async Task<string> ExportModuleAsync(int moduleId)
{ {
return await GetStringAsync($"{Apiurl}/export?moduleid={moduleId.ToString()}"); return await GetStringAsync($"{Apiurl}/export?moduleid={moduleId}");
} }
} }
} }

View File

@ -1,7 +1,6 @@
using Oqtane.Models; using Oqtane.Models;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared; using Oqtane.Shared;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -11,29 +10,24 @@ namespace Oqtane.Services
public class NotificationService : ServiceBase, INotificationService public class NotificationService : ServiceBase, INotificationService
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public NotificationService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public NotificationService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Notification");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Notification"); }
}
public async Task<List<Notification>> GetNotificationsAsync(int siteId, string direction, int userId) public async Task<List<Notification>> GetNotificationsAsync(int siteId, string direction, int userId)
{ {
var notifications = await GetJsonAsync<List<Notification>>($"{Apiurl}?siteid={siteId.ToString()}&direction={direction.ToLower()}&userid={userId.ToString()}"); var notifications = await GetJsonAsync<List<Notification>>($"{Apiurl}?siteid={siteId}&direction={direction.ToLower()}&userid={userId}");
return notifications.OrderByDescending(item => item.CreatedOn).ToList(); return notifications.OrderByDescending(item => item.CreatedOn).ToList();
} }
public async Task<Notification> GetNotificationAsync(int notificationId) public async Task<Notification> GetNotificationAsync(int notificationId)
{ {
return await GetJsonAsync<Notification>($"{Apiurl}/{notificationId.ToString()}"); return await GetJsonAsync<Notification>($"{Apiurl}/{notificationId}");
} }
public async Task<Notification> AddNotificationAsync(Notification notification) public async Task<Notification> AddNotificationAsync(Notification notification)
@ -43,12 +37,12 @@ namespace Oqtane.Services
public async Task<Notification> UpdateNotificationAsync(Notification notification) public async Task<Notification> UpdateNotificationAsync(Notification notification)
{ {
return await PutJsonAsync<Notification>($"{Apiurl}/{notification.NotificationId.ToString()}", notification); return await PutJsonAsync<Notification>($"{Apiurl}/{notification.NotificationId}", notification);
} }
public async Task DeleteNotificationAsync(int notificationId) public async Task DeleteNotificationAsync(int notificationId)
{ {
await DeleteAsync($"{Apiurl}/{notificationId.ToString()}"); await DeleteAsync($"{Apiurl}/{notificationId}");
} }
} }
} }

View File

@ -2,29 +2,15 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared;
using System.Linq; using System.Linq;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class PackageService : ServiceBase, IPackageService public class PackageService : ServiceBase, IPackageService
{ {
public PackageService(HttpClient http) : base(http) { }
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public PackageService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) private string Apiurl => CreateApiUrl("Package");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Package"); }
}
public async Task<List<Package>> GetPackagesAsync(string tag) public async Task<List<Package>> GetPackagesAsync(string tag)
{ {

View File

@ -1,7 +1,6 @@
using Oqtane.Models; using Oqtane.Models;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared; using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
@ -10,28 +9,22 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public PageModuleService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public PageModuleService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "PageModule");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "PageModule"); }
}
public async Task<PageModule> GetPageModuleAsync(int pageModuleId) public async Task<PageModule> GetPageModuleAsync(int pageModuleId)
{ {
return await GetJsonAsync<PageModule>($"{Apiurl}/{pageModuleId.ToString()}"); return await GetJsonAsync<PageModule>($"{Apiurl}/{pageModuleId}");
} }
public async Task<PageModule> GetPageModuleAsync(int pageId, int moduleId) public async Task<PageModule> GetPageModuleAsync(int pageId, int moduleId)
{ {
return await GetJsonAsync<PageModule>($"{Apiurl}/{pageId.ToString()}/{moduleId.ToString()}"); return await GetJsonAsync<PageModule>($"{Apiurl}/{pageId}/{moduleId}");
} }
public async Task<PageModule> AddPageModuleAsync(PageModule pageModule) public async Task<PageModule> AddPageModuleAsync(PageModule pageModule)
@ -41,17 +34,17 @@ namespace Oqtane.Services
public async Task<PageModule> UpdatePageModuleAsync(PageModule pageModule) public async Task<PageModule> UpdatePageModuleAsync(PageModule pageModule)
{ {
return await PutJsonAsync<PageModule>($"{Apiurl}/{pageModule.PageModuleId.ToString()}", pageModule); return await PutJsonAsync<PageModule>($"{Apiurl}/{pageModule.PageModuleId}", pageModule);
} }
public async Task UpdatePageModuleOrderAsync(int pageId, string pane) public async Task UpdatePageModuleOrderAsync(int pageId, string pane)
{ {
await PutAsync($"{Apiurl}/?pageid={pageId.ToString()}&pane={pane}"); await PutAsync($"{Apiurl}/?pageid={pageId}&pane={pane}");
} }
public async Task DeletePageModuleAsync(int pageModuleId) public async Task DeletePageModuleAsync(int pageModuleId)
{ {
await DeleteAsync($"{Apiurl}/{pageModuleId.ToString()}"); await DeleteAsync($"{Apiurl}/{pageModuleId}");
} }
} }
} }

View File

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared; using Oqtane.Shared;
using System; using System;
@ -14,42 +13,37 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public PageService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public PageService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Page");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Page"); }
}
public async Task<List<Page>> GetPagesAsync(int siteId) public async Task<List<Page>> GetPagesAsync(int siteId)
{ {
List<Page> pages = await GetJsonAsync<List<Page>>($"{Apiurl}?siteid={siteId.ToString()}"); List<Page> pages = await GetJsonAsync<List<Page>>($"{Apiurl}?siteid={siteId}");
pages = GetPagesHierarchy(pages); pages = GetPagesHierarchy(pages);
return pages; return pages;
} }
public async Task<Page> GetPageAsync(int pageId) public async Task<Page> GetPageAsync(int pageId)
{ {
return await GetJsonAsync<Page>($"{Apiurl}/{pageId.ToString()}"); return await GetJsonAsync<Page>($"{Apiurl}/{pageId}");
} }
public async Task<Page> GetPageAsync(int pageId, int userId) public async Task<Page> GetPageAsync(int pageId, int userId)
{ {
return await GetJsonAsync<Page>($"{Apiurl}/{pageId.ToString()}?userid={userId.ToString()}"); return await GetJsonAsync<Page>($"{Apiurl}/{pageId}?userid={userId}");
} }
public async Task<Page> GetPageAsync(string path, int siteId) public async Task<Page> GetPageAsync(string path, int siteId)
{ {
try try
{ {
return await GetJsonAsync<Page>($"{Apiurl}/path/{siteId.ToString()}?path={WebUtility.UrlEncode(path)}"); return await GetJsonAsync<Page>($"{Apiurl}/path/{siteId}?path={WebUtility.UrlEncode(path)}");
} }
catch catch
{ {
@ -64,12 +58,12 @@ namespace Oqtane.Services
public async Task<Page> AddPageAsync(int pageId, int userId) public async Task<Page> AddPageAsync(int pageId, int userId)
{ {
return await PostJsonAsync<Page>($"{Apiurl}/{pageId.ToString()}?userid={userId.ToString()}", null); return await PostJsonAsync<Page>($"{Apiurl}/{pageId}?userid={userId}", null);
} }
public async Task<Page> UpdatePageAsync(Page page) public async Task<Page> UpdatePageAsync(Page page)
{ {
return await PutJsonAsync<Page>($"{Apiurl}/{page.PageId.ToString()}", page); return await PutJsonAsync<Page>($"{Apiurl}/{page.PageId}", page);
} }
public async Task UpdatePageOrderAsync(int siteId, int pageId, int? parentId) public async Task UpdatePageOrderAsync(int siteId, int pageId, int? parentId)
@ -77,12 +71,12 @@ namespace Oqtane.Services
var parent = parentId == null var parent = parentId == null
? string.Empty ? string.Empty
: parentId.ToString(); : parentId.ToString();
await PutAsync($"{Apiurl}/?siteid={siteId.ToString()}&pageid={pageId.ToString()}&parentid={parent}"); await PutAsync($"{Apiurl}/?siteid={siteId}&pageid={pageId}&parentid={parent}");
} }
public async Task DeletePageAsync(int pageId) public async Task DeletePageAsync(int pageId)
{ {
await DeleteAsync($"{Apiurl}/{pageId.ToString()}"); await DeleteAsync($"{Apiurl}/{pageId}");
} }
private static List<Page> GetPagesHierarchy(List<Page> pages) private static List<Page> GetPagesHierarchy(List<Page> pages)

View File

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared; using Oqtane.Shared;
@ -12,29 +11,23 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public ProfileService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public ProfileService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Profile");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Profile"); }
}
public async Task<List<Profile>> GetProfilesAsync(int siteId) public async Task<List<Profile>> GetProfilesAsync(int siteId)
{ {
List<Profile> profiles = await GetJsonAsync<List<Profile>>($"{Apiurl}?siteid={siteId.ToString()}"); List<Profile> profiles = await GetJsonAsync<List<Profile>>($"{Apiurl}?siteid={siteId}");
return profiles.OrderBy(item => item.ViewOrder).ToList(); return profiles.OrderBy(item => item.ViewOrder).ToList();
} }
public async Task<Profile> GetProfileAsync(int profileId) public async Task<Profile> GetProfileAsync(int profileId)
{ {
return await GetJsonAsync<Profile>($"{Apiurl}/{profileId.ToString()}"); return await GetJsonAsync<Profile>($"{Apiurl}/{profileId}");
} }
public async Task<Profile> AddProfileAsync(Profile profile) public async Task<Profile> AddProfileAsync(Profile profile)
@ -44,11 +37,11 @@ namespace Oqtane.Services
public async Task<Profile> UpdateProfileAsync(Profile profile) public async Task<Profile> UpdateProfileAsync(Profile profile)
{ {
return await PutJsonAsync<Profile>($"{Apiurl}/{profile.SiteId.ToString()}", profile); return await PutJsonAsync<Profile>($"{Apiurl}/{profile.SiteId}", profile);
} }
public async Task DeleteProfileAsync(int profileId) public async Task DeleteProfileAsync(int profileId)
{ {
await DeleteAsync($"{Apiurl}/{profileId.ToString()}"); await DeleteAsync($"{Apiurl}/{profileId}");
} }
} }
} }

View File

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared; using Oqtane.Shared;
@ -12,29 +11,24 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public RoleService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public RoleService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Role");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Role"); }
}
public async Task<List<Role>> GetRolesAsync(int siteId) public async Task<List<Role>> GetRolesAsync(int siteId)
{ {
List<Role> roles = await GetJsonAsync<List<Role>>($"{Apiurl}?siteid={siteId.ToString()}"); List<Role> roles = await GetJsonAsync<List<Role>>($"{Apiurl}?siteid={siteId}");
return roles.OrderBy(item => item.Name).ToList(); return roles.OrderBy(item => item.Name).ToList();
} }
public async Task<Role> GetRoleAsync(int roleId) public async Task<Role> GetRoleAsync(int roleId)
{ {
return await GetJsonAsync<Role>($"{Apiurl}/{roleId.ToString()}"); return await GetJsonAsync<Role>($"{Apiurl}/{roleId}");
} }
public async Task<Role> AddRoleAsync(Role role) public async Task<Role> AddRoleAsync(Role role)
@ -44,11 +38,11 @@ namespace Oqtane.Services
public async Task<Role> UpdateRoleAsync(Role role) public async Task<Role> UpdateRoleAsync(Role role)
{ {
return await PutJsonAsync<Role>($"{Apiurl}/{role.RoleId.ToString()}", role); return await PutJsonAsync<Role>($"{Apiurl}/{role.RoleId}", role);
} }
public async Task DeleteRoleAsync(int roleId) public async Task DeleteRoleAsync(int roleId)
{ {
await DeleteAsync($"{Apiurl}/{roleId.ToString()}"); await DeleteAsync($"{Apiurl}/{roleId}");
} }
} }
} }

View File

@ -17,7 +17,6 @@ namespace Oqtane.Services
_http = client; _http = client;
} }
protected async Task GetAsync(string uri) protected async Task GetAsync(string uri)
{ {
var response = await _http.GetAsync(uri); var response = await _http.GetAsync(uri);
@ -135,24 +134,31 @@ namespace Oqtane.Services
//TODO Missing content JSON validation //TODO Missing content JSON validation
} }
public static string CreateApiUrl(Alias alias, string absoluteUri, string serviceName) // create an API Url which is tenant agnostic ( for use with entities in the MasterDB )
public string CreateApiUrl(string serviceName)
{ {
Uri uri = new Uri(absoluteUri); return CreateApiUrl(null, serviceName);
}
// create an API Url which is tenant aware ( for use with entities in the TenantDB )
public string CreateApiUrl(Alias alias, string serviceName)
{
string apiurl = "/";
if (Alias != null)
{
alias = Alias; // override the default alias ( for cross-tenant service calls )
}
string apiurl;
if (alias != null) if (alias != null)
{ {
// build a url which passes the alias that may include a subfolder for multi-tenancy // include the alias for multi-tenant context
apiurl = $"{uri.Scheme}://{alias.Name}/"; apiurl += $"{alias.AliasId}/";
if (alias.Path == string.Empty)
{
apiurl += "~/";
}
} }
else else
{ {
// build a url which ignores any subfolder for multi-tenancy // tenant agnostic
apiurl = $"{uri.Scheme}://{uri.Authority}/~/"; apiurl += "~/";
} }
apiurl += $"api/{serviceName}"; apiurl += $"api/{serviceName}";
@ -160,15 +166,14 @@ namespace Oqtane.Services
return apiurl; return apiurl;
} }
public static string CreateCrossTenantUrl(string url, Alias alias) // can be used to override the default alias
{ public Alias Alias { get; set; }
if (alias != null)
{
url += (url.Contains("?")) ? "&" : "?";
url += "aliasid=" + alias.AliasId.ToString();
}
return url; [Obsolete("This method is obsolete. Use CreateApiUrl(Alias alias, string serviceName) instead.", false)]
public string CreateApiUrl(Alias alias, string absoluteUri, string serviceName)
{
// only retained for short term backward compatibility
return CreateApiUrl(alias, serviceName);
} }
} }
} }

View File

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared; using Oqtane.Shared;
@ -12,20 +11,13 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public SettingService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public SettingService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Setting"); }
} }
private string Apiurl => CreateApiUrl(_siteState.Alias, "Setting");
public async Task<Dictionary<string, string>> GetTenantSettingsAsync() public async Task<Dictionary<string, string>> GetTenantSettingsAsync()
{ {
return await GetSettingsAsync(EntityNames.Tenant, -1); return await GetSettingsAsync(EntityNames.Tenant, -1);
@ -99,7 +91,7 @@ namespace Oqtane.Services
public async Task<Dictionary<string, string>> GetSettingsAsync(string entityName, int entityId) public async Task<Dictionary<string, string>> GetSettingsAsync(string entityName, int entityId)
{ {
var dictionary = new Dictionary<string, string>(); var dictionary = new Dictionary<string, string>();
var settings = await GetJsonAsync<List<Setting>>($"{Apiurl}?entityname={entityName}&entityid={entityId.ToString()}"); var settings = await GetJsonAsync<List<Setting>>($"{Apiurl}?entityname={entityName}&entityid={entityId}");
foreach(Setting setting in settings.OrderBy(item => item.SettingName).ToList()) foreach(Setting setting in settings.OrderBy(item => item.SettingName).ToList())
{ {
@ -110,7 +102,7 @@ namespace Oqtane.Services
public async Task UpdateSettingsAsync(Dictionary<string, string> settings, string entityName, int entityId) public async Task UpdateSettingsAsync(Dictionary<string, string> settings, string entityName, int entityId)
{ {
var settingsList = await GetJsonAsync<List<Setting>>($"{Apiurl}?entityname={entityName}&entityid={entityId.ToString()}"); var settingsList = await GetJsonAsync<List<Setting>>($"{Apiurl}?entityname={entityName}&entityid={entityId}");
foreach (KeyValuePair<string, string> kvp in settings) foreach (KeyValuePair<string, string> kvp in settings)
{ {
@ -138,7 +130,7 @@ namespace Oqtane.Services
public async Task<Setting> GetSettingAsync(int settingId) public async Task<Setting> GetSettingAsync(int settingId)
{ {
return await GetJsonAsync<Setting>($"{Apiurl}/{settingId.ToString()}"); return await GetJsonAsync<Setting>($"{Apiurl}/{settingId}");
} }
public async Task<Setting> AddSettingAsync(Setting setting) public async Task<Setting> AddSettingAsync(Setting setting)
@ -148,12 +140,12 @@ namespace Oqtane.Services
public async Task<Setting> UpdateSettingAsync(Setting setting) public async Task<Setting> UpdateSettingAsync(Setting setting)
{ {
return await PutJsonAsync<Setting>($"{Apiurl}/{setting.SettingId.ToString()}", setting); return await PutJsonAsync<Setting>($"{Apiurl}/{setting.SettingId}", setting);
} }
public async Task DeleteSettingAsync(int settingId) public async Task DeleteSettingAsync(int settingId)
{ {
await DeleteAsync($"{Apiurl}/{settingId.ToString()}"); await DeleteAsync($"{Apiurl}/{settingId}");
} }

View File

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Net.Http; using System.Net.Http;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic; using System.Collections.Generic;
using Oqtane.Shared; using Oqtane.Shared;
@ -12,44 +11,44 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public SiteService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public SiteService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "Site");
public void SetAlias(Alias alias)
{ {
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Site"); } base.Alias = alias;
} }
public async Task<List<Site>> GetSitesAsync(Alias alias) public async Task<List<Site>> GetSitesAsync()
{ {
List<Site> sites = await GetJsonAsync<List<Site>>(CreateCrossTenantUrl(Apiurl, alias)); List<Site> sites = await GetJsonAsync<List<Site>>(Apiurl);
return sites.OrderBy(item => item.Name).ToList(); return sites.OrderBy(item => item.Name).ToList();
} }
public async Task<Site> GetSiteAsync(int siteId, Alias alias) public async Task<Site> GetSiteAsync(int siteId)
{ {
return await GetJsonAsync<Site>(CreateCrossTenantUrl($"{Apiurl}/{siteId.ToString()}", alias)); return await GetJsonAsync<Site>($"{Apiurl}/{siteId}");
} }
public async Task<Site> AddSiteAsync(Site site, Alias alias) public async Task<Site> AddSiteAsync(Site site)
{ {
return await PostJsonAsync<Site>(CreateCrossTenantUrl(Apiurl, alias), site); return await PostJsonAsync<Site>(Apiurl, site);
} }
public async Task<Site> UpdateSiteAsync(Site site, Alias alias) public async Task<Site> UpdateSiteAsync(Site site)
{ {
return await PutJsonAsync<Site>(CreateCrossTenantUrl($"{Apiurl}/{site.SiteId.ToString()}", alias), site); return await PutJsonAsync<Site>($"{Apiurl}/{site.SiteId}", site);
} }
public async Task DeleteSiteAsync(int siteId, Alias alias) public async Task DeleteSiteAsync(int siteId)
{ {
await DeleteAsync(CreateCrossTenantUrl($"{Apiurl}/{siteId.ToString()}", alias)); await DeleteAsync($"{Apiurl}/{siteId}");
} }
} }
} }

View File

@ -3,28 +3,14 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class SiteTemplateService : ServiceBase, ISiteTemplateService public class SiteTemplateService : ServiceBase, ISiteTemplateService
{ {
public SiteTemplateService(HttpClient http) : base(http) { }
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public SiteTemplateService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) private string Apiurl => CreateApiUrl("SiteTemplate");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "SiteTemplate"); }
}
public async Task<List<SiteTemplate>> GetSiteTemplatesAsync() public async Task<List<SiteTemplate>> GetSiteTemplatesAsync()
{ {

View File

@ -1,30 +1,14 @@
using Oqtane.Models; using Oqtane.Models;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared;
using System.Collections.Generic;
using System.Linq;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class SqlService : ServiceBase, ISqlService public class SqlService : ServiceBase, ISqlService
{ {
public SqlService(HttpClient http) : base(http) { }
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public SqlService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) private string Apiurl => CreateApiUrl("Sql");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Sql"); }
}
public async Task<SqlQuery> ExecuteQueryAsync(SqlQuery sqlquery) public async Task<SqlQuery> ExecuteQueryAsync(SqlQuery sqlquery)
{ {

View File

@ -1,28 +1,14 @@
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared;
using System.Collections.Generic; using System.Collections.Generic;
namespace Oqtane.Services namespace Oqtane.Services
{ {
public class SystemService : ServiceBase, ISystemService public class SystemService : ServiceBase, ISystemService
{ {
public SystemService(HttpClient http) : base(http) { }
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public SystemService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) private string Apiurl => CreateApiUrl("System");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "System"); }
}
public async Task<Dictionary<string, string>> GetSystemInfoAsync() public async Task<Dictionary<string, string>> GetSystemInfoAsync()
{ {

View File

@ -1,8 +1,6 @@
using Oqtane.Models; using Oqtane.Models;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -10,21 +8,9 @@ namespace Oqtane.Services
{ {
public class TenantService : ServiceBase, ITenantService public class TenantService : ServiceBase, ITenantService
{ {
public TenantService(HttpClient http) : base(http) { }
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public TenantService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) private string Apiurl => CreateApiUrl("Tenant");
{
_siteState = siteState;
_navigationManager = navigationManager;
}
private string Apiurl
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Tenant"); }
}
public async Task<List<Tenant>> GetTenantsAsync() public async Task<List<Tenant>> GetTenantsAsync()
{ {
@ -34,7 +20,7 @@ namespace Oqtane.Services
public async Task<Tenant> GetTenantAsync(int tenantId) public async Task<Tenant> GetTenantAsync(int tenantId)
{ {
return await GetJsonAsync<Tenant>($"{Apiurl}/{tenantId.ToString()}"); return await GetJsonAsync<Tenant>($"{Apiurl}/{tenantId}");
} }
public async Task<Tenant> AddTenantAsync(Tenant tenant) public async Task<Tenant> AddTenantAsync(Tenant tenant)
@ -44,12 +30,12 @@ namespace Oqtane.Services
public async Task<Tenant> UpdateTenantAsync(Tenant tenant) public async Task<Tenant> UpdateTenantAsync(Tenant tenant)
{ {
return await PutJsonAsync<Tenant>($"{Apiurl}/{tenant.TenantId.ToString()}", tenant); return await PutJsonAsync<Tenant>($"{Apiurl}/{tenant.TenantId}", tenant);
} }
public async Task DeleteTenantAsync(int tenantId) public async Task DeleteTenantAsync(int tenantId)
{ {
await DeleteAsync($"{Apiurl}/{tenantId.ToString()}"); await DeleteAsync($"{Apiurl}/{tenantId}");
} }
} }
} }

View File

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using System.Reflection; using System.Reflection;
using System; using System;
using Oqtane.Shared; using Oqtane.Shared;
@ -13,20 +12,13 @@ namespace Oqtane.Services
public class ThemeService : ServiceBase, IThemeService public class ThemeService : ServiceBase, IThemeService
{ {
private readonly HttpClient _http; private readonly HttpClient _http;
private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public ThemeService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public ThemeService(HttpClient http) : base(http)
{ {
_http = http; _http = http;
_siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl("Theme");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Theme"); }
}
public async Task<List<Theme>> GetThemesAsync() public async Task<List<Theme>> GetThemesAsync()
{ {

View File

@ -2,7 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Oqtane.Shared; using Oqtane.Shared;
namespace Oqtane.Services namespace Oqtane.Services
@ -11,28 +10,22 @@ namespace Oqtane.Services
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public UserRoleService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public UserRoleService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "UserRole");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "UserRole"); }
}
public async Task<List<UserRole>> GetUserRolesAsync(int siteId) public async Task<List<UserRole>> GetUserRolesAsync(int siteId)
{ {
return await GetJsonAsync<List<UserRole>>($"{Apiurl}?siteid={siteId.ToString()}"); return await GetJsonAsync<List<UserRole>>($"{Apiurl}?siteid={siteId}");
} }
public async Task<UserRole> GetUserRoleAsync(int userRoleId) public async Task<UserRole> GetUserRoleAsync(int userRoleId)
{ {
return await GetJsonAsync<UserRole>($"{Apiurl}/{userRoleId.ToString()}"); return await GetJsonAsync<UserRole>($"{Apiurl}/{userRoleId}");
} }
public async Task<UserRole> AddUserRoleAsync(UserRole userRole) public async Task<UserRole> AddUserRoleAsync(UserRole userRole)
@ -42,12 +35,12 @@ namespace Oqtane.Services
public async Task<UserRole> UpdateUserRoleAsync(UserRole userRole) public async Task<UserRole> UpdateUserRoleAsync(UserRole userRole)
{ {
return await PutJsonAsync<UserRole>($"{Apiurl}/{userRole.UserRoleId.ToString()}", userRole); return await PutJsonAsync<UserRole>($"{Apiurl}/{userRole.UserRoleId}", userRole);
} }
public async Task DeleteUserRoleAsync(int userRoleId) public async Task DeleteUserRoleAsync(int userRoleId)
{ {
await DeleteAsync($"{Apiurl}/{userRoleId.ToString()}"); await DeleteAsync($"{Apiurl}/{userRoleId}");
} }
} }
} }

View File

@ -1,7 +1,6 @@
using Oqtane.Shared; using Oqtane.Shared;
using Oqtane.Models; using Oqtane.Models;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Components;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Oqtane.Services namespace Oqtane.Services
@ -9,18 +8,13 @@ namespace Oqtane.Services
public class UserService : ServiceBase, IUserService public class UserService : ServiceBase, IUserService
{ {
private readonly SiteState _siteState; private readonly SiteState _siteState;
private readonly NavigationManager _navigationManager;
public UserService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) public UserService(HttpClient http, SiteState siteState) : base(http)
{ {
_siteState = siteState; _siteState = siteState;
_navigationManager = navigationManager;
} }
private string Apiurl private string Apiurl => CreateApiUrl(_siteState.Alias, "User");
{
get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "User"); }
}
public async Task<User> GetUserAsync(int userId, int siteId) public async Task<User> GetUserAsync(int userId, int siteId)
{ {
@ -37,11 +31,6 @@ namespace Oqtane.Services
return await PostJsonAsync<User>(Apiurl, user); return await PostJsonAsync<User>(Apiurl, user);
} }
public async Task<User> AddUserAsync(User user, Alias alias)
{
return await PostJsonAsync<User>(CreateCrossTenantUrl(Apiurl, alias), user);
}
public async Task<User> UpdateUserAsync(User user) public async Task<User> UpdateUserAsync(User user)
{ {
return await PutJsonAsync<User>($"{Apiurl}/{user.UserId}", user); return await PutJsonAsync<User>($"{Apiurl}/{user.UserId}", user);

View File

@ -35,7 +35,7 @@ namespace Oqtane.Themes.Controls
var interop = new Interop(jsRuntime); var interop = new Interop(jsRuntime);
string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken"); string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken");
var fields = new { __RequestVerificationToken = antiforgerytoken, returnurl = (PageState.Alias.Path + "/" + PageState.Page.Path) }; var fields = new { __RequestVerificationToken = antiforgerytoken, returnurl = (PageState.Alias.Path + "/" + PageState.Page.Path) };
await interop.SubmitForm("/pages/logout/", fields); await interop.SubmitForm($"/{PageState.Alias.AliasId}/pages/logout/", fields);
} }
else else
{ {

View File

@ -41,7 +41,7 @@ namespace Oqtane.Themes
public string ContentUrl(int fileid) public string ContentUrl(int fileid)
{ {
return Utilities.ContentUrl(PageState.Alias.Path, fileid); return Utilities.ContentUrl(PageState.Alias, fileid);
} }
} }
} }

View File

@ -84,20 +84,13 @@
var lastsyncdate = DateTime.UtcNow; var lastsyncdate = DateTime.UtcNow;
var runtime = GetRuntime(); var runtime = GetRuntime();
// get Url path and querystring ( and remove anchors ) Uri uri = new Uri(_absoluteUri);
var path = new Uri(_absoluteUri).PathAndQuery.Substring(1);
if (path.IndexOf("#") != -1)
{
path = path.Substring(0, path.IndexOf("#"));
}
// parse querystring and remove // get path
var querystring = new Dictionary<string, string>(); var path = uri.LocalPath.Substring(1);
if (path.IndexOf("?") != -1)
{ // parse querystring
querystring = ParseQueryString(path); var querystring = ParseQueryString(uri.Query);
path = path.Substring(0, path.IndexOf("?"));
}
// the reload parameter is used during user login/logout // the reload parameter is used during user login/logout
if (querystring.ContainsKey("reload")) if (querystring.ContainsKey("reload"))
@ -111,7 +104,7 @@
lastsyncdate = PageState.LastSyncDate; lastsyncdate = PageState.LastSyncDate;
} }
alias = await AliasService.GetAliasAsync(_absoluteUri, lastsyncdate); alias = await AliasService.GetAliasAsync(path, lastsyncdate);
SiteState.Alias = alias; // set state for services SiteState.Alias = alias; // set state for services
lastsyncdate = alias.SyncDate; lastsyncdate = alias.SyncDate;
@ -130,14 +123,14 @@
if (reload == Reload.Site || PageState == null || alias.SiteId != PageState.Alias.SiteId) if (reload == Reload.Site || PageState == null || alias.SiteId != PageState.Alias.SiteId)
{ {
site = await SiteService.GetSiteAsync(alias.SiteId, alias); site = await SiteService.GetSiteAsync(alias.SiteId);
reload = Reload.Site; reload = Reload.Site;
} }
else else
{ {
site = PageState.Site; site = PageState.Site;
} }
if (site != null) if (site != null)
{ {
if (PageState == null || reload == Reload.Site) if (PageState == null || reload == Reload.Site)
@ -175,9 +168,9 @@
// format path and remove alias // format path and remove alias
path = path.Replace("//", "/"); path = path.Replace("//", "/");
if (!path.EndsWith("/")) if (!path.EndsWith("/"))
{ {
path += "/"; path += "/";
} }
@ -205,7 +198,7 @@
path = path.Replace(moduleid.ToString() + "/", ""); path = path.Replace(moduleid.ToString() + "/", "");
} }
} }
// remove trailing slash so it can be used as a key for Pages // remove trailing slash so it can be used as a key for Pages
if (path.EndsWith("/")) path = path.Substring(0, path.Length - 1); if (path.EndsWith("/")) path = path.Substring(0, path.Length - 1);
@ -217,7 +210,7 @@
{ {
page = PageState.Page; page = PageState.Page;
} }
// failsafe in case router cannot locate the home page for the site // failsafe in case router cannot locate the home page for the site
if (page == null && path == "") if (page == null && path == "")
{ {
@ -321,16 +314,17 @@
_navigationInterceptionEnabled = true; _navigationInterceptionEnabled = true;
return NavigationInterception.EnableNavigationInterceptionAsync(); return NavigationInterception.EnableNavigationInterceptionAsync();
} }
return Task.CompletedTask; return Task.CompletedTask;
} }
private Dictionary<string, string> ParseQueryString(string path) private Dictionary<string, string> ParseQueryString(string query)
{ {
Dictionary<string, string> querystring = new Dictionary<string, string>(); Dictionary<string, string> querystring = new Dictionary<string, string>();
if (path.IndexOf("?") != -1) if (!string.IsNullOrEmpty(query))
{ {
foreach (string kvp in path.Substring(path.IndexOf("?") + 1).Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries)) query = query.Substring(1); // ignore "?"
foreach (string kvp in query.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
{ {
if (kvp != "") if (kvp != "")
{ {
@ -341,12 +335,11 @@
} }
else else
{ {
querystring.Add(kvp, "true"); // default querystring when no value is provided querystring.Add(kvp, "true"); // default parameter when no value is provided
} }
} }
} }
} }
return querystring; return querystring;
} }
@ -366,7 +359,7 @@
page.LayoutType = site.DefaultLayoutType; page.LayoutType = site.DefaultLayoutType;
} }
Type type; Type type;
if (!string.IsNullOrEmpty(page.LayoutType)) if (!string.IsNullOrEmpty(page.LayoutType))
{ {
type = Type.GetType(page.LayoutType); type = Type.GetType(page.LayoutType);
@ -375,7 +368,7 @@
{ {
type = Type.GetType(page.ThemeType); type = Type.GetType(page.ThemeType);
} }
var property = type.GetProperty("Panes"); var property = type.GetProperty("Panes");
page.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); page.Panes = (string)property.GetValue(Activator.CreateInstance(type), null);
} }
@ -383,7 +376,7 @@
{ {
// error loading theme or layout // error loading theme or layout
} }
return page; return page;
} }
@ -403,7 +396,7 @@
{ {
typename = Constants.ErrorModule; typename = Constants.ErrorModule;
} }
if (module.ModuleId == moduleid && control != "") if (module.ModuleId == moduleid && control != "")
{ {
// check if the module defines custom routes // check if the module defines custom routes
@ -459,7 +452,7 @@
{ {
paneindex.Add(module.Pane, 0); paneindex.Add(module.Pane, 0);
} }
module.PaneModuleIndex = paneindex[module.Pane]; module.PaneModuleIndex = paneindex[module.Pane];
if (string.IsNullOrEmpty(module.ContainerType)) if (string.IsNullOrEmpty(module.ContainerType))
@ -473,12 +466,12 @@
{ {
module.PaneModuleCount = paneindex[module.Pane] + 1; module.PaneModuleCount = paneindex[module.Pane] + 1;
} }
return modules; return modules;
} }
private Runtime GetRuntime() private Runtime GetRuntime()
=> RuntimeInformation.IsOSPlatform(OSPlatform.Create("WEBASSEMBLY")) => RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER"))
? Runtime.WebAssembly ? Runtime.WebAssembly
: Runtime.Server; : Runtime.Server;
} }

View File

@ -22,7 +22,7 @@
} }
if (PageState.Site.FaviconFileId != null) if (PageState.Site.FaviconFileId != null)
{ {
await interop.IncludeLink("fav-icon", "shortcut icon", Utilities.ContentUrl(PageState.Alias.Path, PageState.Site.FaviconFileId.Value), "image/x-icon", "", ""); await interop.IncludeLink("fav-icon", "shortcut icon", Utilities.ContentUrl(PageState.Alias, PageState.Site.FaviconFileId.Value), "image/x-icon", "", "");
} }
if (PageState.Site.PwaIsEnabled) if (PageState.Site.PwaIsEnabled)
{ {
@ -59,11 +59,11 @@
"\"background_color\": \"#fff\", " + "\"background_color\": \"#fff\", " +
"\"description\": \"" + PageState.Site.Name + "\", " + "\"description\": \"" + PageState.Site.Name + "\", " +
"\"icons\": [{ " + "\"icons\": [{ " +
"\"src\": \"" + Utilities.ContentUrl(PageState.Alias.Path, PageState.Site.PwaAppIconFileId.Value) + "\", " + "\"src\": \"" + Utilities.ContentUrl(PageState.Alias, PageState.Site.PwaAppIconFileId.Value) + "\", " +
"\"sizes\": \"192x192\", " + "\"sizes\": \"192x192\", " +
"\"type\": \"image/png\" " + "\"type\": \"image/png\" " +
"}, { " + "}, { " +
"\"src\": \"" + Utilities.ContentUrl(PageState.Alias.Path, PageState.Site.PwaSplashIconFileId.Value) + "\", " + "\"src\": \"" + Utilities.ContentUrl(PageState.Alias, PageState.Site.PwaSplashIconFileId.Value) + "\", " +
"\"sizes\": \"512x512\", " + "\"sizes\": \"512x512\", " +
"\"type\": \"image/png\" " + "\"type\": \"image/png\" " +
"}] " + "}] " +

View File

@ -10,19 +10,22 @@ using System.Globalization;
using Oqtane.Enums; using Oqtane.Enums;
using Oqtane.Infrastructure; using Oqtane.Infrastructure;
using Oqtane.Repository; using Oqtane.Repository;
using Microsoft.AspNetCore.Http;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class AliasController : Controller public class AliasController : Controller
{ {
private readonly IAliasRepository _aliases; private readonly IAliasRepository _aliases;
private readonly IHttpContextAccessor _accessor;
private readonly ISyncManager _syncManager; private readonly ISyncManager _syncManager;
private readonly ILogManager _logger; private readonly ILogManager _logger;
public AliasController(IAliasRepository aliases, ISyncManager syncManager, ILogManager logger) public AliasController(IAliasRepository aliases, IHttpContextAccessor accessor, ISyncManager syncManager, ILogManager logger)
{ {
_aliases = aliases; _aliases = aliases;
_accessor = accessor;
_syncManager = syncManager; _syncManager = syncManager;
_logger = logger; _logger = logger;
} }
@ -43,20 +46,30 @@ namespace Oqtane.Controllers
return _aliases.GetAlias(id); return _aliases.GetAlias(id);
} }
// GET api/<controller>/name/localhost:12345?lastsyncdate=yyyyMMddHHmmssfff // GET api/<controller>/name/xxx?sync=yyyyMMddHHmmssfff
[HttpGet("name/{name}")] [HttpGet("name/{name}")]
public Alias Get(string name, string lastsyncdate) public Alias Get(string name, string sync)
{ {
name = WebUtility.UrlDecode(name); List<Alias> aliases = _aliases.GetAliases().ToList(); // cached
List<Alias> aliases = _aliases.GetAliases().ToList();
Alias alias = null; Alias alias = null;
alias = aliases.FirstOrDefault(item => item.Name == name); if (_accessor.HttpContext != null)
if (name != null && (alias == null && name.Contains("/")))
{ {
// lookup alias without folder name name = (name == "~") ? "" : name;
alias = aliases.Find(item => item.Name == name.Substring(0, name.IndexOf("/", StringComparison.Ordinal))); name = _accessor.HttpContext.Request.Host.Value + "/" + WebUtility.UrlDecode(name);
var segments = name.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
// iterate segments in reverse order
for (int i = segments.Length; i > 0; i--)
{
name = string.Join("/", segments, 0, i);
alias = aliases.Find(item => item.Name == name);
if (alias != null)
{
break; // found a matching alias
}
}
} }
if (alias == null && aliases.Count > 0) if (alias == null && aliases.Any())
{ {
// use first alias if name does not exist // use first alias if name does not exist
alias = aliases.FirstOrDefault(); alias = aliases.FirstOrDefault();
@ -66,7 +79,7 @@ namespace Oqtane.Controllers
if (alias != null) if (alias != null)
{ {
alias.SyncDate = DateTime.UtcNow; alias.SyncDate = DateTime.UtcNow;
alias.SyncEvents = _syncManager.GetSyncEvents(DateTime.ParseExact(lastsyncdate, "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture)); alias.SyncEvents = _syncManager.GetSyncEvents(alias.TenantId, DateTime.ParseExact(sync, "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture));
} }
return alias; return alias;
} }

View File

@ -21,7 +21,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class FileController : Controller public class FileController : Controller
{ {
private readonly IWebHostEnvironment _environment; private readonly IWebHostEnvironment _environment;

View File

@ -14,7 +14,7 @@ using System.IO;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class FolderController : Controller public class FolderController : Controller
{ {
private readonly IFolderRepository _folders; private readonly IFolderRepository _folders;

View File

@ -7,7 +7,7 @@ using Oqtane.Infrastructure;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class InstallationController : Controller public class InstallationController : Controller
{ {
private readonly IConfigurationRoot _config; private readonly IConfigurationRoot _config;

View File

@ -12,7 +12,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class JobController : Controller public class JobController : Controller
{ {
private readonly IJobRepository _jobs; private readonly IJobRepository _jobs;

View File

@ -9,7 +9,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class JobLogController : Controller public class JobLogController : Controller
{ {
private readonly IJobLogRepository _jobLogs; private readonly IJobLogRepository _jobLogs;

View File

@ -9,7 +9,7 @@ using Oqtane.Shared;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class LogController : Controller public class LogController : Controller
{ {
private readonly ILogManager _logger; private readonly ILogManager _logger;

View File

@ -11,7 +11,7 @@ using Oqtane.Security;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class ModuleController : Controller public class ModuleController : Controller
{ {
private readonly IModuleRepository _modules; private readonly IModuleRepository _modules;

View File

@ -17,7 +17,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class ModuleDefinitionController : Controller public class ModuleDefinitionController : Controller
{ {
private readonly IModuleDefinitionRepository _moduleDefinitions; private readonly IModuleDefinitionRepository _moduleDefinitions;

View File

@ -10,7 +10,7 @@ using Oqtane.Security;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class NotificationController : Controller public class NotificationController : Controller
{ {
private readonly INotificationRepository _notifications; private readonly INotificationRepository _notifications;

View File

@ -15,7 +15,7 @@ using Oqtane.Shared;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class PackageController : Controller public class PackageController : Controller
{ {
private readonly IWebHostEnvironment _environment; private readonly IWebHostEnvironment _environment;

View File

@ -13,22 +13,24 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class PageController : Controller public class PageController : Controller
{ {
private readonly IPageRepository _pages; private readonly IPageRepository _pages;
private readonly IModuleRepository _modules; private readonly IModuleRepository _modules;
private readonly IPageModuleRepository _pageModules; private readonly IPageModuleRepository _pageModules;
private readonly IUserPermissions _userPermissions; private readonly IUserPermissions _userPermissions;
private readonly ITenantResolver _tenants;
private readonly ISyncManager _syncManager; private readonly ISyncManager _syncManager;
private readonly ILogManager _logger; private readonly ILogManager _logger;
public PageController(IPageRepository pages, IModuleRepository modules, IPageModuleRepository pageModules, IUserPermissions userPermissions, ISyncManager syncManager, ILogManager logger) public PageController(IPageRepository pages, IModuleRepository modules, IPageModuleRepository pageModules, IUserPermissions userPermissions, ITenantResolver tenants, ISyncManager syncManager, ILogManager logger)
{ {
_pages = pages; _pages = pages;
_modules = modules; _modules = modules;
_pageModules = pageModules; _pageModules = pageModules;
_userPermissions = userPermissions; _userPermissions = userPermissions;
_tenants = tenants;
_syncManager = syncManager; _syncManager = syncManager;
_logger = logger; _logger = logger;
} }
@ -120,7 +122,7 @@ namespace Oqtane.Controllers
if (_userPermissions.IsAuthorized(User,PermissionNames.Edit, permissions)) if (_userPermissions.IsAuthorized(User,PermissionNames.Edit, permissions))
{ {
page = _pages.AddPage(page); page = _pages.AddPage(page);
_syncManager.AddSyncEvent(EntityNames.Site, page.SiteId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, page.SiteId);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "Page Added {Page}", page); _logger.Log(LogLevel.Information, this, LogFunction.Create, "Page Added {Page}", page);
} }
else else
@ -162,7 +164,7 @@ namespace Oqtane.Controllers
page.IsPersonalizable = false; page.IsPersonalizable = false;
page.UserId = int.Parse(userid); page.UserId = int.Parse(userid);
page = _pages.AddPage(page); page = _pages.AddPage(page);
_syncManager.AddSyncEvent(EntityNames.Site, page.SiteId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, page.SiteId);
// copy modules // copy modules
List<PageModule> pagemodules = _pageModules.GetPageModules(page.SiteId).ToList(); List<PageModule> pagemodules = _pageModules.GetPageModules(page.SiteId).ToList();
@ -206,7 +208,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Page, page.PageId, PermissionNames.Edit)) if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Page, page.PageId, PermissionNames.Edit))
{ {
page = _pages.UpdatePage(page); page = _pages.UpdatePage(page);
_syncManager.AddSyncEvent(EntityNames.Site, page.SiteId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, page.SiteId);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Updated {Page}", page); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Updated {Page}", page);
} }
else else
@ -236,7 +238,7 @@ namespace Oqtane.Controllers
} }
order += 2; order += 2;
} }
_syncManager.AddSyncEvent(EntityNames.Site, siteid); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, siteid);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Order Updated {SiteId} {PageId} {ParentId}", siteid, pageid, parentid); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Order Updated {SiteId} {PageId} {ParentId}", siteid, pageid, parentid);
} }
else else
@ -255,7 +257,7 @@ namespace Oqtane.Controllers
if (_userPermissions.IsAuthorized(User, EntityNames.Page, page.PageId, PermissionNames.Edit)) if (_userPermissions.IsAuthorized(User, EntityNames.Page, page.PageId, PermissionNames.Edit))
{ {
_pages.DeletePage(page.PageId); _pages.DeletePage(page.PageId);
_syncManager.AddSyncEvent(EntityNames.Site, page.SiteId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, page.SiteId);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "Page Deleted {PageId}", page.PageId); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "Page Deleted {PageId}", page.PageId);
} }
else else

View File

@ -11,18 +11,20 @@ using Oqtane.Security;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class PageModuleController : Controller public class PageModuleController : Controller
{ {
private readonly IPageModuleRepository _pageModules; private readonly IPageModuleRepository _pageModules;
private readonly IUserPermissions _userPermissions; private readonly IUserPermissions _userPermissions;
private readonly ITenantResolver _tenants;
private readonly ISyncManager _syncManager; private readonly ISyncManager _syncManager;
private readonly ILogManager _logger; private readonly ILogManager _logger;
public PageModuleController(IPageModuleRepository pageModules, IUserPermissions userPermissions, ISyncManager syncManager, ILogManager logger) public PageModuleController(IPageModuleRepository pageModules, IUserPermissions userPermissions, ITenantResolver tenants, ISyncManager syncManager, ILogManager logger)
{ {
_pageModules = pageModules; _pageModules = pageModules;
_userPermissions = userPermissions; _userPermissions = userPermissions;
_tenants = tenants;
_syncManager = syncManager; _syncManager = syncManager;
_logger = logger; _logger = logger;
} }
@ -69,7 +71,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Page, pageModule.PageId, PermissionNames.Edit)) if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Page, pageModule.PageId, PermissionNames.Edit))
{ {
pageModule = _pageModules.AddPageModule(pageModule); pageModule = _pageModules.AddPageModule(pageModule);
_syncManager.AddSyncEvent(EntityNames.Page, pageModule.PageId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Page, pageModule.PageId);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "Page Module Added {PageModule}", pageModule); _logger.Log(LogLevel.Information, this, LogFunction.Create, "Page Module Added {PageModule}", pageModule);
} }
else else
@ -89,7 +91,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Module, pageModule.ModuleId, PermissionNames.Edit)) if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Module, pageModule.ModuleId, PermissionNames.Edit))
{ {
pageModule = _pageModules.UpdatePageModule(pageModule); pageModule = _pageModules.UpdatePageModule(pageModule);
_syncManager.AddSyncEvent(EntityNames.Page, pageModule.PageId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Page, pageModule.PageId);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Module Updated {PageModule}", pageModule); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Module Updated {PageModule}", pageModule);
} }
else else
@ -119,7 +121,7 @@ namespace Oqtane.Controllers
} }
order += 2; order += 2;
} }
_syncManager.AddSyncEvent(EntityNames.Page, pageid); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Page, pageid);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Module Order Updated {PageId} {Pane}", pageid, pane); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Module Order Updated {PageId} {Pane}", pageid, pane);
} }
else else
@ -138,7 +140,7 @@ namespace Oqtane.Controllers
if (_userPermissions.IsAuthorized(User, EntityNames.Page, pagemodule.PageId, PermissionNames.Edit)) if (_userPermissions.IsAuthorized(User, EntityNames.Page, pagemodule.PageId, PermissionNames.Edit))
{ {
_pageModules.DeletePageModule(id); _pageModules.DeletePageModule(id);
_syncManager.AddSyncEvent(EntityNames.Page, pagemodule.PageId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Page, pagemodule.PageId);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "Page Module Deleted {PageModuleId}", id); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "Page Module Deleted {PageModuleId}", id);
} }
else else

View File

@ -9,7 +9,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class ProfileController : Controller public class ProfileController : Controller
{ {
private readonly IProfileRepository _profiles; private readonly IProfileRepository _profiles;

View File

@ -9,7 +9,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class RoleController : Controller public class RoleController : Controller
{ {
private readonly IRoleRepository _roles; private readonly IRoleRepository _roles;

View File

@ -10,7 +10,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class SettingController : Controller public class SettingController : Controller
{ {
private readonly ISettingRepository _settings; private readonly ISettingRepository _settings;

View File

@ -10,7 +10,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class SiteController : Controller public class SiteController : Controller
{ {
private readonly ISiteRepository _sites; private readonly ISiteRepository _sites;
@ -76,7 +76,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
site = _sites.UpdateSite(site); site = _sites.UpdateSite(site);
_syncManager.AddSyncEvent(EntityNames.Site, site.SiteId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, site.SiteId);
_logger.Log(site.SiteId, LogLevel.Information, this, LogFunction.Update, "Site Updated {Site}", site); _logger.Log(site.SiteId, LogLevel.Information, this, LogFunction.Update, "Site Updated {Site}", site);
} }
return site; return site;

View File

@ -5,7 +5,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class SiteTemplateController : Controller public class SiteTemplateController : Controller
{ {
private readonly ISiteTemplateRepository _siteTemplates; private readonly ISiteTemplateRepository _siteTemplates;

View File

@ -14,7 +14,7 @@ using System;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class SqlController : Controller public class SqlController : Controller
{ {
private readonly ITenantRepository _tenants; private readonly ITenantRepository _tenants;

View File

@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Hosting;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class SystemController : Controller public class SystemController : Controller
{ {
private readonly IWebHostEnvironment _environment; private readonly IWebHostEnvironment _environment;

View File

@ -9,7 +9,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class TenantController : Controller public class TenantController : Controller
{ {
private readonly ITenantRepository _tenants; private readonly ITenantRepository _tenants;

View File

@ -15,7 +15,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class ThemeController : Controller public class ThemeController : Controller
{ {
private readonly IThemeRepository _themes; private readonly IThemeRepository _themes;

View File

@ -16,7 +16,7 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class UserController : Controller public class UserController : Controller
{ {
private readonly IUserRepository _users; private readonly IUserRepository _users;
@ -224,7 +224,7 @@ namespace Oqtane.Controllers
} }
} }
user = _users.UpdateUser(user); user = _users.UpdateUser(user);
_syncManager.AddSyncEvent(EntityNames.User, user.UserId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.User, user.UserId);
user.Password = ""; // remove sensitive information user.Password = ""; // remove sensitive information
_logger.Log(LogLevel.Information, this, LogFunction.Update, "User Updated {User}", user); _logger.Log(LogLevel.Information, this, LogFunction.Update, "User Updated {User}", user);
} }
@ -406,16 +406,19 @@ namespace Oqtane.Controllers
[HttpGet("authenticate")] [HttpGet("authenticate")]
public User Authenticate() public User Authenticate()
{ {
User user = new User(); User user = new User { IsAuthenticated = User.Identity.IsAuthenticated, Username = "", UserId = -1, Roles = "" };
user.Username = User.Identity.Name; if (user.IsAuthenticated)
user.IsAuthenticated = User.Identity.IsAuthenticated;
string roles = "";
foreach (var claim in User.Claims.Where(item => item.Type == ClaimTypes.Role))
{ {
roles += claim.Value + ";"; user.Username = User.Identity.Name;
user.UserId = int.Parse(User.Claims.First(item => item.Type == ClaimTypes.PrimarySid).Value);
string roles = "";
foreach (var claim in User.Claims.Where(item => item.Type == ClaimTypes.Role))
{
roles += claim.Value + ";";
}
if (roles != "") roles = ";" + roles;
user.Roles = roles;
} }
if (roles != "") roles = ";" + roles;
user.Roles = roles;
return user; return user;
} }

View File

@ -9,17 +9,19 @@ using Oqtane.Repository;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class UserRoleController : Controller public class UserRoleController : Controller
{ {
private readonly IUserRoleRepository _userRoles; private readonly IUserRoleRepository _userRoles;
private readonly ITenantResolver _tenants;
private readonly ISyncManager _syncManager; private readonly ISyncManager _syncManager;
private readonly ILogManager _logger; private readonly ILogManager _logger;
public UserRoleController(IUserRoleRepository userRoles, ISyncManager syncManager, ILogManager logger) public UserRoleController(IUserRoleRepository userRoles, ITenantResolver tenants, ISyncManager syncManager, ILogManager logger)
{ {
_userRoles = userRoles; _userRoles = userRoles;
_syncManager = syncManager; _syncManager = syncManager;
_tenants = tenants;
_logger = logger; _logger = logger;
} }
@ -47,7 +49,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
userRole = _userRoles.AddUserRole(userRole); userRole = _userRoles.AddUserRole(userRole);
_syncManager.AddSyncEvent(EntityNames.User, userRole.UserId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.User, userRole.UserId);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "User Role Added {UserRole}", userRole); _logger.Log(LogLevel.Information, this, LogFunction.Create, "User Role Added {UserRole}", userRole);
} }
return userRole; return userRole;
@ -61,7 +63,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
userRole = _userRoles.UpdateUserRole(userRole); userRole = _userRoles.UpdateUserRole(userRole);
_syncManager.AddSyncEvent(EntityNames.User, userRole.UserId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.User, userRole.UserId);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "User Role Updated {UserRole}", userRole); _logger.Log(LogLevel.Information, this, LogFunction.Update, "User Role Updated {UserRole}", userRole);
} }
return userRole; return userRole;
@ -74,7 +76,7 @@ namespace Oqtane.Controllers
{ {
UserRole userRole = _userRoles.GetUserRole(id); UserRole userRole = _userRoles.GetUserRole(id);
_userRoles.DeleteUserRole(id); _userRoles.DeleteUserRole(id);
_syncManager.AddSyncEvent(EntityNames.User, userRole.UserId); _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.User, userRole.UserId);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Role Deleted {UserRole}", userRole); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Role Deleted {UserRole}", userRole);
} }
} }

View File

@ -6,7 +6,7 @@ namespace Oqtane.Infrastructure
{ {
public interface ISyncManager public interface ISyncManager
{ {
List<SyncEvent> GetSyncEvents(DateTime lastSyncDate); List<SyncEvent> GetSyncEvents(int tenantId, DateTime lastSyncDate);
void AddSyncEvent(string entityName, int entityId); void AddSyncEvent(int tenantId, string entityName, int entityId);
} }
} }

View File

@ -1,43 +1,28 @@
using Microsoft.Extensions.DependencyInjection; using Oqtane.Models;
using Oqtane.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Oqtane.Infrastructure;
using Oqtane.Repository; using Oqtane.Repository;
namespace Oqtane.Infrastructure namespace Oqtane.Infrastructure
{ {
public class SyncManager : ISyncManager public class SyncManager : ISyncManager
{ {
private readonly IServiceScopeFactory _serviceScopeFactory;
private List<SyncEvent> SyncEvents { get; set; } private List<SyncEvent> SyncEvents { get; set; }
public SyncManager(IServiceScopeFactory serviceScopeFactory) public SyncManager()
{ {
this._serviceScopeFactory = serviceScopeFactory;
SyncEvents = new List<SyncEvent>(); SyncEvents = new List<SyncEvent>();
} }
private int TenantId public List<SyncEvent> GetSyncEvents(int tenantId, DateTime lastSyncDate)
{ {
get return SyncEvents.Where(item => item.TenantId == tenantId && item.ModifiedOn >= lastSyncDate).ToList();
{
using (var scope = _serviceScopeFactory.CreateScope())
{
return scope.ServiceProvider.GetRequiredService<ITenantResolver>().GetTenant().TenantId;
}
}
} }
public List<SyncEvent> GetSyncEvents(DateTime lastSyncDate) public void AddSyncEvent(int tenantId, string entityName, int entityId)
{ {
return SyncEvents.Where(item => item.TenantId == TenantId && item.ModifiedOn >= lastSyncDate).ToList(); SyncEvents.Add(new SyncEvent { TenantId = tenantId, EntityName = entityName, EntityId = entityId, ModifiedOn = DateTime.UtcNow });
}
public void AddSyncEvent(string entityName, int entityId)
{
SyncEvents.Add(new SyncEvent { TenantId = TenantId, EntityName = entityName, EntityId = entityId, ModifiedOn = DateTime.UtcNow });
// trim sync events // trim sync events
SyncEvents.RemoveAll(item => item.ModifiedOn < DateTime.UtcNow.AddHours(-1)); SyncEvents.RemoveAll(item => item.ModifiedOn < DateTime.UtcNow.AddHours(-1));
} }

View File

@ -11,7 +11,7 @@ using Oqtane.Infrastructure;
namespace Oqtane.Modules.HtmlText.Controllers namespace Oqtane.Modules.HtmlText.Controllers
{ {
[Route("{site}/api/[controller]")] [Route("{alias}/api/[controller]")]
public class HtmlTextController : Controller public class HtmlTextController : Controller
{ {
private readonly IHtmlTextRepository _htmlText; private readonly IHtmlTextRepository _htmlText;

View File

@ -1,3 +1,3 @@
@page "/pages/login" @page "/{alias}/pages/login"
@namespace Oqtane.Pages @namespace Oqtane.Pages
@model Oqtane.Pages.LoginModel @model Oqtane.Pages.LoginModel

View File

@ -1,3 +1,3 @@
@page "/pages/logout" @page "/{alias}/pages/logout"
@namespace Oqtane.Pages @namespace Oqtane.Pages
@model Oqtane.Pages.LogoutModel @model Oqtane.Pages.LogoutModel

View File

@ -15,7 +15,6 @@ namespace Oqtane.Repository
public TenantResolver(IHttpContextAccessor accessor, IAliasRepository aliasRepository, ITenantRepository tenantRepository, SiteState siteState) public TenantResolver(IHttpContextAccessor accessor, IAliasRepository aliasRepository, ITenantRepository tenantRepository, SiteState siteState)
{ {
int aliasId = -1; int aliasId = -1;
string aliasName = "";
if (siteState != null && siteState.Alias != null) if (siteState != null && siteState.Alias != null)
{ {
@ -23,29 +22,14 @@ namespace Oqtane.Repository
_alias = siteState.Alias; _alias = siteState.Alias;
} }
else else
{ {
// get alias identifier based on request context // get aliasid identifier based on request
if (accessor.HttpContext != null) if (accessor.HttpContext != null)
{ {
// check if an alias is passed as a querystring parameter ( for cross tenant access ) string[] segments = accessor.HttpContext.Request.Path.Value.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
if (accessor.HttpContext.Request.Query.ContainsKey("aliasid")) if (segments.Length > 1 && (segments[1] == "api" || segments[1] == "pages") && segments[0] != "~")
{ {
aliasId = int.Parse(accessor.HttpContext.Request.Query["aliasid"]); aliasId = int.Parse(segments[0]);
}
else // get the alias from the request url
{
aliasName = accessor.HttpContext.Request.Host.Value;
string path = accessor.HttpContext.Request.Path.Value;
string[] segments = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
if (segments.Length > 1 && segments[1] == "api" && segments[0] != "~")
{
aliasName += "/" + segments[0];
}
if (aliasName.EndsWith("/"))
{
aliasName = aliasName.Substring(0, aliasName.Length - 1);
}
} }
} }
@ -55,14 +39,11 @@ namespace Oqtane.Repository
{ {
_alias = aliases.FirstOrDefault(item => item.AliasId == aliasId); _alias = aliases.FirstOrDefault(item => item.AliasId == aliasId);
} }
else
{
_alias = aliases.FirstOrDefault(item => item.Name == aliasName || aliases.Count() == 1);
}
} }
if (_alias != null) if (_alias != null)
{ {
// get the tenant
IEnumerable<Tenant> tenants = tenantRepository.GetTenants(); // cached IEnumerable<Tenant> tenants = tenantRepository.GetTenants(); // cached
_tenant = tenants.FirstOrDefault(item => item.TenantId == _alias.TenantId); _tenant = tenants.FirstOrDefault(item => item.TenantId == _alias.TenantId);
} }

View File

@ -1,4 +1,5 @@
using System; using Oqtane.Models;
using System;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Text; using System.Text;
@ -44,9 +45,9 @@ namespace Oqtane.Shared
return NavigateUrl(alias, path, parameters); return NavigateUrl(alias, path, parameters);
} }
public static string ContentUrl(string alias, int fileid) public static string ContentUrl(Alias alias, int fileid)
{ {
string url = (alias == "") ? "/~" : alias; string url = (alias == null) ? "/~" : "/" + alias.AliasId;
url += Constants.ContentUrl + fileid.ToString(); url += Constants.ContentUrl + fileid.ToString();
return url; return url;
} }