Merge pull request #439 from sbwalker/master
improve performance of alias handling and allow aliases to be an unlimited number of subfolders in depth
This commit is contained in:
		| @ -43,7 +43,7 @@ | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             [Module]Service = new [Module]Service(http, sitestate, NavigationManager); | ||||
|             [Module]Service = new [Module]Service(http, sitestate); | ||||
|             if (PageState.Action == "Edit") | ||||
|             { | ||||
|                 _id = Int32.Parse(PageState.QueryString["id"]); | ||||
|  | ||||
| @ -78,7 +78,7 @@ else | ||||
|     { | ||||
|         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); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|  | ||||
| @ -2,7 +2,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Modules; | ||||
| using Oqtane.Services; | ||||
| using Oqtane.Shared; | ||||
| @ -12,44 +11,39 @@ namespace [Owner].[Module]s.Services | ||||
| { | ||||
|     public class [Module]Service : ServiceBase, I[Module]Service, IService | ||||
|     { | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|          private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "[Module]"); } | ||||
|         } | ||||
|          private string Apiurl=> CreateApiUrl(_siteState.Alias, "[Module]"); | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         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]) | ||||
|         { | ||||
|             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]) | ||||
|         { | ||||
|             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) | ||||
|         { | ||||
|             await DeleteAsync(Apiurl + "/" + [Module]Id.ToString()); | ||||
|             await DeleteAsync($"{Apiurl}/{[Module]Id}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -43,7 +43,7 @@ | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             [Module]Service = new [Module]Service(http, sitestate, NavigationManager); | ||||
|             [Module]Service = new [Module]Service(http, sitestate); | ||||
|             if (PageState.Action == "Edit") | ||||
|             { | ||||
|                 _id = Int32.Parse(PageState.QueryString["id"]); | ||||
|  | ||||
| @ -69,7 +69,7 @@ else | ||||
|     { | ||||
|         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); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|  | ||||
| @ -2,7 +2,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Modules; | ||||
| using Oqtane.Services; | ||||
| using Oqtane.Shared; | ||||
| @ -12,44 +11,39 @@ namespace [Owner].[Module]s.Services | ||||
| { | ||||
|     public class [Module]Service : ServiceBase, I[Module]Service, IService | ||||
|     { | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|          private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "[Module]"); } | ||||
|         } | ||||
|          private string Apiurl=> CreateApiUrl(_siteState.Alias, "[Module]"); | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         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]) | ||||
|         { | ||||
|             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]) | ||||
|         { | ||||
|             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) | ||||
|         { | ||||
|             await DeleteAsync(Apiurl + "/" + [Module]Id.ToString()); | ||||
|             await DeleteAsync($"{Apiurl}/{[Module]Id}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -251,7 +251,7 @@ | ||||
|         { | ||||
|             _themeList = await ThemeService.GetThemesAsync(); | ||||
|             _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) | ||||
|             { | ||||
|                 _name = site.Name; | ||||
| @ -364,7 +364,7 @@ | ||||
|  | ||||
|                 if (unique) | ||||
|                 { | ||||
|                     var site = await SiteService.GetSiteAsync(PageState.Site.SiteId, PageState.Alias); | ||||
|                     var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); | ||||
|                     if (site != null) | ||||
|                     { | ||||
|                         site.Name = _name; | ||||
| @ -395,7 +395,7 @@ | ||||
|                             site.PwaSplashIconFileId = pwasplashiconfileid; | ||||
|                         } | ||||
|  | ||||
|                         site = await SiteService.UpdateSiteAsync(site, PageState.Alias); | ||||
|                         site = await SiteService.UpdateSiteAsync(site); | ||||
|  | ||||
|                         _urls = _urls.Replace("\n", ","); | ||||
|                         var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); | ||||
|  | ||||
| @ -134,18 +134,19 @@ | ||||
|             _aliasList = await AliasService.GetAliasesAsync(); | ||||
|  | ||||
|             _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) | ||||
|             { | ||||
|                 _name = site.Name; | ||||
|                 _tenantList = await TenantService.GetTenantsAsync(); | ||||
|                 _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()) | ||||
|                 { | ||||
|                     _urls += alias.Name + "\n"; | ||||
|                 } | ||||
|                  | ||||
|  | ||||
|                 _themetype = site.DefaultThemeType; | ||||
|                 _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); | ||||
|                 _layouttype = site.DefaultLayoutType; | ||||
| @ -182,7 +183,7 @@ | ||||
|             { | ||||
|                 _panelayouts = new Dictionary<string, string>(); | ||||
|             } | ||||
|              | ||||
|  | ||||
|             StateHasChanged(); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
| @ -206,10 +207,11 @@ | ||||
|                         unique = false; | ||||
|                     } | ||||
|                 } | ||||
|                  | ||||
|  | ||||
|                 if (unique) | ||||
|                 { | ||||
|                     var site = await SiteService.GetSiteAsync(_alias.SiteId, _alias); | ||||
|                     SiteService.SetAlias(_alias); | ||||
|                     var site = await SiteService.GetSiteAsync(_alias.SiteId); | ||||
|                     if (site != null) | ||||
|                     { | ||||
|                         site.Name = _name; | ||||
| @ -219,11 +221,11 @@ | ||||
|                         site.DefaultContainerType = _containertype; | ||||
|                         site.IsDeleted = (_isdeleted == null || Boolean.Parse(_isdeleted)); | ||||
|  | ||||
|                         site = await SiteService.UpdateSiteAsync(site, _alias); | ||||
|                         site = await SiteService.UpdateSiteAsync(site); | ||||
|  | ||||
|                         _urls = _urls.Replace("\n", ","); | ||||
|                         var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                          | ||||
|  | ||||
|                         foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) | ||||
|                         { | ||||
|                             if (!names.Contains(alias.Name)) | ||||
| @ -231,7 +233,7 @@ | ||||
|                                 await AliasService.DeleteAliasAsync(alias.AliasId); | ||||
|                             } | ||||
|                         } | ||||
|                          | ||||
|  | ||||
|                         foreach (string name in names) | ||||
|                         { | ||||
|                             if (!_aliasList.Exists(item => item.Name == name)) | ||||
|  | ||||
| @ -54,7 +54,8 @@ else | ||||
|         { | ||||
|             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); | ||||
|                  | ||||
|                 var aliases = await AliasService.GetAliasesAsync(); | ||||
|  | ||||
| @ -16,7 +16,7 @@ | ||||
|         <RichTextEditor @ref="@RichTextEditorHtml"> | ||||
|             <ToolbarContent> | ||||
|                 <select class="ql-header"> | ||||
|                     <option selected=string.Empty></option> | ||||
|                     <option selected=""></option> | ||||
|                     <option value="1"></option> | ||||
|                     <option value="2"></option> | ||||
|                     <option value="3"></option> | ||||
| @ -123,7 +123,7 @@ | ||||
|  | ||||
|     private async Task LoadText() | ||||
|     { | ||||
|         var htmltextservice = new HtmlTextService(http, sitestate, NavigationManager); | ||||
|         var htmltextservice = new HtmlTextService(http, sitestate); | ||||
|         var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId); | ||||
|         if (htmltext != null) | ||||
|         { | ||||
| @ -166,7 +166,7 @@ | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             var htmltextservice = new HtmlTextService(http, sitestate, NavigationManager); | ||||
|             var htmltextservice = new HtmlTextService(http, sitestate); | ||||
|             var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId); | ||||
|             if (htmltext != null) | ||||
|             { | ||||
|  | ||||
| @ -25,7 +25,7 @@ | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             var htmltextservice = new HtmlTextService(http, sitestate, NavigationManager); | ||||
|             var htmltextservice = new HtmlTextService(http, sitestate); | ||||
|             var htmltext = await htmltextservice.GetHtmlTextAsync(ModuleState.ModuleId); | ||||
|             if (htmltext != null) | ||||
|             { | ||||
|  | ||||
| @ -2,7 +2,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Modules.HtmlText.Models; | ||||
| using Oqtane.Services; | ||||
| using Oqtane.Shared; | ||||
| @ -10,52 +9,35 @@ using Oqtane.Shared; | ||||
| namespace Oqtane.Modules.HtmlText.Services | ||||
| { | ||||
|     public class HtmlTextService : ServiceBase, IHtmlTextService | ||||
|     { | ||||
|          | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|     {         | ||||
|         private readonly SiteState _siteState; | ||||
|  | ||||
|         public HtmlTextService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         public HtmlTextService(HttpClient http, SiteState siteState) : base(http) | ||||
|         { | ||||
|              | ||||
|             _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) | ||||
|         { | ||||
|             HtmlTextInfo htmlText; | ||||
|             try | ||||
|             { | ||||
|                 //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; | ||||
|             var htmltext = await GetJsonAsync<List<HtmlTextInfo>>($"{ApiUrl}/{moduleId}?entityid={moduleId}"); | ||||
|             return htmltext.FirstOrDefault(); | ||||
|         } | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await PutJsonAsync(ApiUrl + "/" + htmlText.HtmlTextId + "?entityid=" + htmlText.ModuleId, htmlText); | ||||
|             await PutJsonAsync($"{ApiUrl}/{htmlText.HtmlTextId}?entityid={htmlText.ModuleId}", htmlText); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         public async Task DeleteHtmlTextAsync(int moduleId) | ||||
|         { | ||||
|             await DeleteAsync(ApiUrl + "/" + moduleId + "?entityid=" + moduleId); | ||||
|             await DeleteAsync($"{ApiUrl}/{moduleId}?entityid={moduleId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -87,7 +87,7 @@ namespace Oqtane.Modules | ||||
|  | ||||
|         public string ContentUrl(int fileid) | ||||
|         { | ||||
|             return Utilities.ContentUrl(PageState.Alias.Path, fileid); | ||||
|             return Utilities.ContentUrl(PageState.Alias, fileid); | ||||
|         } | ||||
|  | ||||
|         // user feedback methods | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| using System.Net.Http; | ||||
| using System.Net.Http.Json; | ||||
| using System.Security.Claims; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| 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 ) | ||||
|             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); | ||||
|  | ||||
|             ClaimsIdentity identity = new ClaimsIdentity(); | ||||
|  | ||||
| @ -2,32 +2,19 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| //using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
| using System.Net; | ||||
| using System; | ||||
| using System.Net.Http.Json; | ||||
| using Microsoft.AspNetCore.Components; | ||||
|  | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class AliasService : ServiceBase, IAliasService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public AliasService(HttpClient http) :base(http) { } | ||||
|  | ||||
|         public AliasService(HttpClient http, SiteState siteState, NavigationManager navigationManager) :base(http) | ||||
|         { | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Alias"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("Alias"); | ||||
|  | ||||
|         public async Task<List<Alias>> GetAliasesAsync() | ||||
|         { | ||||
| @ -37,22 +24,13 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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); | ||||
|             string name = uri.Authority; | ||||
|             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")}"); | ||||
|             name = (string.IsNullOrEmpty(name)) ? "~" : name; | ||||
|             return await GetJsonAsync<Alias>($"{Apiurl}/name/{WebUtility.UrlEncode(name)}?sync={lastSyncDate.ToString("yyyyMMddHHmmssfff")}"); | ||||
|         } | ||||
|  | ||||
|         public async Task<Alias> AddAliasAsync(Alias alias) | ||||
| @ -62,11 +40,11 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{aliasId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{aliasId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,7 +3,6 @@ using System.Net; | ||||
| using System.Net.Http; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Microsoft.JSInterop; | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Shared; | ||||
| @ -14,21 +13,15 @@ namespace Oqtane.Services | ||||
|     public class FileService : ServiceBase, IFileService | ||||
|     { | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         private readonly IJSRuntime _jsRuntime; | ||||
|  | ||||
|         public FileService(HttpClient http, SiteState siteState, NavigationManager navigationManager, | ||||
|             IJSRuntime jsRuntime) : base(http) | ||||
|         public FileService(HttpClient http, SiteState siteState, IJSRuntime jsRuntime) : base(http) | ||||
|         { | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|             _jsRuntime = jsRuntime; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "File"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "File"); | ||||
|  | ||||
|         public async Task<List<File>> GetFilesAsync(int folderId) | ||||
|         { | ||||
| @ -54,7 +47,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -64,17 +57,17 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{fileId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{fileId}"); | ||||
|         } | ||||
|  | ||||
|         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) | ||||
| @ -124,7 +117,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         public async Task<byte[]> DownloadFileAsync(int fileId) | ||||
|         { | ||||
|             return await GetByteArrayAsync($"{Apiurl}/download/{fileId.ToString()}"); | ||||
|             return await GetByteArrayAsync($"{Apiurl}/download/{fileId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
| using System; | ||||
| @ -14,26 +13,24 @@ namespace Oqtane.Services | ||||
|     public class FolderService : ServiceBase, IFolderService | ||||
|     { | ||||
|         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; | ||||
|             _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) | ||||
|         { | ||||
|             List<Folder> folders = await GetJsonAsync<List<Folder>>($"{ApiUrl}?siteid={siteId.ToString()}"); | ||||
|             List<Folder> folders = await GetJsonAsync<List<Folder>>($"{ApiUrl}?siteid={siteId}"); | ||||
|             folders = GetFoldersHierarchy(folders); | ||||
|             return folders; | ||||
|         } | ||||
|  | ||||
|         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) | ||||
| @ -55,7 +52,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -63,12 +60,12 @@ namespace Oqtane.Services | ||||
|             var parent = parentId == null | ||||
|                 ? string.Empty | ||||
|                 : 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) | ||||
|         { | ||||
|             await DeleteAsync($"{ApiUrl}/{folderId.ToString()}"); | ||||
|             await DeleteAsync($"{ApiUrl}/{folderId}"); | ||||
|         } | ||||
|  | ||||
|         private static List<Folder> GetFoldersHierarchy(List<Folder> folders) | ||||
|  | ||||
| @ -1,23 +1,15 @@ | ||||
| using Oqtane.Models; | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class InstallationService : ServiceBase, IInstallationService | ||||
|     { | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public InstallationService(HttpClient http):base(http) { } | ||||
|  | ||||
|         public InstallationService(HttpClient http, SiteState siteState, NavigationManager navigationManager):base(http) | ||||
|         { | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string ApiUrl => CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Installation"); | ||||
|         private string ApiUrl => CreateApiUrl("Installation"); | ||||
|  | ||||
|         public async Task<Installation> IsInstalled() | ||||
|         { | ||||
|  | ||||
| @ -6,14 +6,16 @@ namespace Oqtane.Services | ||||
| { | ||||
|     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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -11,8 +11,6 @@ namespace Oqtane.Services | ||||
|  | ||||
|         Task<User> AddUserAsync(User user); | ||||
|  | ||||
|         Task<User> AddUserAsync(User user, Alias alias); | ||||
|  | ||||
|         Task<User> UpdateUserAsync(User user); | ||||
|  | ||||
|         Task DeleteUserAsync(int userId); | ||||
|  | ||||
| @ -2,28 +2,15 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class JobLogService : ServiceBase, IJobLogService | ||||
|     { | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public JobLogService(HttpClient http) :base(http) { } | ||||
|  | ||||
|         public JobLogService(HttpClient http, SiteState siteState, NavigationManager navigationManager) :base(http)     | ||||
|  | ||||
|         { | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "JobLog"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("JobLog"); | ||||
|  | ||||
|         public async Task<List<JobLog>> GetJobLogsAsync() | ||||
|         { | ||||
| @ -33,7 +20,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -43,11 +30,11 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{jobLogId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{jobLogId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,29 +2,15 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class JobService : ServiceBase, IJobService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public JobService(HttpClient http) : base(http) { } | ||||
|  | ||||
|         public JobService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         { | ||||
|              | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Job"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("Job"); | ||||
|  | ||||
|         public async Task<List<Job>> GetJobsAsync() | ||||
|         { | ||||
| @ -34,7 +20,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -44,21 +30,21 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{jobId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{jobId}"); | ||||
|         } | ||||
|  | ||||
|         public async Task StartJobAsync(int jobId) | ||||
|         { | ||||
|             await GetAsync($"{Apiurl}/start/{jobId.ToString()}"); | ||||
|             await GetAsync($"{Apiurl}/start/{jobId}"); | ||||
|         } | ||||
|  | ||||
|         public async Task StopJobAsync(int jobId) | ||||
|         { | ||||
|             await GetAsync($"{Apiurl}/stop/{jobId.ToString()}"); | ||||
|             await GetAsync($"{Apiurl}/stop/{jobId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -23,19 +23,16 @@ namespace Oqtane.Services | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Log"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "Log"); | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             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) | ||||
| @ -52,6 +49,7 @@ namespace Oqtane.Services | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 base.Alias = alias; | ||||
|                 log.SiteId = alias.SiteId; | ||||
|             } | ||||
|             log.PageId = pageId; | ||||
| @ -69,7 +67,7 @@ namespace Oqtane.Services | ||||
|             log.Message = message; | ||||
|             log.MessageTemplate = ""; | ||||
|             log.Properties = JsonSerializer.Serialize(args); | ||||
|             await PostJsonAsync(CreateCrossTenantUrl(Apiurl, alias), log); | ||||
|             await PostJsonAsync(Apiurl, log); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,7 +3,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System; | ||||
| using System.Reflection; | ||||
| using Oqtane.Shared; | ||||
| @ -15,34 +14,29 @@ namespace Oqtane.Services | ||||
|     { | ||||
|         private readonly HttpClient _http; | ||||
|         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; | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, EntityNames.ModuleDefinition); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "ModuleDefinition"); | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await PutJsonAsync($"{Apiurl}/{moduleDefinition.ModuleDefinitionId.ToString()}", moduleDefinition); | ||||
|             await PutJsonAsync($"{Apiurl}/{moduleDefinition.ModuleDefinitionId}", moduleDefinition); | ||||
|         } | ||||
|  | ||||
|         public async Task InstallModuleDefinitionsAsync() | ||||
| @ -52,7 +46,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|  | ||||
| @ -3,7 +3,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| @ -12,23 +11,17 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Module"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "Module"); | ||||
|  | ||||
|         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 | ||||
|                 .OrderBy(item => item.Order) | ||||
|                 .ToList(); | ||||
| @ -37,7 +30,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -47,7 +40,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -62,7 +55,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         public async Task<string> ExportModuleAsync(int moduleId) | ||||
|         { | ||||
|             return await GetStringAsync($"{Apiurl}/export?moduleid={moduleId.ToString()}"); | ||||
|             return await GetStringAsync($"{Apiurl}/export?moduleid={moduleId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| using Oqtane.Models; | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| @ -11,29 +10,24 @@ namespace Oqtane.Services | ||||
|     public class NotificationService : ServiceBase, INotificationService | ||||
|     { | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Notification"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "Notification"); | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         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) | ||||
| @ -43,12 +37,12 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{notificationId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{notificationId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,29 +2,15 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class PackageService : ServiceBase, IPackageService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|     {         | ||||
|         public PackageService(HttpClient http) : base(http) { } | ||||
|  | ||||
|         public PackageService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         { | ||||
|              | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Package"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("Package"); | ||||
|  | ||||
|         public async Task<List<Package>> GetPackagesAsync(string tag) | ||||
|         { | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| using Oqtane.Models; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| @ -10,28 +9,22 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "PageModule"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "PageModule"); | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             return await GetJsonAsync<PageModule>($"{Apiurl}/{pageId.ToString()}/{moduleId.ToString()}"); | ||||
|             return await GetJsonAsync<PageModule>($"{Apiurl}/{pageId}/{moduleId}"); | ||||
|         } | ||||
|  | ||||
|         public async Task<PageModule> AddPageModuleAsync(PageModule pageModule) | ||||
| @ -41,17 +34,17 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await PutAsync($"{Apiurl}/?pageid={pageId.ToString()}&pane={pane}"); | ||||
|             await PutAsync($"{Apiurl}/?pageid={pageId}&pane={pane}"); | ||||
|         } | ||||
|  | ||||
|         public async Task DeletePageModuleAsync(int pageModuleId) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{pageModuleId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{pageModuleId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
| using System; | ||||
| @ -14,42 +13,37 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Page"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "Page"); | ||||
|  | ||||
|         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); | ||||
|             return pages; | ||||
|         } | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             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) | ||||
|         { | ||||
|             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 | ||||
|             { | ||||
| @ -64,12 +58,12 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             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) | ||||
| @ -77,12 +71,12 @@ namespace Oqtane.Services | ||||
|             var parent = parentId == null | ||||
|                 ? string.Empty | ||||
|                 : 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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{pageId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{pageId}"); | ||||
|         } | ||||
|  | ||||
|         private static List<Page> GetPagesHierarchy(List<Page> pages) | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| @ -12,29 +11,23 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Profile"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "Profile"); | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         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) | ||||
| @ -44,11 +37,11 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{profileId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{profileId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| @ -12,29 +11,24 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Role"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "Role"); | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         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) | ||||
| @ -44,11 +38,11 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{roleId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{roleId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -17,7 +17,6 @@ namespace Oqtane.Services | ||||
|             _http = client; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         protected async Task GetAsync(string uri) | ||||
|         { | ||||
|             var response = await _http.GetAsync(uri); | ||||
| @ -135,24 +134,31 @@ namespace Oqtane.Services | ||||
|             //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) | ||||
|             { | ||||
|                 // build a url which passes the alias that may include a subfolder for multi-tenancy | ||||
|                 apiurl = $"{uri.Scheme}://{alias.Name}/"; | ||||
|                 if (alias.Path == string.Empty) | ||||
|                 { | ||||
|                     apiurl += "~/"; | ||||
|                 } | ||||
|                 // include the alias for multi-tenant context | ||||
|                 apiurl += $"{alias.AliasId}/"; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // build a url which ignores any subfolder for multi-tenancy | ||||
|                 apiurl = $"{uri.Scheme}://{uri.Authority}/~/"; | ||||
|                 // tenant agnostic | ||||
|                 apiurl += "~/"; | ||||
|             } | ||||
|  | ||||
|             apiurl += $"api/{serviceName}"; | ||||
| @ -160,15 +166,8 @@ namespace Oqtane.Services | ||||
|             return apiurl; | ||||
|         } | ||||
|  | ||||
|         public static string CreateCrossTenantUrl(string url, Alias alias) | ||||
|         { | ||||
|             if (alias != null) | ||||
|             { | ||||
|                 url += (url.Contains("?")) ? "&" : "?"; | ||||
|                 url += "aliasid=" + alias.AliasId.ToString(); | ||||
|             } | ||||
|         // can be used to override the default alias | ||||
|         public Alias Alias { get; set; } | ||||
|  | ||||
|             return url; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| @ -12,20 +11,13 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _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() | ||||
|         { | ||||
|             return await GetSettingsAsync(EntityNames.Tenant, -1); | ||||
| @ -99,7 +91,7 @@ namespace Oqtane.Services | ||||
|         public async Task<Dictionary<string, string>> GetSettingsAsync(string entityName, int entityId) | ||||
|         { | ||||
|             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()) | ||||
|             { | ||||
| @ -110,7 +102,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|             { | ||||
| @ -138,7 +130,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -148,12 +140,12 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{settingId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{settingId}"); | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Threading.Tasks; | ||||
| using System.Net.Http; | ||||
| using System.Linq; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Collections.Generic; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| @ -12,44 +11,44 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _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(); | ||||
|         } | ||||
|  | ||||
|         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}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,28 +3,14 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class SiteTemplateService : ServiceBase, ISiteTemplateService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public SiteTemplateService(HttpClient http) : base(http) { } | ||||
|  | ||||
|         public SiteTemplateService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         { | ||||
|              | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "SiteTemplate"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("SiteTemplate"); | ||||
|  | ||||
|         public async Task<List<SiteTemplate>> GetSiteTemplatesAsync() | ||||
|         { | ||||
|  | ||||
| @ -1,30 +1,14 @@ | ||||
| using Oqtane.Models; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class SqlService : ServiceBase, ISqlService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public SqlService(HttpClient http) : base(http) { } | ||||
|  | ||||
|         public SqlService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         { | ||||
|              | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Sql"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("Sql"); | ||||
|  | ||||
|         public async Task<SqlQuery> ExecuteQueryAsync(SqlQuery sqlquery) | ||||
|         { | ||||
|  | ||||
| @ -1,28 +1,14 @@ | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| { | ||||
|     public class SystemService : ServiceBase, ISystemService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public SystemService(HttpClient http) : base(http) { } | ||||
|  | ||||
|         public SystemService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         { | ||||
|              | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "System"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("System"); | ||||
|  | ||||
|         public async Task<Dictionary<string, string>> GetSystemInfoAsync() | ||||
|         { | ||||
|  | ||||
| @ -1,8 +1,6 @@ | ||||
| using Oqtane.Models; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| @ -10,21 +8,9 @@ namespace Oqtane.Services | ||||
| { | ||||
|     public class TenantService : ServiceBase, ITenantService | ||||
|     { | ||||
|          | ||||
|         private readonly SiteState _siteState; | ||||
|         private readonly NavigationManager _navigationManager; | ||||
|         public TenantService(HttpClient http) : base(http) { } | ||||
|  | ||||
|         public TenantService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http) | ||||
|         { | ||||
|              | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Tenant"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("Tenant"); | ||||
|  | ||||
|         public async Task<List<Tenant>> GetTenantsAsync() | ||||
|         { | ||||
| @ -34,7 +20,7 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
| @ -44,12 +30,12 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{tenantId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{tenantId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,7 +3,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Reflection; | ||||
| using System; | ||||
| using Oqtane.Shared; | ||||
| @ -13,20 +12,13 @@ namespace Oqtane.Services | ||||
|     public class ThemeService : ServiceBase, IThemeService | ||||
|     { | ||||
|         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; | ||||
|             _siteState = siteState; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Theme"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl("Theme"); | ||||
|  | ||||
|         public async Task<List<Theme>> GetThemesAsync() | ||||
|         { | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| @ -11,28 +10,22 @@ namespace Oqtane.Services | ||||
|     { | ||||
|          | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "UserRole"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "UserRole"); | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             return await GetJsonAsync<UserRole>($"{Apiurl}/{userRoleId.ToString()}"); | ||||
|             return await GetJsonAsync<UserRole>($"{Apiurl}/{userRoleId}"); | ||||
|         } | ||||
|  | ||||
|         public async Task<UserRole> AddUserRoleAsync(UserRole userRole) | ||||
| @ -42,12 +35,12 @@ namespace Oqtane.Services | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             await DeleteAsync($"{Apiurl}/{userRoleId.ToString()}"); | ||||
|             await DeleteAsync($"{Apiurl}/{userRoleId}"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| using Oqtane.Shared; | ||||
| using Oqtane.Models; | ||||
| using System.Net.Http; | ||||
| using Microsoft.AspNetCore.Components; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace Oqtane.Services | ||||
| @ -9,18 +8,13 @@ namespace Oqtane.Services | ||||
|     public class UserService : ServiceBase, IUserService | ||||
|     { | ||||
|         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; | ||||
|             _navigationManager = navigationManager; | ||||
|         } | ||||
|  | ||||
|         private string Apiurl | ||||
|         { | ||||
|             get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "User"); } | ||||
|         } | ||||
|         private string Apiurl => CreateApiUrl(_siteState.Alias, "User"); | ||||
|  | ||||
|         public async Task<User> GetUserAsync(int userId, int siteId) | ||||
|         { | ||||
| @ -37,11 +31,6 @@ namespace Oqtane.Services | ||||
|             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) | ||||
|         { | ||||
|             return await PutJsonAsync<User>($"{Apiurl}/{user.UserId}", user); | ||||
|  | ||||
| @ -41,7 +41,7 @@ namespace Oqtane.Themes | ||||
|  | ||||
|         public string ContentUrl(int fileid) | ||||
|         { | ||||
|             return Utilities.ContentUrl(PageState.Alias.Path, fileid); | ||||
|             return Utilities.ContentUrl(PageState.Alias, fileid); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -84,20 +84,13 @@ | ||||
|         var lastsyncdate = DateTime.UtcNow; | ||||
|         var runtime = GetRuntime(); | ||||
|  | ||||
|         // get Url path and querystring ( and remove anchors ) | ||||
|         var path = new Uri(_absoluteUri).PathAndQuery.Substring(1); | ||||
|         if (path.IndexOf("#") != -1) | ||||
|         { | ||||
|             path = path.Substring(0, path.IndexOf("#")); | ||||
|         } | ||||
|         Uri uri = new Uri(_absoluteUri); | ||||
|  | ||||
|         // parse querystring and remove | ||||
|         var querystring = new Dictionary<string, string>(); | ||||
|         if (path.IndexOf("?") != -1) | ||||
|         { | ||||
|             querystring = ParseQueryString(path); | ||||
|             path = path.Substring(0, path.IndexOf("?")); | ||||
|         } | ||||
|         // get path | ||||
|         var path = uri.LocalPath.Substring(1); | ||||
|  | ||||
|         // parse querystring  | ||||
|         var querystring = ParseQueryString(uri.Query); | ||||
|  | ||||
|         // the reload parameter is used during user login/logout | ||||
|         if (querystring.ContainsKey("reload")) | ||||
| @ -111,7 +104,7 @@ | ||||
|             lastsyncdate = PageState.LastSyncDate; | ||||
|         } | ||||
|  | ||||
|         alias = await AliasService.GetAliasAsync(_absoluteUri, lastsyncdate); | ||||
|         alias = await AliasService.GetAliasAsync(path, lastsyncdate); | ||||
|         SiteState.Alias = alias; // set state for services | ||||
|         lastsyncdate = alias.SyncDate; | ||||
|  | ||||
| @ -130,14 +123,14 @@ | ||||
|  | ||||
|         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; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             site = PageState.Site; | ||||
|         } | ||||
|          | ||||
|  | ||||
|         if (site != null) | ||||
|         { | ||||
|             if (PageState == null || reload == Reload.Site) | ||||
| @ -175,9 +168,9 @@ | ||||
|  | ||||
|             // format path and remove alias | ||||
|             path = path.Replace("//", "/"); | ||||
|              | ||||
|  | ||||
|             if (!path.EndsWith("/")) | ||||
|             {  | ||||
|             { | ||||
|                 path += "/"; | ||||
|             } | ||||
|  | ||||
| @ -205,7 +198,7 @@ | ||||
|                     path = path.Replace(moduleid.ToString() + "/", ""); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|  | ||||
|             // remove trailing slash so it can be used as a key for Pages | ||||
|             if (path.EndsWith("/")) path = path.Substring(0, path.Length - 1); | ||||
|  | ||||
| @ -217,7 +210,7 @@ | ||||
|             { | ||||
|                 page = PageState.Page; | ||||
|             } | ||||
|              | ||||
|  | ||||
|             // failsafe in case router cannot locate the home page for the site | ||||
|             if (page == null && path == "") | ||||
|             { | ||||
| @ -321,16 +314,17 @@ | ||||
|             _navigationInterceptionEnabled = true; | ||||
|             return NavigationInterception.EnableNavigationInterceptionAsync(); | ||||
|         } | ||||
|          | ||||
|  | ||||
|         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>(); | ||||
|         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 != "") | ||||
|                 { | ||||
| @ -341,12 +335,11 @@ | ||||
|                     } | ||||
|                     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; | ||||
|     } | ||||
|  | ||||
| @ -366,7 +359,7 @@ | ||||
|                 page.LayoutType = site.DefaultLayoutType; | ||||
|             } | ||||
|             Type type; | ||||
|              | ||||
|  | ||||
|             if (!string.IsNullOrEmpty(page.LayoutType)) | ||||
|             { | ||||
|                 type = Type.GetType(page.LayoutType); | ||||
| @ -375,7 +368,7 @@ | ||||
|             { | ||||
|                 type = Type.GetType(page.ThemeType); | ||||
|             } | ||||
|              | ||||
|  | ||||
|             var property = type.GetProperty("Panes"); | ||||
|             page.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); | ||||
|         } | ||||
| @ -383,7 +376,7 @@ | ||||
|         { | ||||
|             // error loading theme or layout | ||||
|         } | ||||
|          | ||||
|  | ||||
|         return page; | ||||
|     } | ||||
|  | ||||
| @ -403,7 +396,7 @@ | ||||
|                 { | ||||
|                     typename = Constants.ErrorModule; | ||||
|                 } | ||||
|                  | ||||
|  | ||||
|                 if (module.ModuleId == moduleid && control != "") | ||||
|                 { | ||||
|                     // check if the module defines custom routes | ||||
| @ -459,7 +452,7 @@ | ||||
|                 { | ||||
|                     paneindex.Add(module.Pane, 0); | ||||
|                 } | ||||
|                  | ||||
|  | ||||
|                 module.PaneModuleIndex = paneindex[module.Pane]; | ||||
|  | ||||
|                 if (string.IsNullOrEmpty(module.ContainerType)) | ||||
| @ -473,7 +466,7 @@ | ||||
|         { | ||||
|             module.PaneModuleCount = paneindex[module.Pane] + 1; | ||||
|         } | ||||
|          | ||||
|  | ||||
|         return modules; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -22,7 +22,7 @@ | ||||
|         } | ||||
|         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) | ||||
|         { | ||||
| @ -59,11 +59,11 @@ | ||||
|             "\"background_color\": \"#fff\", " + | ||||
|             "\"description\": \"" + PageState.Site.Name + "\", " + | ||||
|             "\"icons\": [{ " + | ||||
|                 "\"src\": \"" + Utilities.ContentUrl(PageState.Alias.Path, PageState.Site.PwaAppIconFileId.Value) + "\", " + | ||||
|                 "\"src\": \"" + Utilities.ContentUrl(PageState.Alias, PageState.Site.PwaAppIconFileId.Value) + "\", " + | ||||
|                 "\"sizes\": \"192x192\", " + | ||||
|                 "\"type\": \"image/png\" " + | ||||
|                 "}, { " + | ||||
|                 "\"src\": \"" + Utilities.ContentUrl(PageState.Alias.Path, PageState.Site.PwaSplashIconFileId.Value) + "\", " + | ||||
|                 "\"src\": \"" + Utilities.ContentUrl(PageState.Alias, PageState.Site.PwaSplashIconFileId.Value) + "\", " + | ||||
|                 "\"sizes\": \"512x512\", " + | ||||
|                 "\"type\": \"image/png\" " + | ||||
|             "}] " + | ||||
|  | ||||
| @ -10,6 +10,7 @@ using System.Globalization; | ||||
| using Oqtane.Enums; | ||||
| using Oqtane.Infrastructure; | ||||
| using Oqtane.Repository; | ||||
| using Microsoft.AspNetCore.Http; | ||||
|  | ||||
| namespace Oqtane.Controllers | ||||
| { | ||||
| @ -17,12 +18,14 @@ namespace Oqtane.Controllers | ||||
|     public class AliasController : Controller | ||||
|     { | ||||
|         private readonly IAliasRepository _aliases; | ||||
|         private readonly IHttpContextAccessor _accessor; | ||||
|         private readonly ISyncManager _syncManager; | ||||
|         private readonly ILogManager _logger; | ||||
|  | ||||
|         public AliasController(IAliasRepository aliases, ISyncManager syncManager, ILogManager logger) | ||||
|         public AliasController(IAliasRepository aliases, IHttpContextAccessor accessor, ISyncManager syncManager, ILogManager logger) | ||||
|         { | ||||
|             _aliases = aliases; | ||||
|             _accessor = accessor; | ||||
|             _syncManager = syncManager; | ||||
|             _logger = logger; | ||||
|         } | ||||
| @ -43,20 +46,30 @@ namespace Oqtane.Controllers | ||||
|             return _aliases.GetAlias(id); | ||||
|         } | ||||
|  | ||||
|         // GET api/<controller>/name/localhost:12345?lastsyncdate=yyyyMMddHHmmssfff | ||||
|         // GET api/<controller>/name/xxx?sync=yyyyMMddHHmmssfff | ||||
|         [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(); | ||||
|             List<Alias> aliases = _aliases.GetAliases().ToList(); // cached | ||||
|             Alias alias = null; | ||||
|             alias = aliases.FirstOrDefault(item => item.Name == name); | ||||
|             if (name != null && (alias == null && name.Contains("/"))) | ||||
|             if (_accessor.HttpContext != null) | ||||
|             { | ||||
|                 // lookup alias without folder name | ||||
|                 alias = aliases.Find(item => item.Name == name.Substring(0, name.IndexOf("/", StringComparison.Ordinal))); | ||||
|                 name = (name == "~") ? "" : name; | ||||
|                 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 | ||||
|                 alias = aliases.FirstOrDefault(); | ||||
| @ -66,7 +79,7 @@ namespace Oqtane.Controllers | ||||
|             if (alias != null) | ||||
|             { | ||||
|                 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; | ||||
|         } | ||||
|  | ||||
| @ -20,15 +20,17 @@ namespace Oqtane.Controllers | ||||
|         private readonly IModuleRepository _modules; | ||||
|         private readonly IPageModuleRepository _pageModules; | ||||
|         private readonly IUserPermissions _userPermissions; | ||||
|         private readonly ITenantResolver _tenants; | ||||
|         private readonly ISyncManager _syncManager; | ||||
|         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; | ||||
|             _modules = modules; | ||||
|             _pageModules = pageModules; | ||||
|             _userPermissions = userPermissions; | ||||
|             _tenants = tenants; | ||||
|             _syncManager = syncManager; | ||||
|             _logger = logger; | ||||
|         } | ||||
| @ -120,7 +122,7 @@ namespace Oqtane.Controllers | ||||
|                 if (_userPermissions.IsAuthorized(User,PermissionNames.Edit, permissions)) | ||||
|                 { | ||||
|                     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); | ||||
|                 } | ||||
|                 else | ||||
| @ -162,7 +164,7 @@ namespace Oqtane.Controllers | ||||
|                 page.IsPersonalizable = false; | ||||
|                 page.UserId = int.Parse(userid); | ||||
|                 page = _pages.AddPage(page); | ||||
|                 _syncManager.AddSyncEvent(EntityNames.Site, page.SiteId); | ||||
|                 _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.Site, page.SiteId); | ||||
|  | ||||
|                 // copy modules | ||||
|                 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)) | ||||
|             { | ||||
|                 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); | ||||
|             } | ||||
|             else | ||||
| @ -236,7 +238,7 @@ namespace Oqtane.Controllers | ||||
|                     } | ||||
|                     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); | ||||
|             } | ||||
|             else | ||||
| @ -255,7 +257,7 @@ namespace Oqtane.Controllers | ||||
|             if (_userPermissions.IsAuthorized(User, EntityNames.Page, page.PageId, PermissionNames.Edit)) | ||||
|             { | ||||
|                 _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); | ||||
|             } | ||||
|             else | ||||
|  | ||||
| @ -16,13 +16,15 @@ namespace Oqtane.Controllers | ||||
|     { | ||||
|         private readonly IPageModuleRepository _pageModules; | ||||
|         private readonly IUserPermissions _userPermissions; | ||||
|         private readonly ITenantResolver _tenants; | ||||
|         private readonly ISyncManager _syncManager; | ||||
|         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; | ||||
|             _userPermissions = userPermissions; | ||||
|             _tenants = tenants; | ||||
|             _syncManager = syncManager; | ||||
|             _logger = logger; | ||||
|         } | ||||
| @ -69,7 +71,7 @@ namespace Oqtane.Controllers | ||||
|             if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Page, pageModule.PageId, PermissionNames.Edit)) | ||||
|             { | ||||
|                 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); | ||||
|             } | ||||
|             else | ||||
| @ -89,7 +91,7 @@ namespace Oqtane.Controllers | ||||
|             if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Module, pageModule.ModuleId, PermissionNames.Edit)) | ||||
|             { | ||||
|                 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); | ||||
|             } | ||||
|             else | ||||
| @ -119,7 +121,7 @@ namespace Oqtane.Controllers | ||||
|                     } | ||||
|                     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); | ||||
|             } | ||||
|             else | ||||
| @ -138,7 +140,7 @@ namespace Oqtane.Controllers | ||||
|             if (_userPermissions.IsAuthorized(User, EntityNames.Page, pagemodule.PageId, PermissionNames.Edit)) | ||||
|             { | ||||
|                 _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); | ||||
|             } | ||||
|             else | ||||
|  | ||||
| @ -76,7 +76,7 @@ namespace Oqtane.Controllers | ||||
|             if (ModelState.IsValid) | ||||
|             { | ||||
|                 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); | ||||
|             } | ||||
|             return site; | ||||
|  | ||||
| @ -224,7 +224,7 @@ namespace Oqtane.Controllers | ||||
|                         } | ||||
|                     } | ||||
|                     user = _users.UpdateUser(user); | ||||
|                     _syncManager.AddSyncEvent(EntityNames.User, user.UserId); | ||||
|                     _syncManager.AddSyncEvent(_tenants.GetTenant().TenantId, EntityNames.User, user.UserId); | ||||
|                     user.Password = ""; // remove sensitive information | ||||
|                     _logger.Log(LogLevel.Information, this, LogFunction.Update, "User Updated {User}", user); | ||||
|                 } | ||||
| @ -406,16 +406,19 @@ namespace Oqtane.Controllers | ||||
|         [HttpGet("authenticate")] | ||||
|         public User Authenticate() | ||||
|         { | ||||
|             User user = new User(); | ||||
|             user.Username = User.Identity.Name; | ||||
|             user.IsAuthenticated = User.Identity.IsAuthenticated; | ||||
|             string roles = ""; | ||||
|             foreach (var claim in User.Claims.Where(item => item.Type == ClaimTypes.Role)) | ||||
|             User user = new User { IsAuthenticated = User.Identity.IsAuthenticated, Username = "", UserId = -1, Roles = "" };             | ||||
|             if (user.IsAuthenticated) | ||||
|             { | ||||
|                 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; | ||||
|         } | ||||
|  | ||||
|  | ||||
| @ -13,13 +13,15 @@ namespace Oqtane.Controllers | ||||
|     public class UserRoleController : Controller | ||||
|     { | ||||
|         private readonly IUserRoleRepository _userRoles; | ||||
|         private readonly ITenantResolver _tenants; | ||||
|         private readonly ISyncManager _syncManager; | ||||
|         private readonly ILogManager _logger; | ||||
|  | ||||
|         public UserRoleController(IUserRoleRepository userRoles, ISyncManager syncManager, ILogManager logger) | ||||
|         public UserRoleController(IUserRoleRepository userRoles, ITenantResolver tenants, ISyncManager syncManager, ILogManager logger) | ||||
|         { | ||||
|             _userRoles = userRoles; | ||||
|             _syncManager = syncManager; | ||||
|             _tenants = tenants; | ||||
|             _logger = logger; | ||||
|         } | ||||
|  | ||||
| @ -47,7 +49,7 @@ namespace Oqtane.Controllers | ||||
|             if (ModelState.IsValid) | ||||
|             { | ||||
|                 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); | ||||
|             } | ||||
|             return userRole; | ||||
| @ -61,7 +63,7 @@ namespace Oqtane.Controllers | ||||
|             if (ModelState.IsValid) | ||||
|             { | ||||
|                 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); | ||||
|             } | ||||
|             return userRole; | ||||
| @ -74,7 +76,7 @@ namespace Oqtane.Controllers | ||||
|         { | ||||
|             UserRole userRole = _userRoles.GetUserRole(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); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -6,7 +6,7 @@ namespace Oqtane.Infrastructure | ||||
| { | ||||
|     public interface ISyncManager | ||||
|     { | ||||
|         List<SyncEvent> GetSyncEvents(DateTime lastSyncDate); | ||||
|         void AddSyncEvent(string entityName, int entityId); | ||||
|         List<SyncEvent> GetSyncEvents(int tenantId, DateTime lastSyncDate); | ||||
|         void AddSyncEvent(int tenantId, string entityName, int entityId); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,43 +1,28 @@ | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Oqtane.Infrastructure; | ||||
| using Oqtane.Repository; | ||||
|  | ||||
| namespace Oqtane.Infrastructure | ||||
| { | ||||
|     public class SyncManager : ISyncManager | ||||
|     { | ||||
|         private readonly IServiceScopeFactory _serviceScopeFactory; | ||||
|         private List<SyncEvent> SyncEvents { get; set; } | ||||
|  | ||||
|         public SyncManager(IServiceScopeFactory serviceScopeFactory) | ||||
|         public SyncManager() | ||||
|         { | ||||
|             this._serviceScopeFactory = serviceScopeFactory; | ||||
|             SyncEvents = new List<SyncEvent>(); | ||||
|         } | ||||
|  | ||||
|         private int TenantId | ||||
|         public List<SyncEvent> GetSyncEvents(int tenantId, DateTime lastSyncDate) | ||||
|         { | ||||
|             get  | ||||
|             { | ||||
|                 using (var scope = _serviceScopeFactory.CreateScope()) | ||||
|                 { | ||||
|                     return scope.ServiceProvider.GetRequiredService<ITenantResolver>().GetTenant().TenantId; | ||||
|                 } | ||||
|             } | ||||
|             return SyncEvents.Where(item => item.TenantId == tenantId && item.ModifiedOn >= lastSyncDate).ToList(); | ||||
|         } | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
|         public void AddSyncEvent(string entityName, int entityId) | ||||
|         { | ||||
|             SyncEvents.Add(new SyncEvent { TenantId = TenantId, EntityName = entityName, EntityId = entityId, ModifiedOn = DateTime.UtcNow }); | ||||
|             SyncEvents.Add(new SyncEvent { TenantId = tenantId, EntityName = entityName, EntityId = entityId, ModifiedOn = DateTime.UtcNow }); | ||||
|             // trim sync events  | ||||
|             SyncEvents.RemoveAll(item => item.ModifiedOn < DateTime.UtcNow.AddHours(-1)); | ||||
|         } | ||||
|  | ||||
| @ -15,7 +15,6 @@ namespace Oqtane.Repository | ||||
|         public TenantResolver(IHttpContextAccessor accessor, IAliasRepository aliasRepository, ITenantRepository tenantRepository, SiteState siteState) | ||||
|         { | ||||
|             int aliasId = -1; | ||||
|             string aliasName = ""; | ||||
|  | ||||
|             if (siteState != null && siteState.Alias != null) | ||||
|             { | ||||
| @ -23,29 +22,14 @@ namespace Oqtane.Repository | ||||
|                 _alias = siteState.Alias; | ||||
|             } | ||||
|             else | ||||
|             {  | ||||
|                 // get alias identifier based on request context | ||||
|             { | ||||
|                 // get aliasid identifier based on request | ||||
|                 if (accessor.HttpContext != null) | ||||
|                 { | ||||
|                     // check if an alias is passed as a querystring parameter ( for cross tenant access ) | ||||
|                     if (accessor.HttpContext.Request.Query.ContainsKey("aliasid")) | ||||
|                     string[] segments = accessor.HttpContext.Request.Path.Value.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     if (segments.Length > 1 && segments[1] == "api" && segments[0] != "~") | ||||
|                     { | ||||
|                         aliasId = int.Parse(accessor.HttpContext.Request.Query["aliasid"]); | ||||
|                     } | ||||
|                     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); | ||||
|                         } | ||||
|                         aliasId = int.Parse(segments[0]); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
| @ -55,14 +39,11 @@ namespace Oqtane.Repository | ||||
|                 { | ||||
|                     _alias = aliases.FirstOrDefault(item => item.AliasId == aliasId); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     _alias = aliases.FirstOrDefault(item => item.Name == aliasName || aliases.Count() == 1); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (_alias != null) | ||||
|             { | ||||
|                 // get the tenant | ||||
|                 IEnumerable<Tenant> tenants = tenantRepository.GetTenants(); // cached | ||||
|                 _tenant = tenants.FirstOrDefault(item => item.TenantId == _alias.TenantId); | ||||
|             } | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| using System; | ||||
| using Oqtane.Models; | ||||
| using System; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Text; | ||||
| @ -44,9 +45,9 @@ namespace Oqtane.Shared | ||||
|             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(); | ||||
|             return url; | ||||
|         } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Shaun Walker
					Shaun Walker