From ffcc229c78c43ba99fca1d15ce0b5b9e31e7b20d Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Mon, 16 Aug 2021 09:46:02 -0400 Subject: [PATCH] support for commercial modules, themes, translations --- .../Modules/Admin/Languages/Add.razor | 8 ++- .../Modules/Admin/ModuleDefinitions/Add.razor | 2 +- .../Admin/ModuleDefinitions/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Themes/Add.razor | 8 ++- .../Modules/Admin/Themes/Index.razor | 2 +- .../Modules/Admin/Upgrade/Index.razor | 2 +- .../Services/Interfaces/IPackageService.cs | 2 +- Oqtane.Client/Services/PackageService.cs | 6 +- .../Controllers/PackageController.cs | 6 +- .../Infrastructure/InstallationManager.cs | 56 ++++++++++--------- .../Repository/ModuleDefinitionRepository.cs | 4 -- Oqtane.Server/Repository/ThemeRepository.cs | 4 -- .../Modules/[Owner].[Module]/ModuleInfo.cs | 3 +- .../Templates/External/Client/ThemeInfo.cs | 3 +- 14 files changed, 57 insertions(+), 51 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index d3385ff8..5d635b5b 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -77,7 +77,11 @@ else

@context.Name

  by:  @context.Owner
@(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
- @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |  @SharedLocalizer["Search.Version"]: @context.Version  |  @SharedLocalizer["Search.Source"]: @context.PackageUrl + @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   + @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |   + @SharedLocalizer["Search.Version"]: @context.Version  |   + @SharedLocalizer["Search.Source"]: @context.PackageUrl  |   + @SharedLocalizer["Search.Price"]: @((context.Price == 0) ? "FREE" : context.Price.ToString("$#,##0.00") ) @@ -184,7 +188,7 @@ else private async Task LoadTranslations() { - _packages = await PackageService.GetPackagesAsync("translation", _search, _price); + _packages = await PackageService.GetPackagesAsync("translation", _search, _price, ""); } private async void PriceChanged(ChangeEventArgs e) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 035732f3..73626c53 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -129,7 +129,7 @@ private async Task LoadModuleDefinitions() { var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); - _packages = await PackageService.GetPackagesAsync("module", _search, _price); + _packages = await PackageService.GetPackagesAsync("module", _search, _price, ""); if (_packages != null) { diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 70a3abba..b5d23a21 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -70,7 +70,7 @@ else private bool UpgradeAvailable(string packagename, string version) { var upgradeavailable = false; - if (_packages != null) + if (!string.IsNullOrEmpty(packagename) && _packages != null) { var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); if (package != null) diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index a7a81da2..e127f852 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -34,7 +34,11 @@

@context.Name

  @SharedLocalizer["Search.By"]:  @context.Owner
@(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
- @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |  @SharedLocalizer["Search.Version"]: @context.Version  |  @SharedLocalizer["Search.Source"]: @context.PackageUrl + @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   + @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |   + @SharedLocalizer["Search.Version"]: @context.Version  |   + @SharedLocalizer["Search.Source"]: @context.PackageUrl  |   + @SharedLocalizer["Search.Price"]: @((context.Price == 0) ? "FREE" : context.Price.ToString("$#,##0.00") ) @@ -126,7 +130,7 @@ private async Task LoadThemes() { var themes = await ThemeService.GetThemesAsync(); - _packages = await PackageService.GetPackagesAsync("theme", _search, _price); + _packages = await PackageService.GetPackagesAsync("theme", _search, _price, ""); if (_packages != null) { diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index a2a3932e..5346704e 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -72,7 +72,7 @@ else private bool UpgradeAvailable(string packagename, string version) { var upgradeavailable = false; - if (_packages != null) + if (!string.IsNullOrEmpty(packagename) && _packages != null) { var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); if (package != null) diff --git a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor index 7c90b014..52e6f01f 100644 --- a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor +++ b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor @@ -44,7 +44,7 @@ { try { - List packages = await PackageService.GetPackagesAsync("framework"); + List packages = await PackageService.GetPackagesAsync("framework", "", "", ""); if (packages != null) { _package = packages.Where(item => item.PackageId.StartsWith(Constants.PackageId)).FirstOrDefault(); diff --git a/Oqtane.Client/Services/Interfaces/IPackageService.cs b/Oqtane.Client/Services/Interfaces/IPackageService.cs index e6cf5e62..e09f89f9 100644 --- a/Oqtane.Client/Services/Interfaces/IPackageService.cs +++ b/Oqtane.Client/Services/Interfaces/IPackageService.cs @@ -7,7 +7,7 @@ namespace Oqtane.Services public interface IPackageService { Task> GetPackagesAsync(string type); - Task> GetPackagesAsync(string type, string search, string price); + Task> GetPackagesAsync(string type, string search, string price, string package); Task GetPackageAsync(string packageId, string version); Task DownloadPackageAsync(string packageId, string version, string folder); Task InstallPackagesAsync(); diff --git a/Oqtane.Client/Services/PackageService.cs b/Oqtane.Client/Services/PackageService.cs index 122e6311..e0dad5b0 100644 --- a/Oqtane.Client/Services/PackageService.cs +++ b/Oqtane.Client/Services/PackageService.cs @@ -22,12 +22,12 @@ namespace Oqtane.Services public async Task> GetPackagesAsync(string type) { - return await GetPackagesAsync(type, "", ""); + return await GetPackagesAsync(type, "", "", ""); } - public async Task> GetPackagesAsync(string type, string search, string price) + public async Task> GetPackagesAsync(string type, string search, string price, string package) { - return await GetJsonAsync>($"{Apiurl}?type={type}&search={WebUtility.UrlEncode(search)}&price={price}"); + return await GetJsonAsync>($"{Apiurl}?type={type}&search={WebUtility.UrlEncode(search)}&price={price}&package={package}"); } public async Task GetPackageAsync(string packageId, string version) diff --git a/Oqtane.Server/Controllers/PackageController.cs b/Oqtane.Server/Controllers/PackageController.cs index 4a85428e..87a5f699 100644 --- a/Oqtane.Server/Controllers/PackageController.cs +++ b/Oqtane.Server/Controllers/PackageController.cs @@ -32,10 +32,10 @@ namespace Oqtane.Controllers _logger = logger; } - // GET: api/?type=x&search=y&license=z + // GET: api/?type=x&search=y&price=z&package=a [HttpGet] [Authorize(Roles = RoleNames.Host)] - public async Task> Get(string type, string search, string price) + public async Task> Get(string type, string search, string price, string package) { // get packages List packages = new List(); @@ -45,7 +45,7 @@ namespace Oqtane.Controllers { client.DefaultRequestHeaders.Add("Referer", HttpContext.Request.Scheme + "://" + HttpContext.Request.Host.Value); client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(Constants.PackageId, Constants.Version)); - packages = await GetJson>(client, Constants.PackageRegistryUrl + $"/api/registry/packages/?id={_configManager.GetInstallationId()}&type={type.ToLower()}&version={Constants.Version}&search={search}&price={price}"); + packages = await GetJson>(client, Constants.PackageRegistryUrl + $"/api/registry/packages/?id={_configManager.GetInstallationId()}&type={type.ToLower()}&version={Constants.Version}&search={search}&price={price}&package={package}"); } } return packages; diff --git a/Oqtane.Server/Infrastructure/InstallationManager.cs b/Oqtane.Server/Infrastructure/InstallationManager.cs index fd63c7e7..cd5d5963 100644 --- a/Oqtane.Server/Infrastructure/InstallationManager.cs +++ b/Oqtane.Server/Infrastructure/InstallationManager.cs @@ -186,41 +186,45 @@ namespace Oqtane.Infrastructure public bool UninstallPackage(string PackageName) { - // get manifest with highest version - string packagename = ""; - string[] packages = Directory.GetFiles(Path.Combine(_environment.ContentRootPath, "Packages"), PackageName + "*.log"); - if (packages.Length > 0) + if (!string.IsNullOrEmpty(PackageName)) { - packagename = packages[packages.Length - 1]; // use highest version - } - - if (!string.IsNullOrEmpty(packagename)) - { - // use manifest to clean up file resources - List assets = JsonSerializer.Deserialize>(File.ReadAllText(packagename)); - assets.Reverse(); - foreach (string asset in assets) + // get manifest with highest version + string packagename = ""; + string[] packages = Directory.GetFiles(Path.Combine(_environment.ContentRootPath, "Packages"), PackageName + "*.log"); + if (packages.Length > 0) { - // legacy support for assets that were stored as absolute paths - string filepath = asset.StartsWith("\\") ? Path.Combine(_environment.ContentRootPath, asset.Substring(1)) : asset; - if (File.Exists(filepath)) + packagename = packages[packages.Length - 1]; // use highest version + } + + if (!string.IsNullOrEmpty(packagename)) + { + // use manifest to clean up file resources + List assets = JsonSerializer.Deserialize>(File.ReadAllText(packagename)); + assets.Reverse(); + foreach (string asset in assets) { - File.Delete(filepath); - if (!Directory.EnumerateFiles(Path.GetDirectoryName(filepath)).Any()) + // legacy support for assets that were stored as absolute paths + string filepath = asset.StartsWith("\\") ? Path.Combine(_environment.ContentRootPath, asset.Substring(1)) : asset; + if (File.Exists(filepath)) { - Directory.Delete(Path.GetDirectoryName(filepath)); + File.Delete(filepath); + if (!Directory.EnumerateFiles(Path.GetDirectoryName(filepath)).Any()) + { + Directory.Delete(Path.GetDirectoryName(filepath)); + } } } - } - // clean up package asset manifests - foreach(string asset in packages) - { - File.Delete(asset); - } + // clean up package asset manifests + foreach (string asset in packages) + { + File.Delete(asset); + } - return true; + return true; + } } + return false; } diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs index 62566b19..7086e4e9 100644 --- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs +++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs @@ -241,10 +241,6 @@ namespace Oqtane.Repository moduledefinition.ModuleDefinitionName = qualifiedModuleType; moduledefinition.ControlTypeTemplate = modulecontroltype.Namespace + "." + Constants.ActionToken + ", " + modulecontroltype.Assembly.GetName().Name; moduledefinition.AssemblyName = assembly.GetName().Name; - if (string.IsNullOrEmpty(moduledefinition.PackageName)) - { - moduledefinition.PackageName = Utilities.GetTypeName(moduledefinition.ModuleDefinitionName); - } if (string.IsNullOrEmpty(moduledefinition.Categories)) { diff --git a/Oqtane.Server/Repository/ThemeRepository.cs b/Oqtane.Server/Repository/ThemeRepository.cs index e5943cbe..1b3b4e77 100644 --- a/Oqtane.Server/Repository/ThemeRepository.cs +++ b/Oqtane.Server/Repository/ThemeRepository.cs @@ -101,10 +101,6 @@ namespace Oqtane.Repository theme.Themes = new List(); theme.Containers = new List(); theme.AssemblyName = assembly.FullName.Split(",")[0]; - if (string.IsNullOrEmpty(theme.PackageName)) - { - theme.PackageName = Utilities.GetTypeName(theme.ThemeName); - } Debug.WriteLine($"Oqtane Info: Registering Theme {theme.ThemeName}"); themes.Add(theme); diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs index af85489c..25e15558 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs @@ -12,7 +12,8 @@ namespace [Owner].[Module] Version = "1.0.0", ServerManagerType = "[ServerManagerType]", ReleaseVersions = "1.0.0", - Dependencies = "[Owner].[Module].Shared.Oqtane" + Dependencies = "[Owner].[Module].Shared.Oqtane", + PackageName = "[Owner].[Module]" }; } } diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs index 3f543b38..f2aa8771 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs @@ -8,7 +8,8 @@ namespace [Owner].[Theme] public Theme Theme => new Theme { Name = "[Theme]", - Version = "1.0.0" + Version = "1.0.0", + PackageName = "[Owner].[Theme]" }; }