From ee62a6253d9ab24ac9b3031164b8fc53948406ab Mon Sep 17 00:00:00 2001 From: Janusz Szczypka Date: Mon, 31 Aug 2026 19:56:59 +0000 Subject: [PATCH] Register Enova database from SQL connection string --- README.md | 6 +-- release/SmartB2B.Enova.Contracts.dll | Bin 19456 -> 19456 bytes release/SmartB2B.Enova.Contracts.pdb | Bin 13884 -> 13928 bytes release/SmartB2B.Enova.Service.dll | Bin 57856 -> 57856 bytes release/SmartB2B.Enova.Service.exe | Bin 152064 -> 152064 bytes release/SmartB2B.Enova.Service.pdb | Bin 27920 -> 27924 bytes release/adapters/SmartB2B.Enova.Adapter.dll | Bin 13312 -> 13824 bytes .../EnovaOrderAdapter.cs | 40 +++++++++++++----- .../EnovaContracts.cs | 3 +- .../Configuration/ServiceSettings.cs | 6 ++- tests/SmartB2B.Enova.Tests/Program.cs | 10 ++++- 11 files changed, 48 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 5bb691a..6b83847 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ Dedykowana usługa Windows zastępująca proces Node na stanowiskach z enova365. ## Konfiguracja -Plik `config/enova.json` zawiera portal WAMP, ścieżkę instalacji, alias bazy, operatora wraz z hasłem, connection string SQL, definicję dokumentu, magazyn domyślny, tryb zapisu oraz DSN Sentry. Repozytorium oraz paczka zawierają tylko `config/enova.json.sample`. Skrypt instalacyjny kopiuje wzorzec do `config/enova.json` wyłącznie wtedy, gdy lokalna konfiguracja jeszcze nie istnieje. +Plik `config/enova.json` zawiera portal WAMP, ścieżkę instalacji, alias bazy używany wewnątrz procesu, operatora wraz z hasłem, connection string SQL, definicję dokumentu, magazyn domyślny, tryb zapisu oraz DSN Sentry. Repozytorium oraz paczka zawierają tylko `config/enova.json.sample`. Skrypt instalacyjny kopiuje wzorzec do `config/enova.json` wyłącznie wtedy, gdy lokalna konfiguracja jeszcze nie istnieje. -Uzupełnij pola `enova.operator`, `enova.password` i `sql.connectionString` bezpośrednio w lokalnym pliku `config/enova.json`. Parametr `sentry.dsn` wskazuje projekt Sentry; pusty lub pominięty DSN wyłącza wysyłanie błędów. Jeżeli operator lub hasło Enovy nie są podane, usługa nie loguje się do bazy Enovy i nie rejestruje endpointu `eu.smartb2b.place_order`; endpoint SQL oraz diagnostyka pozostają dostępne. Po zmianie konfiguracji trzeba zrestartować usługę. Connection string powinien używać konta SQL o możliwie najmniejszych uprawnieniach; `sql_raw` celowo dopuszcza również polecenia modyfikujące dane dla zgodności z obecną usługą. +Uzupełnij pola `enova.operator`, `enova.password` i `sql.connectionString` bezpośrednio w lokalnym pliku `config/enova.json`. Adapter rejestruje bazę Enovy tylko w pamięci procesu na podstawie `sql.connectionString`; baza nie musi być wcześniej dodana do listy baz w profilu użytkownika Windows, a dane połączenia nie są przez usługę zapisywane w plikach Enovy. Pole `enova.database` jest nazwą tego wpisu w procesie i może odpowiadać nazwie bazy z connection stringa. Parametr `sentry.dsn` wskazuje projekt Sentry; pusty lub pominięty DSN wyłącza wysyłanie błędów. Jeżeli operator lub hasło Enovy nie są podane, usługa nie loguje się do bazy Enovy i nie rejestruje endpointu `eu.smartb2b.place_order`; endpoint SQL oraz diagnostyka pozostają dostępne. Po zmianie konfiguracji trzeba zrestartować usługę. Konto z `sql.connectionString` musi mieć uprawnienia wymagane do pracy Enovy oraz do zapytań `sql_raw`; `sql_raw` celowo dopuszcza również polecenia modyfikujące dane dla zgodności z obecną usługą. ## Budowanie i testy @@ -46,7 +46,7 @@ Skrypt odtwarza katalog `release` z hostem, adapterem, wzorcem konfiguracji i Wi 1. Skopiuj katalog `release` na komputer produkcyjny. Możesz skopiować `release/config/enova.json.sample` do `release/config/enova.json` i uzupełnić go przed instalacją; jeżeli tego nie zrobisz, `install.cmd` utworzy plik automatycznie. 2. Uzupełnij w `release/config/enova.json` hasło operatora i connection string SQL. 3. Zatrzymaj starą usługę Node dla tego samego portalu WAMP. -4. Skonfiguruj usługę do pracy pod dedykowanym kontem Windows, które potrafi uruchomić Enovę, widzi jej bazę i licencję. +4. Skonfiguruj usługę do pracy pod dedykowanym kontem Windows, które potrafi uruchomić Enovę i ma dostęp do jej licencji. Lista baz zapisana w profilu tego konta nie jest wymagana. 5. Jako administrator uruchom `release/daemon/install.cmd`. Jeżeli usługa ma działać pod innym kontem niż `LocalSystem`, po instalacji ustaw je w `services.msc` albo poleceniem administracyjnym `sc.exe config smartb2bsync-enova obj= "DOMENA\\Użytkownik" password= "..."`, a następnie uruchom usługę ponownie. diff --git a/release/SmartB2B.Enova.Contracts.dll b/release/SmartB2B.Enova.Contracts.dll index 07bae83f19497a43c207647130a5ddaa9d2f16bb..47d11f454cdbf5fc27b37346f65cf77956fa2e2a 100644 GIT binary patch literal 19456 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 delta 8041 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 L=~r5Rt^5B06sto< diff --git a/release/SmartB2B.Enova.Contracts.pdb b/release/SmartB2B.Enova.Contracts.pdb index 50a8c41a8f59e7161b22908f1748f940e0712001..01b0636375fd0b19dd07a33c8a41217adae02672 100644 GIT binary patch delta 1980 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 HhA;VlT{wm~ diff --git a/release/SmartB2B.Enova.Service.dll b/release/SmartB2B.Enova.Service.dll index b725bd9ecd2c5b2c34a88b05f6a3936b60eecf7f..df5e434f3c29795281e44dde8cc994f75a73edb8 100644 GIT binary patch delta 8782 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 diff --git a/release/SmartB2B.Enova.Service.exe b/release/SmartB2B.Enova.Service.exe index 17b3c97a5630e9eec7626f6cac82e9a079e2f17f..7414d8ca7deb260626179b031252e1757135ac97 100644 GIT binary patch delta 99 zcmZoz!r1^sEsR^3ruh1sG8i!=GgvaD0C5r!rvmvP+K3^I!I&WtC}$3&jex8q1{1KX dIfE%s!~zIGq!AFB0OiuaIt;fz_GOY~0RZoF5*Yvh delta 99 zcmZoz!r1^sEsR^3ruh0>FeCwC8iOT+0fQ-n84y|ku{n^R2BZyuyd)qt0FtIaF%yPl gpj;Y*5s)?nidX}q!OA&c3=lVj!2m%hC90#f32cKQKLkS!1u?Eh2pWVEvKK<) z@cc;^z+c}@__xV20 z^L_X1-LH=8%SZEIO|eB2OUTK=nT5x#Bd3HhQ`p> z=q9R8V_*;Z22G)9q;)V5jKWYfdIT*&$;g40qg7}fdLC^-)urv&Y|LA z3?pb1eT}|H|8bDhGjI>bkj?;y)JTVn>Ec=(j)_FKr!f;Yw@l1L9z}080|oBpl5{m} zrDJk27M$rUbkLfG*Kpj2-v48r?C}D>3^501ctI>3lbSq~(4HlOJ?LnbI0GPqQ&^v) zwG4)E{OJY^U!br4*hDrf;BdAAPGplY2k&KbFo-VFn#_@h6dunJ^V9BZ&5=SL9ZO&~ zext~Hy(U);WvJbym(|IbORhs+J2>Z*nS6buh($6uZ(-ohQU#7Vq(lrPBzt34p@-1J zbS@=Djd?cGARjvCwEAJzB7dZ#bDS*@a}b(?g6UkNO^?}tLdfTE9%4Xc55sIk;V6R6 zt+z*FjzZCBKApR3kHx$I#i4j4Lkw7iDW4d{-+UwRi*;29^$pE6Dzy?Re6BJm$jbo@ zi3TkPx0V^SO89LV_;au~6a1C%ugpmu2d&wYIwf>vLm&q~EQdfP7;+3j986(U0+(BW z;|y1quSsf99Q9vV-t$u8GmhTo7k8dqUN-9WoGRqo)*;n9pKqEmaIRbanQ~|3#;U&X z7F%Lj|I7zZ#vXk6?`;z&kMtyHHx7j?*-~%XQ&*(Ho8Bi(qz%WZFHa~Q=yxuTeD7-S z&eA6uN)zvxJ1W0_d)2m#FSaF@9CJLk{lQ{GckTV#XKSpv8T%id*EeT>rJ!l+>R;*H zdi1V*xZz4l`Hu%K1gGZ=nxfXSW#hME?V9UOUi-W2z^B)iI-WZJ!t|ZJiq4Ydr~i5I zw;fgS1vTAmqw)O}SN^NJA6LA0&Fr9uZ~ntHH~yv0+w-UN3w~W+v0`)8(9k;#LWSj< ziT6vpW@?=mU!Qh5iaR?3&g;J2@bAAA7QSn;Kh8~lSu&HwJ)su{^@40`lh8Ec$};py zWeZyKT0307hDy{r%a_U5;2?nCX?488em2QvD=`{RP4~L|78;CUTbYYsc9PIY!XXk) zkT5{PWfHClD_0(iBzr765+X==iiB(uHjuELg#8%ImtE1TRE)!u>*DsMDiVw&q>@ld zLJJ8;Ncfn9N#T{%_Y*z5VA2e>BtJw#IB9MXPCa|=Q4gC_=3+}q9O+ZJF67G@PaCZ% z*kdgsjg!K?H7g=Ld_wClLe<*bSPys8n`JE$X4d9;dOK`C;hAjr{&c$L0)wZoO1y*g z9cmHA3-UdEQhFQdr$KysTU=WTwM?#uuQE-8r%ekb_fi$41BP!}r1XPDa*#l}1oWJV zJ;^ej4-@NpcU|wU8%*MQLyWlI7%kR~aZYif z$tX@VMUlS~Rm~!AP_di6fmQj68`{Ff4Q;fO<=fp?Y>y%TM=HJzJ0vVCZr&XzZr)9g z!Seg&iS@n+alOlZysj|SO6=zNeevGl%f9S|1;ogKKcFQW=kRaHNRHtT(j3SiqInMg fCe1#456x=+u#C1YgIU;04iwBEbDdmY$T9GL7~8={ delta 2765 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 diff --git a/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs b/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs index a20e78c..d6cd4d9 100644 --- a/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs +++ b/src/SmartB2B.Enova.Adapter/EnovaOrderAdapter.cs @@ -18,18 +18,14 @@ public sealed class EnovaOrderAdapter : IEnovaOrderAdapter private static readonly object RuntimeLock = new(); private static bool _runtimeLoaded; private EnovaAdapterConfiguration? _configuration; + private Database? _database; public EnovaAdapterInfo Initialize(EnovaAdapterConfiguration configuration) { ValidateConfiguration(configuration); EnsureRuntimeLoaded(); - _ = BusApplication.Instance[configuration.Connection.DatabaseName] - ?? throw new EnovaOperationException( - "eu.smartb2b.erp.database_not_found", - $"Nie znaleziono zarejestrowanej bazy enova365 '{configuration.Connection.DatabaseName}'.", - new Dictionary { ["database"] = configuration.Connection.DatabaseName }); - + _database = RegisterDatabase(configuration.Connection); _configuration = configuration; return new EnovaAdapterInfo( @@ -43,6 +39,8 @@ public sealed class EnovaOrderAdapter : IEnovaOrderAdapter { var configuration = _configuration ?? throw new InvalidOperationException("Adapter Enovy nie został zainicjalizowany."); + var database = _database + ?? throw new InvalidOperationException("Połączenie z bazą Enovy nie zostało zainicjalizowane."); var errors = OrderValidator.Validate(request); if (errors.Count > 0) @@ -58,11 +56,6 @@ public sealed class EnovaOrderAdapter : IEnovaOrderAdapter var sessionState = SessionState.Create(); using var attachedSessionState = sessionState.Attach(); - var database = BusApplication.Instance[configuration.Connection.DatabaseName] - ?? throw new EnovaOperationException( - "eu.smartb2b.erp.database_not_found", - $"Nie znaleziono zarejestrowanej bazy enova365 '{configuration.Connection.DatabaseName}'."); - using var login = database.Login( winAuth: false, user: configuration.Connection.OperatorName, @@ -225,6 +218,26 @@ public sealed class EnovaOrderAdapter : IEnovaOrderAdapter } } + private static Database RegisterDatabase(EnovaConnectionOptions connection) + { + var application = BusApplication.Instance; + var existing = application[connection.DatabaseName, throwError: false]; + if (existing is not null) + { + application.Remove(existing, save: false); + } + + var database = new MsSqlDatabase + { + Name = connection.DatabaseName, + UseConnectionString = true, + ConnectionString = connection.SqlConnectionString + }; + + application.Add(database, save: false); + return database; + } + private static void ValidateConfiguration(EnovaAdapterConfiguration configuration) { var errors = new List(); @@ -238,6 +251,11 @@ public sealed class EnovaOrderAdapter : IEnovaOrderAdapter errors.Add("Nazwa operatora enova365 jest wymagana."); } + if (string.IsNullOrWhiteSpace(configuration.Connection.SqlConnectionString)) + { + errors.Add("Connection string SQL dla bazy Enovy jest wymagany."); + } + if (string.IsNullOrWhiteSpace(configuration.DocumentDefinition)) { errors.Add("Definicja dokumentu jest wymagana."); diff --git a/src/SmartB2B.Enova.Contracts/EnovaContracts.cs b/src/SmartB2B.Enova.Contracts/EnovaContracts.cs index ffcbefa..39b8c1c 100644 --- a/src/SmartB2B.Enova.Contracts/EnovaContracts.cs +++ b/src/SmartB2B.Enova.Contracts/EnovaContracts.cs @@ -9,7 +9,8 @@ public enum OrderSaveMode public sealed record EnovaConnectionOptions( string DatabaseName, string OperatorName, - string Password); + string Password, + string SqlConnectionString); public sealed record EnovaAdapterConfiguration( EnovaConnectionOptions Connection, diff --git a/src/SmartB2B.Enova.Service/Configuration/ServiceSettings.cs b/src/SmartB2B.Enova.Service/Configuration/ServiceSettings.cs index 28471ed..af3940c 100644 --- a/src/SmartB2B.Enova.Service/Configuration/ServiceSettings.cs +++ b/src/SmartB2B.Enova.Service/Configuration/ServiceSettings.cs @@ -57,7 +57,11 @@ public sealed class ServiceSettings if (!string.IsNullOrWhiteSpace(Enova.Operator) && Enova.Password is not null) { enovaConfiguration = new EnovaAdapterConfiguration( - new EnovaConnectionOptions(Enova.Database, Enova.Operator, Enova.Password), + new EnovaConnectionOptions( + Enova.Database, + Enova.Operator, + Enova.Password, + Sql.ConnectionString), Enova.DocumentDefinition, Enova.DefaultWarehouseCode, Enova.SaveMode); diff --git a/tests/SmartB2B.Enova.Tests/Program.cs b/tests/SmartB2B.Enova.Tests/Program.cs index 1f999bc..82da1a3 100644 --- a/tests/SmartB2B.Enova.Tests/Program.cs +++ b/tests/SmartB2B.Enova.Tests/Program.cs @@ -255,6 +255,10 @@ static Task SecretsComeFromConfigurationFile() "Server=db;Database=enova;User ID=user;Password=sql-z-pliku", runtime.SqlConnectionString, "connection string SQL"); + AssertEqual( + runtime.SqlConnectionString, + runtime.EnovaConfiguration?.Connection.SqlConnectionString, + "connection string rejestracji bazy Enovy"); return Task.CompletedTask; } finally @@ -321,7 +325,11 @@ static RpcInvocation CreateInvocation() => new( }); static EnovaAdapterConfiguration CreateConfiguration() => new( - new EnovaConnectionOptions("Firma demo", "Administrator", ""), + new EnovaConnectionOptions( + "Firma demo", + "Administrator", + "", + "Server=localhost;Database=enova;Integrated Security=true;TrustServerCertificate=true"), "ZO", null, OrderSaveMode.Buffer);