From 312e319e2355ec2af9d40fb4742330ba32ed7afa Mon Sep 17 00:00:00 2001 From: Loretta Date: Sun, 12 Jul 2026 14:31:40 +0200 Subject: [PATCH] Add IsProdEnvironment SignalR endpoint and env flag setup Added IsProdEnvironment SignalR endpoint to FruitBankDataController for runtime environment checks. Set production status globally in PluginNopStartup via FruitBankConst.SetIsProd. Minor code and using updates. README.md binary updated. --- .../Controllers/FruitBankDataController.cs | 8 ++++++++ .../Infrastructure/PluginNopStartup.cs | 6 ++++-- .../docs/SIGNALR/README.md | Bin 7605 -> 9809 bytes 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index 88e5a1d..6128052 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -900,6 +900,14 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers return customers; //.ToModelDto(); } + [SignalR(SignalRTags.IsProdEnvironment)] + public Task IsProdEnvironment() + { + _logger.Detail("IsProdEnvironment invoked"); + + return Task.FromResult(FruitBankConst.IsProd()); + } + [SignalR(SignalRTags.GetCustomerRolesByCustomerId)] public async Task> GetCustomerRolesByCustomerId(int customerId) { diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs index ea55452..8227918 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -49,6 +49,7 @@ using AyCode.Services.Nav.Ekaer.Models; using FruitBank.Common.Services.Ekaer; using FruitBank.Common.Server.Services.Ekaer; using System.Security.Authentication; +using FruitBank.Common.Server; namespace Nop.Plugin.Misc.FruitBankPlugin.Infrastructure; @@ -302,8 +303,7 @@ public class PluginNopStartup : INopStartup var catalog = new SqlConnectionStringBuilder(connectionString).InitialCatalog; - var isDev = catalog.Contains("_DEV", StringComparison.OrdinalIgnoreCase) - || catalog.Contains("_TEST", StringComparison.OrdinalIgnoreCase); + var isDev = catalog.Contains("_DEV", StringComparison.OrdinalIgnoreCase) || catalog.Contains("_TEST", StringComparison.OrdinalIgnoreCase); var isProd = catalog.Contains("_PROD", StringComparison.OrdinalIgnoreCase); if (isProd == isDev) @@ -311,6 +311,8 @@ public class PluginNopStartup : INopStartup $"Database catalog '{catalog}' cannot be classified: isProd={isProd}, isDev={isDev}. " + "Fix the catalog naming or the detection rules — refusing to start with an ambiguous environment badge."); + FruitBankConst.SetIsProd(isProd); + try { if (!OperatingSystem.IsWindows()) return; diff --git a/Nop.Plugin.Misc.AIPlugin/docs/SIGNALR/README.md b/Nop.Plugin.Misc.AIPlugin/docs/SIGNALR/README.md index 30647815aba4ba0c02098fce4f175e0bb2fff004..7e6b4e41ec1988d6080f05c63b7abbd11f08f5ad 100644 GIT binary patch literal 9809 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 C9fP2B;bPhg`vxd6jOnjp22vThQhM(g?wNW19L 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 V{T8(WVu5XDoCJ}YVvcns{}1Jhs;B?}