From 4656471a0a7313983f3935c7dd1fc286c35fe75a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 19 Mar 2025 14:37:36 -0400 Subject: [PATCH] add ability to Synchronize local modules and themes with Marketplace --- .../Admin/ModuleDefinitions/Edit.razor | 2 +- .../Admin/ModuleDefinitions/Index.razor | 195 ++++++++++-------- Oqtane.Client/Modules/Admin/Themes/Edit.razor | 2 +- .../Modules/Admin/Themes/Index.razor | 27 ++- .../Modules/Admin/ModuleDefinitions/Edit.resx | 8 +- .../Admin/ModuleDefinitions/Index.resx | 9 + .../Resources/Modules/Admin/Themes/Edit.resx | 8 +- .../Resources/Modules/Admin/Themes/Index.resx | 9 + .../Controllers/PackageController.cs | 31 ++- 9 files changed, 174 insertions(+), 117 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor index 803f2437..ef8bbc95 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor @@ -73,7 +73,7 @@
- +
diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 89b10381..fcfe6114 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -13,32 +13,32 @@ } else { -
-
-
- - @((MarkupString)" ") - -
-
- -
-
-
- - +
+
+
+ + + +
+
+ +
+
+
+ +
    @@ -61,17 +61,17 @@ else @context.Name @context.Version - @if (context.IsEnabled) - { - @SharedLocalizer["Yes"] - } - else - { - @SharedLocalizer["No"] - } + @if (context.IsEnabled) + { + @SharedLocalizer["Yes"] + } + else + { + @SharedLocalizer["No"] + } - @if (context.AssemblyName == Constants.ClientId || _modules.Where(m => m.ModuleDefinition?.ModuleDefinitionId == context.ModuleDefinitionId).FirstOrDefault() != null) + @if (context.AssemblyName == Constants.ClientId || _modules.Where(m => m.ModuleDefinition?.ModuleDefinitionId == context.ModuleDefinitionId).FirstOrDefault() != null) { @SharedLocalizer["Yes"] } @@ -87,9 +87,9 @@ else @((MarkupString)PurchaseLink(context.PackageName)) - @{ - var version = UpgradeAvailable(context.PackageName, context.Version); - } + @{ + var version = UpgradeAvailable(context.PackageName, context.Version); + } @if (version != context.Version) { @@ -153,10 +153,10 @@ else link = "" + package.ExpiryDate.Value.Date.ToString("MMM dd, yyyy") + ""; } } - } - } - return link; - } + } + } + return link; + } private string SupportLink(string packagename, string version) { @@ -172,52 +172,75 @@ else return link; } - private string UpgradeAvailable(string packagename, string version) - { - if (!string.IsNullOrEmpty(packagename) && _packages != null) - { - var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); - if (package != null && Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0) - { - return package.Version; - } - } - return version; - } + private string UpgradeAvailable(string packagename, string version) + { + if (!string.IsNullOrEmpty(packagename) && _packages != null) + { + var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); + if (package != null && Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0) + { + return package.Version; + } + } + return version; + } - private async Task DownloadModule(string packagename, string version) - { - try - { - await PackageService.DownloadPackageAsync(packagename, version); - await logger.LogInformation("Module Downloaded {ModuleDefinitionName} {Version}", packagename, version); - AddModuleMessage(string.Format(Localizer["Success.Module.Install"], NavigateUrl("admin/system")), MessageType.Success); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Downloading Module {ModuleDefinitionName} {Version} {Error}", packagename, version, ex.Message); - AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); - } - } + private async Task DownloadModule(string packagename, string version) + { + try + { + await PackageService.DownloadPackageAsync(packagename, version); + await logger.LogInformation("Module Downloaded {ModuleDefinitionName} {Version}", packagename, version); + AddModuleMessage(string.Format(Localizer["Success.Module.Install"], NavigateUrl("admin/system")), MessageType.Success); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Downloading Module {ModuleDefinitionName} {Version} {Error}", packagename, version, ex.Message); + AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); + } + } - private async Task DeleteModule(ModuleDefinition moduleDefinition) - { - try - { - await ModuleDefinitionService.DeleteModuleDefinitionAsync(moduleDefinition.ModuleDefinitionId, moduleDefinition.SiteId); - AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success); - NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true)); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Deleting Module {ModuleDefinition} {Error}", moduleDefinition, ex.Message); - AddModuleMessage(Localizer["Error.Module.Delete"], MessageType.Error); - } - } + private async Task DeleteModule(ModuleDefinition moduleDefinition) + { + try + { + await ModuleDefinitionService.DeleteModuleDefinitionAsync(moduleDefinition.ModuleDefinitionId, moduleDefinition.SiteId); + AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success); + NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true)); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Deleting Module {ModuleDefinition} {Error}", moduleDefinition, ex.Message); + AddModuleMessage(Localizer["Error.Module.Delete"], MessageType.Error); + } + } - private async Task CategoryChanged(ChangeEventArgs e) - { - _category = (string)e.Value; + private async Task CategoryChanged(ChangeEventArgs e) + { + _category = (string)e.Value; await LoadModuleDefinitions(); - } + } + + private async Task Synchronize() + { + try + { + ShowProgressIndicator(); + foreach (var moduleDefinition in _moduleDefinitions) + { + if (!string.IsNullOrEmpty(moduleDefinition.PackageName) && !_packages.Any(item => item.PackageId == moduleDefinition.PackageName)) + { + var package = await PackageService.GetPackageAsync(moduleDefinition.PackageName, moduleDefinition.Version, false); + } + } + HideProgressIndicator(); + AddModuleMessage(Localizer["Success.Module.Synchronize"], MessageType.Success); + NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true)); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Synchronizing Modules {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Module.Synchronize"], MessageType.Error); + } + } } diff --git a/Oqtane.Client/Modules/Admin/Themes/Edit.razor b/Oqtane.Client/Modules/Admin/Themes/Edit.razor index ed324ebf..125e2846 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Edit.razor @@ -55,7 +55,7 @@
- +
diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index b6b25345..2d8f83a8 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -15,8 +15,8 @@ else { - @((MarkupString)" ") - + +
@@ -173,4 +173,27 @@ else AddModuleMessage(Localizer["Error.Theme.Delete"], MessageType.Error); } } + + private async Task Synchronize() + { + try + { + ShowProgressIndicator(); + foreach (var theme in _themes) + { + if (!string.IsNullOrEmpty(theme.PackageName) && !_packages.Any(item => item.PackageId == theme.PackageName)) + { + await PackageService.GetPackageAsync(theme.PackageName, theme.Version, false); + } + } + HideProgressIndicator(); + AddModuleMessage(Localizer["Success.Theme.Synchronize"], MessageType.Success); + NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true)); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Synchronizing Themes {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Theme.Synchronize"], MessageType.Error); + } + } } \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx index 186fdd65..4421b90a 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx @@ -147,8 +147,8 @@ The owner or creator of the module - - The reference url of the module + + The url of the module The contact for the module @@ -171,8 +171,8 @@ Owner: - - Reference Url: + + Url: Contact: diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx index ce91ee3b..90ffbe18 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx @@ -159,4 +159,13 @@ Enabled? + + Synchronize + + + Modules Have Been Successfully Synchronized With The Marketplace + + + Error Synchronizing Modules With The Marketplace + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Themes/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Themes/Edit.resx index c18f9761..69f9bdd8 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Themes/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Themes/Edit.resx @@ -132,8 +132,8 @@ Owner: - - Reference Url: + + Url: Contact: @@ -153,8 +153,8 @@ The owner or creator of the theme - - The reference url of the theme + + The url of the theme The contact for the theme diff --git a/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx index 7ff1b618..4edc516c 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx @@ -159,4 +159,13 @@ Assign + + Synchronize + + + Themes Have Been Successfully Synchronized With The Marketplace + + + Error Synchronizing Themes With The Marketplace + \ No newline at end of file diff --git a/Oqtane.Server/Controllers/PackageController.cs b/Oqtane.Server/Controllers/PackageController.cs index c0b943bc..eb678a3b 100644 --- a/Oqtane.Server/Controllers/PackageController.cs +++ b/Oqtane.Server/Controllers/PackageController.cs @@ -90,33 +90,26 @@ namespace Oqtane.Controllers package = await GetJson(client, url + $"/api/registry/package/?id={_configManager.GetInstallationId()}&package={packageid}&version={version}&download={download}&email={WebUtility.UrlEncode(GetPackageRegistryEmail())}"); } - if (package != null) + if (package != null && bool.Parse(install)) { - if (bool.Parse(install)) + using (var httpClient = new HttpClient()) { - using (var httpClient = new HttpClient()) + var folder = Path.Combine(_environment.ContentRootPath, Constants.PackagesFolder); + var response = await httpClient.GetAsync(package.PackageUrl).ConfigureAwait(false); + if (response.IsSuccessStatusCode) { - var folder = Path.Combine(_environment.ContentRootPath, Constants.PackagesFolder); - var response = await httpClient.GetAsync(package.PackageUrl).ConfigureAwait(false); - if (response.IsSuccessStatusCode) + string filename = packageid + "." + version + ".nupkg"; + using (var fileStream = new FileStream(Path.Combine(Constants.PackagesFolder, filename), FileMode.Create, FileAccess.Write, FileShare.None)) { - string filename = packageid + "." + version + ".nupkg"; - using (var fileStream = new FileStream(Path.Combine(Constants.PackagesFolder, filename), FileMode.Create, FileAccess.Write, FileShare.None)) - { - await response.Content.CopyToAsync(fileStream).ConfigureAwait(false); - } - } - else - { - _logger.Log(LogLevel.Error, this, LogFunction.Create, "Could Not Download {PackageUrl}", package.PackageUrl); + await response.Content.CopyToAsync(fileStream).ConfigureAwait(false); } } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Create, "Could Not Download {PackageUrl}", package.PackageUrl); + } } } - else - { - _logger.Log(LogLevel.Error, this, LogFunction.Create, "Package {PackageId}.{Version} Is Not Registered In The Marketplace", packageid, version); - } } return package; }