emilsoftware-utilities 2.0.0-dev.24 → 2.0.0-dev.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.MD +185 -182
- package/dist/ContractGenerator.js.map +1 -1
- package/dist/DailyFileTransport.js.map +1 -1
- package/dist/DatabaseUpdater.js +24 -24
- package/dist/DatabaseUpdater.js.map +1 -1
- package/dist/EmilsoftwareModule.js.map +1 -1
- package/dist/ExecutionTimeLogger.js.map +1 -1
- package/dist/Orm.js.map +1 -1
- package/dist/RoutesLoggerMiddleware.js.map +1 -1
- package/dist/Utilities.js.map +1 -1
- package/dist/accessi-module/AccessiModule.js.map +1 -1
- package/dist/accessi-module/Console/console.js.map +1 -1
- package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
- package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
- package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
- package/dist/accessi-module/Controllers/UserController.js.map +1 -1
- package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
- package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
- package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
- package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/Permission.js.map +1 -1
- package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/Role.js.map +1 -1
- package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
- package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
- package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
- package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
- package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
- package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
- package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
- package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
- package/dist/accessi-module/Dtos/index.js.map +1 -1
- package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
- package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
- package/dist/accessi-module/Services/EmailService/EmailService.js +11 -11
- package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
- package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
- package/dist/accessi-module/Services/PermissionService/PermissionService.js +118 -118
- package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
- package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js +4 -4
- package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +1 -1
- package/dist/accessi-module/Services/UserService/UserService.js +72 -72
- package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
- package/dist/accessi-module/Views/reset-password.html +213 -213
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +1 -0
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +56 -42
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
- package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
- package/dist/accessi-module/index.js.map +1 -1
- package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
- package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
- package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
- package/dist/accessi-module/security/accessControl.js.map +1 -1
- package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
- package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
- package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
- package/dist/allegati-module/AllegatiModule.js.map +1 -1
- package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
- package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
- package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
- package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
- package/dist/allegati-module/Dtos/index.js.map +1 -1
- package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
- package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
- package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
- package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +49 -49
- package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
- package/dist/allegati-module/index.js.map +1 -1
- package/dist/autobind.js.map +1 -1
- package/dist/emilsoftware-utilities-2.0.0-dev.25.tgz +0 -0
- package/dist/firebird-compat.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/initEmilsoftwareModule.js.map +1 -1
- package/dist/swagger/SwaggerConfig.js.map +1 -1
- package/package.json +103 -103
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuIcona.d.ts +0 -12
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuIcona.js +0 -9
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuIcona.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuNote.d.ts +0 -12
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuNote.js +0 -9
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuNote.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuPagina.d.ts +0 -12
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuPagina.js +0 -9
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuPagina.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipo.d.ts +0 -12
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipo.js +0 -9
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipo.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/publicRegisterRequestCellulare.d.ts +0 -13
- package/dist/accessi-module/Console/generated/model/publicRegisterRequestCellulare.js +0 -9
- package/dist/accessi-module/Console/generated/model/publicRegisterRequestCellulare.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/registerRequestCellulare.d.ts +0 -13
- package/dist/accessi-module/Console/generated/model/registerRequestCellulare.js +0 -9
- package/dist/accessi-module/Console/generated/model/registerRequestCellulare.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/userDtoAvatar.d.ts +0 -13
- package/dist/accessi-module/Console/generated/model/userDtoAvatar.js +0 -9
- package/dist/accessi-module/Console/generated/model/userDtoAvatar.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/userDtoCellulare.d.ts +0 -13
- package/dist/accessi-module/Console/generated/model/userDtoCellulare.js +0 -9
- package/dist/accessi-module/Console/generated/model/userDtoCellulare.js.map +0 -1
- package/dist/accessi-module/Console/openApiClient.d.ts +0 -34
- package/dist/accessi-module/Console/openApiClient.js +0 -111
- package/dist/accessi-module/Console/openApiClient.js.map +0 -1
package/dist/DatabaseUpdater.js
CHANGED
|
@@ -24,10 +24,10 @@ class DatabaseUpdater {
|
|
|
24
24
|
static tableExists(options, table) {
|
|
25
25
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26
26
|
try {
|
|
27
|
-
const query = `
|
|
28
|
-
SELECT 1
|
|
29
|
-
FROM RDB$RELATIONS
|
|
30
|
-
WHERE RDB$RELATION_NAME = ?
|
|
27
|
+
const query = `
|
|
28
|
+
SELECT 1
|
|
29
|
+
FROM RDB$RELATIONS
|
|
30
|
+
WHERE RDB$RELATION_NAME = ?
|
|
31
31
|
AND COALESCE(RDB$SYSTEM_FLAG, 0) = 0`;
|
|
32
32
|
const result = yield Orm_1.Orm.query(options, query, [table.toUpperCase()]);
|
|
33
33
|
return result.length > 0;
|
|
@@ -48,10 +48,10 @@ class DatabaseUpdater {
|
|
|
48
48
|
static columnExists(options, table, column) {
|
|
49
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
50
|
try {
|
|
51
|
-
const query = `
|
|
52
|
-
SELECT 1
|
|
53
|
-
FROM RDB$RELATION_FIELDS
|
|
54
|
-
WHERE RDB$RELATION_NAME = ?
|
|
51
|
+
const query = `
|
|
52
|
+
SELECT 1
|
|
53
|
+
FROM RDB$RELATION_FIELDS
|
|
54
|
+
WHERE RDB$RELATION_NAME = ?
|
|
55
55
|
AND RDB$FIELD_NAME = ?`;
|
|
56
56
|
const result = yield Orm_1.Orm.query(options, query, [
|
|
57
57
|
table.toUpperCase(),
|
|
@@ -74,9 +74,9 @@ class DatabaseUpdater {
|
|
|
74
74
|
static generatorExists(options, generator) {
|
|
75
75
|
return __awaiter(this, void 0, void 0, function* () {
|
|
76
76
|
try {
|
|
77
|
-
const query = `
|
|
78
|
-
SELECT 1
|
|
79
|
-
FROM RDB$GENERATORS
|
|
77
|
+
const query = `
|
|
78
|
+
SELECT 1
|
|
79
|
+
FROM RDB$GENERATORS
|
|
80
80
|
WHERE RDB$GENERATOR_NAME = ?`;
|
|
81
81
|
const result = yield Orm_1.Orm.query(options, query, [generator.toUpperCase()]);
|
|
82
82
|
return result.length > 0;
|
|
@@ -96,10 +96,10 @@ class DatabaseUpdater {
|
|
|
96
96
|
static triggerExists(options, trigger) {
|
|
97
97
|
return __awaiter(this, void 0, void 0, function* () {
|
|
98
98
|
try {
|
|
99
|
-
const query = `
|
|
100
|
-
SELECT 1
|
|
101
|
-
FROM RDB$TRIGGERS
|
|
102
|
-
WHERE RDB$TRIGGER_NAME = ?
|
|
99
|
+
const query = `
|
|
100
|
+
SELECT 1
|
|
101
|
+
FROM RDB$TRIGGERS
|
|
102
|
+
WHERE RDB$TRIGGER_NAME = ?
|
|
103
103
|
AND COALESCE(RDB$SYSTEM_FLAG, 0) = 0`;
|
|
104
104
|
const result = yield Orm_1.Orm.query(options, query, [trigger.toUpperCase()]);
|
|
105
105
|
return result.length > 0;
|
|
@@ -122,9 +122,9 @@ class DatabaseUpdater {
|
|
|
122
122
|
if (!(yield this.tableExists(options, "PARAMETRI"))) {
|
|
123
123
|
return null;
|
|
124
124
|
}
|
|
125
|
-
const parameters = (yield Orm_1.Orm.query(options, `SELECT CODPAR, DESPAR
|
|
126
|
-
FROM PARAMETRI
|
|
127
|
-
WHERE CODPAR IN (?, ?)
|
|
125
|
+
const parameters = (yield Orm_1.Orm.query(options, `SELECT CODPAR, DESPAR
|
|
126
|
+
FROM PARAMETRI
|
|
127
|
+
WHERE CODPAR IN (?, ?)
|
|
128
128
|
ORDER BY CASE WHEN CODPAR = ? THEN 0 ELSE 1 END`, [
|
|
129
129
|
this.versionParameterKeys[0],
|
|
130
130
|
this.versionParameterKeys[1],
|
|
@@ -183,12 +183,12 @@ class DatabaseUpdater {
|
|
|
183
183
|
try {
|
|
184
184
|
const tableAlreadyExists = yield this.tableExists(options, "PARAMETRI");
|
|
185
185
|
if (!tableAlreadyExists) {
|
|
186
|
-
const createTableQuery = `
|
|
187
|
-
CREATE TABLE PARAMETRI (
|
|
188
|
-
CODPAR VARCHAR(15) NOT NULL,
|
|
189
|
-
DESPAR VARCHAR(255),
|
|
190
|
-
NOTE BLOB SUB_TYPE 1 SEGMENT SIZE 80,
|
|
191
|
-
GRUPPO VARCHAR(20)
|
|
186
|
+
const createTableQuery = `
|
|
187
|
+
CREATE TABLE PARAMETRI (
|
|
188
|
+
CODPAR VARCHAR(15) NOT NULL,
|
|
189
|
+
DESPAR VARCHAR(255),
|
|
190
|
+
NOTE BLOB SUB_TYPE 1 SEGMENT SIZE 80,
|
|
191
|
+
GRUPPO VARCHAR(20)
|
|
192
192
|
);`;
|
|
193
193
|
yield Orm_1.Orm.query(options, createTableQuery);
|
|
194
194
|
yield Orm_1.Orm.query(options, "ALTER TABLE PARAMETRI ADD CONSTRAINT PK_PARAMETRI PRIMARY KEY (CODPAR);");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseUpdater.js","sourceRoot":"","sources":["../src/DatabaseUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Orm } from \"./Orm\";\r\nimport { Logger } from \"./Logger\";\r\nimport { Options } from \"node-firebird\";\r\n\r\nexport abstract class DatabaseUpdater {\r\n //#region Fields and Options\r\n protected static options: Options;\r\n protected static logger: Logger = new Logger(DatabaseUpdater.name);\r\n protected static readonly versionParameterKeys = [\"VersioneDB\", \"DBVERSION\"];\r\n //#endregion\r\n\r\n //#region Utility Methods\r\n /**\r\n * Checks if a table exists.\r\n * @param options Database connection options.\r\n * @param table Table name.\r\n * @returns True if the table exists, false otherwise.\r\n */\r\n protected static async tableExists(\r\n options: Options,\r\n table: string\r\n ): Promise<boolean> {\r\n\r\n try {\r\n const query = `\r\n SELECT 1\r\n FROM RDB$RELATIONS\r\n WHERE RDB$RELATION_NAME = ?\r\n AND COALESCE(RDB$SYSTEM_FLAG, 0) = 0`;\r\n const result = await Orm.query(options, query, [table.toUpperCase()]);\r\n return result.length > 0;\r\n } catch (error) {\r\n this.logger.error(`Error checking table ${table}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a column exists in a specific table.\r\n * @param options Database connection options.\r\n * @param table Table name.\r\n * @param column Column name.\r\n * @returns True if the column exists, false otherwise.\r\n */\r\n protected static async columnExists(\r\n options: Options,\r\n table: string,\r\n column: string\r\n ): Promise<boolean> {\r\n\r\n try {\r\n const query = `\r\n SELECT 1 \r\n FROM RDB$RELATION_FIELDS \r\n WHERE RDB$RELATION_NAME = ? \r\n AND RDB$FIELD_NAME = ?`;\r\n const result = await Orm.query(options, query, [\r\n table.toUpperCase(),\r\n column.toUpperCase(),\r\n ]);\r\n return result.length > 0;\r\n } catch (error) {\r\n this.logger.error(`Error checking column ${column} on table ${table}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a generator/sequence exists.\r\n * @param options Database connection options.\r\n * @param generator Generator name.\r\n * @returns True if the generator exists, false otherwise.\r\n */\r\n protected static async generatorExists(\r\n options: Options,\r\n generator: string\r\n ): Promise<boolean> {\r\n\r\n try {\r\n const query = `\r\n SELECT 1\r\n FROM RDB$GENERATORS\r\n WHERE RDB$GENERATOR_NAME = ?`;\r\n const result = await Orm.query(options, query, [generator.toUpperCase()]);\r\n return result.length > 0;\r\n } catch (error) {\r\n this.logger.error(`Error checking generator ${generator}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a trigger exists.\r\n * @param options Database connection options.\r\n * @param trigger Trigger name.\r\n * @returns True if the trigger exists, false otherwise.\r\n */\r\n protected static async triggerExists(\r\n options: Options,\r\n trigger: string\r\n ): Promise<boolean> {\r\n\r\n try {\r\n const query = `\r\n SELECT 1\r\n FROM RDB$TRIGGERS\r\n WHERE RDB$TRIGGER_NAME = ?\r\n AND COALESCE(RDB$SYSTEM_FLAG, 0) = 0`;\r\n const result = await Orm.query(options, query, [trigger.toUpperCase()]);\r\n return result.length > 0;\r\n } catch (error) {\r\n this.logger.error(`Error checking trigger ${trigger}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves the current database version from the PARAMETRI table.\r\n * @param options Database connection options.\r\n * @returns The current database version or null if not found.\r\n */\r\n protected static async getDatabaseVersion(options: Options): Promise<string | null> {\r\n\r\n try {\r\n if (!(await this.tableExists(options, \"PARAMETRI\"))) {\r\n return null;\r\n }\r\n\r\n const parameters = (await Orm.query(\r\n options,\r\n `SELECT CODPAR, DESPAR\r\n FROM PARAMETRI\r\n WHERE CODPAR IN (?, ?)\r\n ORDER BY CASE WHEN CODPAR = ? THEN 0 ELSE 1 END`,\r\n [\r\n this.versionParameterKeys[0],\r\n this.versionParameterKeys[1],\r\n this.versionParameterKeys[0],\r\n ]\r\n ));\r\n\r\n if (parameters.length === 0) {\r\n return null;\r\n }\r\n\r\n const rawVersion = parameters[0]?.DESPAR;\r\n return typeof rawVersion === \"string\" ? rawVersion : rawVersion == null ? null : String(rawVersion);\r\n } catch (error) {\r\n this.logger.error(`Error getting database version:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Updates the database version in the PARAMETRI table.\r\n * @param options Database connection options.\r\n * @param version The new database version.\r\n */\r\n protected static async setDatabaseVersion(\r\n options: Options,\r\n version: string\r\n ): Promise<void> {\r\n\r\n try {\r\n if (!(await this.tableExists(options, \"PARAMETRI\"))) {\r\n await this.createParametersTable(options);\r\n }\r\n\r\n const existingRows = (await Orm.query(\r\n options,\r\n \"SELECT CODPAR FROM PARAMETRI WHERE CODPAR IN (?, ?)\",\r\n [this.versionParameterKeys[0], this.versionParameterKeys[1]]\r\n ));\r\n\r\n if (existingRows.length === 0) {\r\n await Orm.execute(\r\n options,\r\n \"INSERT INTO PARAMETRI (CODPAR, DESPAR, NOTE, GRUPPO) VALUES (?, ?, ?, ?)\",\r\n [this.versionParameterKeys[0], version, \"versione\", null]\r\n );\r\n return;\r\n }\r\n\r\n for (const row of existingRows) {\r\n await Orm.execute(options, \"UPDATE PARAMETRI SET DESPAR = ? WHERE CODPAR = ?\", [\r\n version,\r\n String(row.CODPAR ?? \"\").trim(),\r\n ]);\r\n }\r\n } catch (error) {\r\n this.logger.error(`Error setting database version:`, error);\r\n throw error;\r\n }\r\n }\r\n //#endregion\r\n\r\n //#region Initialization Methods\r\n /**\r\n * Ensures the PARAMETRI table exists and initializes it if necessary.\r\n * @param options Database connection options.\r\n */\r\n protected static async createParametersTable(options: Options): Promise<void> {\r\n try {\r\n const tableAlreadyExists = await this.tableExists(options, \"PARAMETRI\");\r\n if (!tableAlreadyExists) {\r\n const createTableQuery = `\r\n CREATE TABLE PARAMETRI (\r\n CODPAR VARCHAR(15) NOT NULL,\r\n DESPAR VARCHAR(255),\r\n NOTE BLOB SUB_TYPE 1 SEGMENT SIZE 80,\r\n GRUPPO VARCHAR(20)\r\n );`;\r\n\r\n await Orm.query(options, createTableQuery);\r\n\r\n await Orm.query(\r\n options,\r\n \"ALTER TABLE PARAMETRI ADD CONSTRAINT PK_PARAMETRI PRIMARY KEY (CODPAR);\"\r\n );\r\n }\r\n\r\n const versioneDb = await this.getDatabaseVersion(options);\r\n if (versioneDb !== null && versioneDb !== undefined) {\r\n return;\r\n }\r\n\r\n await Orm.execute(\r\n options,\r\n \"INSERT INTO PARAMETRI (CODPAR, DESPAR, NOTE, GRUPPO) VALUES (?,?,?,?)\",\r\n [this.versionParameterKeys[0], \"0.0a\", \"versione\", null]\r\n );\r\n } catch (error) {\r\n this.logger.error(\"Error creating table PARAMETRI:\", error);\r\n throw error;\r\n }\r\n\r\n\r\n }\r\n //#endregion\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"DatabaseUpdater.js","sourceRoot":"","sources":["../src/DatabaseUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Orm } from \"./Orm\";\nimport { Logger } from \"./Logger\";\nimport { Options } from \"node-firebird\";\n\nexport abstract class DatabaseUpdater {\n //#region Fields and Options\n protected static options: Options;\n protected static logger: Logger = new Logger(DatabaseUpdater.name);\n protected static readonly versionParameterKeys = [\"VersioneDB\", \"DBVERSION\"];\n //#endregion\n\n //#region Utility Methods\n /**\n * Checks if a table exists.\n * @param options Database connection options.\n * @param table Table name.\n * @returns True if the table exists, false otherwise.\n */\n protected static async tableExists(\n options: Options,\n table: string\n ): Promise<boolean> {\n\n try {\n const query = `\n SELECT 1\n FROM RDB$RELATIONS\n WHERE RDB$RELATION_NAME = ?\n AND COALESCE(RDB$SYSTEM_FLAG, 0) = 0`;\n const result = await Orm.query(options, query, [table.toUpperCase()]);\n return result.length > 0;\n } catch (error) {\n this.logger.error(`Error checking table ${table}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if a column exists in a specific table.\n * @param options Database connection options.\n * @param table Table name.\n * @param column Column name.\n * @returns True if the column exists, false otherwise.\n */\n protected static async columnExists(\n options: Options,\n table: string,\n column: string\n ): Promise<boolean> {\n\n try {\n const query = `\n SELECT 1 \n FROM RDB$RELATION_FIELDS \n WHERE RDB$RELATION_NAME = ? \n AND RDB$FIELD_NAME = ?`;\n const result = await Orm.query(options, query, [\n table.toUpperCase(),\n column.toUpperCase(),\n ]);\n return result.length > 0;\n } catch (error) {\n this.logger.error(`Error checking column ${column} on table ${table}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if a generator/sequence exists.\n * @param options Database connection options.\n * @param generator Generator name.\n * @returns True if the generator exists, false otherwise.\n */\n protected static async generatorExists(\n options: Options,\n generator: string\n ): Promise<boolean> {\n\n try {\n const query = `\n SELECT 1\n FROM RDB$GENERATORS\n WHERE RDB$GENERATOR_NAME = ?`;\n const result = await Orm.query(options, query, [generator.toUpperCase()]);\n return result.length > 0;\n } catch (error) {\n this.logger.error(`Error checking generator ${generator}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if a trigger exists.\n * @param options Database connection options.\n * @param trigger Trigger name.\n * @returns True if the trigger exists, false otherwise.\n */\n protected static async triggerExists(\n options: Options,\n trigger: string\n ): Promise<boolean> {\n\n try {\n const query = `\n SELECT 1\n FROM RDB$TRIGGERS\n WHERE RDB$TRIGGER_NAME = ?\n AND COALESCE(RDB$SYSTEM_FLAG, 0) = 0`;\n const result = await Orm.query(options, query, [trigger.toUpperCase()]);\n return result.length > 0;\n } catch (error) {\n this.logger.error(`Error checking trigger ${trigger}:`, error);\n throw error;\n }\n }\n\n /**\n * Retrieves the current database version from the PARAMETRI table.\n * @param options Database connection options.\n * @returns The current database version or null if not found.\n */\n protected static async getDatabaseVersion(options: Options): Promise<string | null> {\n\n try {\n if (!(await this.tableExists(options, \"PARAMETRI\"))) {\n return null;\n }\n\n const parameters = (await Orm.query(\n options,\n `SELECT CODPAR, DESPAR\n FROM PARAMETRI\n WHERE CODPAR IN (?, ?)\n ORDER BY CASE WHEN CODPAR = ? THEN 0 ELSE 1 END`,\n [\n this.versionParameterKeys[0],\n this.versionParameterKeys[1],\n this.versionParameterKeys[0],\n ]\n ));\n\n if (parameters.length === 0) {\n return null;\n }\n\n const rawVersion = parameters[0]?.DESPAR;\n return typeof rawVersion === \"string\" ? rawVersion : rawVersion == null ? null : String(rawVersion);\n } catch (error) {\n this.logger.error(`Error getting database version:`, error);\n throw error;\n }\n }\n\n /**\n * Updates the database version in the PARAMETRI table.\n * @param options Database connection options.\n * @param version The new database version.\n */\n protected static async setDatabaseVersion(\n options: Options,\n version: string\n ): Promise<void> {\n\n try {\n if (!(await this.tableExists(options, \"PARAMETRI\"))) {\n await this.createParametersTable(options);\n }\n\n const existingRows = (await Orm.query(\n options,\n \"SELECT CODPAR FROM PARAMETRI WHERE CODPAR IN (?, ?)\",\n [this.versionParameterKeys[0], this.versionParameterKeys[1]]\n ));\n\n if (existingRows.length === 0) {\n await Orm.execute(\n options,\n \"INSERT INTO PARAMETRI (CODPAR, DESPAR, NOTE, GRUPPO) VALUES (?, ?, ?, ?)\",\n [this.versionParameterKeys[0], version, \"versione\", null]\n );\n return;\n }\n\n for (const row of existingRows) {\n await Orm.execute(options, \"UPDATE PARAMETRI SET DESPAR = ? WHERE CODPAR = ?\", [\n version,\n String(row.CODPAR ?? \"\").trim(),\n ]);\n }\n } catch (error) {\n this.logger.error(`Error setting database version:`, error);\n throw error;\n }\n }\n //#endregion\n\n //#region Initialization Methods\n /**\n * Ensures the PARAMETRI table exists and initializes it if necessary.\n * @param options Database connection options.\n */\n protected static async createParametersTable(options: Options): Promise<void> {\n try {\n const tableAlreadyExists = await this.tableExists(options, \"PARAMETRI\");\n if (!tableAlreadyExists) {\n const createTableQuery = `\n CREATE TABLE PARAMETRI (\n CODPAR VARCHAR(15) NOT NULL,\n DESPAR VARCHAR(255),\n NOTE BLOB SUB_TYPE 1 SEGMENT SIZE 80,\n GRUPPO VARCHAR(20)\n );`;\n\n await Orm.query(options, createTableQuery);\n\n await Orm.query(\n options,\n \"ALTER TABLE PARAMETRI ADD CONSTRAINT PK_PARAMETRI PRIMARY KEY (CODPAR);\"\n );\n }\n\n const versioneDb = await this.getDatabaseVersion(options);\n if (versioneDb !== null && versioneDb !== undefined) {\n return;\n }\n\n await Orm.execute(\n options,\n \"INSERT INTO PARAMETRI (CODPAR, DESPAR, NOTE, GRUPPO) VALUES (?,?,?,?)\",\n [this.versionParameterKeys[0], \"0.0a\", \"versione\", null]\n );\n } catch (error) {\n this.logger.error(\"Error creating table PARAMETRI:\", error);\n throw error;\n }\n\n\n }\n //#endregion\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmilsoftwareModule.js","sourceRoot":"","sources":["../src/EmilsoftwareModule.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,kEAA+E;AAC/E,qEAAmF;AACnF,qCAAkC;AAUlC;;;GAGG;AAEI,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAC3B,MAAM,CAAC,OAAO,CAAC,OAA4B;QAEvC,MAAM,MAAM,GAAW,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC5F,CAAC;QAGD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,6BAAa,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,6BAAa,CAAC,CAAC;QAChC,CAAC;aACI,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,+BAAc,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,+BAAc,CAAC,CAAC;QACjC,CAAC;aACI,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC;QACjG,CAAC;QAED,OAAO;YACH,MAAM,EAAE,oBAAkB;YAC1B,OAAO;YACP,OAAO;SACV,CAAC;IACN,CAAC;CACJ,CAAA;AApCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,kBAAkB,CAoC9B","sourcesContent":["import { DynamicModule, Module } from \"@nestjs/common\";\
|
|
1
|
+
{"version":3,"file":"EmilsoftwareModule.js","sourceRoot":"","sources":["../src/EmilsoftwareModule.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,kEAA+E;AAC/E,qEAAmF;AACnF,qCAAkC;AAUlC;;;GAGG;AAEI,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAC3B,MAAM,CAAC,OAAO,CAAC,OAA4B;QAEvC,MAAM,MAAM,GAAW,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC5F,CAAC;QAGD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,6BAAa,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,6BAAa,CAAC,CAAC;QAChC,CAAC;aACI,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,+BAAc,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,+BAAc,CAAC,CAAC;QACjC,CAAC;aACI,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC;QACjG,CAAC;QAED,OAAO;YACH,MAAM,EAAE,oBAAkB;YAC1B,OAAO;YACP,OAAO;SACV,CAAC;IACN,CAAC;CACJ,CAAA;AApCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,kBAAkB,CAoC9B","sourcesContent":["import { DynamicModule, Module } from \"@nestjs/common\";\nimport { AccessiModule, AccessiOptions } from \"./accessi-module/AccessiModule\";\nimport { AllegatiModule, AllegatiOptions } from \"./allegati-module/AllegatiModule\";\nimport { Logger } from \"./Logger\";\n\n/**\n * Configuration options for the unified module that combines Accessi and Allegati functionality\n */\nexport interface EmilsoftwareOptions {\n accessiOptions: AccessiOptions;\n allegatiOptions: AllegatiOptions;\n}\n\n/**\n * Unified module that combines user access management (Accessi) and file attachment management (Allegati)\n * into a single NestJS module with shared Swagger documentation\n */\n@Module({})\nexport class EmilsoftwareModule {\n static forRoot(options: EmilsoftwareOptions): DynamicModule {\n\n const logger: Logger = new Logger(EmilsoftwareModule.name);\n let imports = [];\n let exports = [];\n\n if (!options) {\n throw new Error(\"EmilsoftwareModule requires valid accessiOptions and allegatiOptions\");\n }\n\n\n if (options.accessiOptions) {\n logger.info(\"Initializing AccessiModule with provided options.\");\n imports.push(AccessiModule.forRoot(options.accessiOptions));\n exports.push(AccessiModule);\n }\n else {\n logger.warning(\"Accessi options are not provided. AccessiModule will not be initialized.\");\n }\n\n if (options.allegatiOptions) {\n logger.info(\"Initializing AllegatiModule with provided options.\");\n imports.push(AllegatiModule.forRoot(options.allegatiOptions));\n exports.push(AllegatiModule);\n }\n else {\n logger.warning(\"Allegati options are not provided. AllegatiModule will not be initialized.\");\n }\n\n return {\n module: EmilsoftwareModule,\n imports,\n exports\n };\n }\n} "]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionTimeLogger.js","sourceRoot":"","sources":["../src/ExecutionTimeLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yBAA4B;AAE5B,MAAa,mBAAmB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,MAAc,EAAE,WAAmB,EAAE,UAA8B;QAC5E,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QAExC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,SAAS,CAAC,4DAA4D,OAAO,cAAc,EAAE,CAAC,CAAC;QAC7G,CAAC;QAED,MAAM,SAAS,GAAI,MAA4C,CAAC,WAAW,CAAC,IAAI,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,SAAM,CAAC,SAAS,CAAC,CAAC;QACrC,UAAU,CAAC,KAAK,GAAG,UAAgB,GAAG,IAAe;;gBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,WAAW,iCAAiC,CAAC,CAAC;gBAE5E,IAAI,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACtD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClC,MAAM,sBAAsB,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,WAAW,gBAAgB,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;oBAC5G,OAAO,MAAM,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,WAAW,2BAA2B,OAAO,EAAE,CAAC,CAAC;oBAChF,MAAM,KAAK,CAAC;gBAChB,CAAC;YACL,CAAC;SAAA,CAAC;QAEF,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ;AApCD,kDAoCC","sourcesContent":["import { Logger } from \"./\";\
|
|
1
|
+
{"version":3,"file":"ExecutionTimeLogger.js","sourceRoot":"","sources":["../src/ExecutionTimeLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yBAA4B;AAE5B,MAAa,mBAAmB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,MAAc,EAAE,WAAmB,EAAE,UAA8B;QAC5E,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QAExC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,SAAS,CAAC,4DAA4D,OAAO,cAAc,EAAE,CAAC,CAAC;QAC7G,CAAC;QAED,MAAM,SAAS,GAAI,MAA4C,CAAC,WAAW,CAAC,IAAI,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,SAAM,CAAC,SAAS,CAAC,CAAC;QACrC,UAAU,CAAC,KAAK,GAAG,UAAgB,GAAG,IAAe;;gBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,WAAW,iCAAiC,CAAC,CAAC;gBAE5E,IAAI,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACtD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClC,MAAM,sBAAsB,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,WAAW,gBAAgB,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;oBAC5G,OAAO,MAAM,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,WAAW,2BAA2B,OAAO,EAAE,CAAC,CAAC;oBAChF,MAAM,KAAK,CAAC;gBAChB,CAAC;YACL,CAAC;SAAA,CAAC;QAEF,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ;AApCD,kDAoCC","sourcesContent":["import { Logger } from \"./\";\n\nexport class ExecutionTimeLogger {\n /**\n * Wraps a method to log its execution time and errors.\n * @param target The target object.\n * @param propertyKey The name of the method.\n * @param descriptor The property descriptor of the method.\n * @description use ExecutionTimeLogger.apply on a method\n */\n static apply(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== \"function\") {\n throw new TypeError(`ExecutionTimeLogger can only be applied to methods, not: ${typeof originalMethod}`);\n }\n\n const className = (target as { constructor: { name: string } }).constructor.name;\n const logger = new Logger(className);\n descriptor.value = async function (...args: unknown[]) {\n const start = process.hrtime();\n logger.info(`[${className}] ${propertyKey} method execution started . . .`);\n \n try {\n const result = await originalMethod.apply(this, args);\n const end = process.hrtime(start);\n const durationInMilliseconds = end[0] * 1000 + end[1] / 1e6;\n logger.info(`[${className}] ${propertyKey} method took ${durationInMilliseconds.toFixed(2)} ms to execute`);\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[${className}] ${propertyKey} method threw an error: ${message}`);\n throw error;\n }\n };\n\n return descriptor;\n }\n}\n"]}
|
package/dist/Orm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Orm.js","sourceRoot":"","sources":["../src/Orm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\r\nimport { ConnectionPool, Database, Options, QueryParams, Transaction } from \"node-firebird\";\r\nimport { Logger } from \"./Logger\";\r\nimport { RestUtilities } from \"./Utilities\";\r\nimport {\r\n describeFirebirdCompatibilityOptions,\r\n enhanceFirebirdError,\r\n FirebirdOptions,\r\n normalizeFirebirdOptions,\r\n} from \"./firebird-compat\";\r\n\r\nexport class Orm {\r\n private static logger: Logger = new Logger(Orm.name);\r\n private static pools: Map<string, ConnectionPool> = new Map();\r\n\r\n public static quote(value: string): string {\r\n return \"\\\"\" + value + \"\\\"\";\r\n }\r\n\r\n /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */\r\n private static getPoolSize(options: Options): number {\r\n const raw = (options as FirebirdOptions).poolSize;\r\n if (raw === 0) {\r\n return 0;\r\n }\r\n const size = raw === undefined ? 5 : Number(raw);\r\n return Number.isFinite(size) && size > 0 ? Math.trunc(size) : 0;\r\n }\r\n\r\n private static shouldLogQueryParameters(options: Options): boolean {\r\n return (options as FirebirdOptions).logQueryParameters === true;\r\n }\r\n\r\n private static formatQueryForLog(query: string, parameters: QueryParams, includeValues: boolean): string {\r\n const parameterList = Array.isArray(parameters) ? parameters : Object.values(parameters ?? {});\r\n if (includeValues) {\r\n return RestUtilities.printQueryWithParams(query, parameterList);\r\n }\r\n return `${query.replace(/\\s+/g, \" \").trim()} [params=${parameterList.length}]`;\r\n }\r\n\r\n private static buildPoolKey(options: Options, size: number): string {\r\n const normalized = normalizeFirebirdOptions(options);\r\n return [\r\n size,\r\n normalized.host ?? \"\",\r\n normalized.port ?? \"\",\r\n normalized.database ?? \"\",\r\n normalized.user ?? \"\",\r\n normalized.pluginName ?? \"\",\r\n String(normalized.wireCrypt ?? \"\"),\r\n ].join(\"|\");\r\n }\r\n\r\n /**\r\n * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,\r\n * perché i pool mantengono connessioni e timer attivi.\r\n */\r\n public static async closePools(): Promise<void> {\r\n const pools = Array.from(this.pools.values());\r\n this.pools.clear();\r\n await Promise.all(pools.map((pool) => new Promise<void>((resolve) => {\r\n try {\r\n pool.destroy(() => resolve());\r\n } catch {\r\n resolve();\r\n }\r\n })));\r\n }\r\n\r\n private static getPool(options: Options, size: number): ConnectionPool {\r\n const normalized = normalizeFirebirdOptions(options);\r\n const key = this.buildPoolKey(normalized, size);\r\n let pool = this.pools.get(key);\r\n if (!pool) {\r\n this.logger.info(`Firebird pool created (max=${size}) using ${describeFirebirdCompatibilityOptions(normalized)}`);\r\n pool = Firebird.pool(size, normalized);\r\n pool.on(\"error\", (error: Error) => {\r\n this.logger.error(`Firebird pool error: ${error.message}`);\r\n });\r\n this.pools.set(key, pool);\r\n }\r\n return pool;\r\n }\r\n\r\n private static getTimeoutMs(options: Options): number {\r\n const candidate = (options as FirebirdOptions).connectTimeout ?? 15000;\r\n return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;\r\n }\r\n\r\n private static createTimeoutError(stage: string, timeoutMs: number, options: Options, query?: string): Error {\r\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\r\n const suffix = query ? ` | sql=${query.replace(/\\s+/g, \" \").trim()}` : \"\";\r\n return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);\r\n }\r\n\r\n private static async detachQuietly(db: Database | undefined): Promise<void> {\r\n if (!db) {\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve) => {\r\n try {\r\n db.detach(() => resolve());\r\n } catch {\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n private static shouldTrimStringResults(options: FirebirdOptions): boolean {\r\n return options.trimStringResults !== false;\r\n }\r\n\r\n private static normalizeResultValue(value: unknown, trimStringResults: boolean): unknown {\r\n if (!trimStringResults || value === undefined || value === null) {\r\n return value;\r\n }\r\n\r\n if (typeof value === \"string\" || value instanceof String) {\r\n return String(value).trimEnd();\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => this.normalizeResultValue(item, trimStringResults));\r\n }\r\n\r\n if (value instanceof Date || Buffer.isBuffer(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === \"object\") {\r\n const source = value as Record<string, unknown>;\r\n return Object.keys(source).reduce((normalized: Record<string, unknown>, key: string) => {\r\n normalized[key] = this.normalizeResultValue(source[key], trimStringResults);\r\n return normalized;\r\n }, {});\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private static attachWithTimeout(options: Options): Promise<Database> {\r\n return new Promise((resolve, reject): void => {\r\n const normalizedOptions = normalizeFirebirdOptions(options);\r\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\r\n const poolSize = this.getPoolSize(options);\r\n let settled = false;\r\n const timeoutId = setTimeout(() => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n reject(\r\n enhanceFirebirdError(\r\n this.createTimeoutError(\"attach\", timeoutMs, normalizedOptions),\r\n normalizedOptions,\r\n { stage: \"attach\" },\r\n ),\r\n );\r\n }, timeoutMs);\r\n\r\n const handle = async (err: unknown, db: Database): Promise<void> => {\r\n if (settled) {\r\n await this.detachQuietly(db);\r\n return;\r\n }\r\n\r\n settled = true;\r\n clearTimeout(timeoutId);\r\n\r\n if (err) {\r\n return reject(enhanceFirebirdError(err, normalizedOptions, { stage: \"attach\" }));\r\n }\r\n\r\n return resolve(db);\r\n };\r\n\r\n try {\r\n if (poolSize > 0) {\r\n this.getPool(options, poolSize).get(handle);\r\n return;\r\n }\r\n\r\n this.logger.info(`Firebird attach using ${describeFirebirdCompatibilityOptions(normalizedOptions)}`);\r\n\r\n Firebird.attach(normalizedOptions, handle);\r\n } catch (error) {\r\n // Attach/get sincrono fallito: evita di lasciare il timer di timeout pendente.\r\n if (!settled) {\r\n settled = true;\r\n clearTimeout(timeoutId);\r\n reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"attach\" }));\r\n }\r\n }\r\n });\r\n }\r\n\r\n public static async testConnection(options: Options): Promise<boolean> {\r\n return new Promise((resolve): void => {\r\n this.attachWithTimeout(options)\r\n .then(async (db: Database): Promise<void> => {\r\n this.logger.info(\"DATABASE connesso.\");\r\n await this.detachQuietly(db);\r\n resolve(true);\r\n })\r\n .catch((err: Error): void => {\r\n this.logger.error(\"La connessione con il DATABASE non e andata a buon fine.\");\r\n this.logger.error(err);\r\n resolve(false);\r\n });\r\n });\r\n }\r\n\r\n public static async query<T = Record<string, unknown>>(\r\n options: Options,\r\n query: string,\r\n parameters: QueryParams = [],\r\n logQuery = true,\r\n ): Promise<T[]> {\r\n try {\r\n const normalizedOptions = normalizeFirebirdOptions(options);\r\n const db = await this.attachWithTimeout(options);\r\n\r\n return await new Promise<T[]>((resolve, reject): void => {\r\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\r\n let settled = false;\r\n const timeoutId = setTimeout(async () => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n await this.detachQuietly(db);\r\n reject(\r\n enhanceFirebirdError(\r\n this.createTimeoutError(\"query\", timeoutMs, normalizedOptions, query),\r\n normalizedOptions,\r\n { stage: \"query\", sql: query },\r\n ),\r\n );\r\n }, timeoutMs);\r\n\r\n if (logQuery) {\r\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\r\n }\r\n\r\n db.query<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\r\n if (settled) {\r\n await this.detachQuietly(db);\r\n return;\r\n }\r\n\r\n settled = true;\r\n clearTimeout(timeoutId);\r\n await this.detachQuietly(db);\r\n\r\n if (error) {\r\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"query\", sql: query }));\r\n }\r\n\r\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\r\n });\r\n });\r\n } catch (error) {\r\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"query\", sql: query });\r\n this.logger.error(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n public static async execute<T = Record<string, unknown>>(\r\n options: Options,\r\n query: string,\r\n parameters: QueryParams = [],\r\n logQuery = true,\r\n ): Promise<T[]> {\r\n try {\r\n const normalizedOptions = normalizeFirebirdOptions(options);\r\n const db = await this.attachWithTimeout(options);\r\n\r\n return await new Promise<T[]>((resolve, reject): void => {\r\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\r\n let settled = false;\r\n const timeoutId = setTimeout(async () => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n await this.detachQuietly(db);\r\n reject(\r\n enhanceFirebirdError(\r\n this.createTimeoutError(\"execute\", timeoutMs, normalizedOptions, query),\r\n normalizedOptions,\r\n { stage: \"execute\", sql: query },\r\n ),\r\n );\r\n }, timeoutMs);\r\n\r\n if (logQuery) {\r\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\r\n }\r\n\r\n db.execute<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\r\n if (settled) {\r\n await this.detachQuietly(db);\r\n return;\r\n }\r\n\r\n settled = true;\r\n clearTimeout(timeoutId);\r\n await this.detachQuietly(db);\r\n\r\n if (error) {\r\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"execute\", sql: query }));\r\n }\r\n\r\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\r\n });\r\n });\r\n } catch (error) {\r\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"execute\", sql: query });\r\n this.logger.error(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n public static trimParam<T>(param: T): string | T {\r\n if (typeof param === \"string\" || param instanceof String) {\r\n return String(param).trim();\r\n }\r\n return param;\r\n }\r\n\r\n public static async connect(options: Options): Promise<Database> {\r\n return this.attachWithTimeout(options);\r\n }\r\n\r\n /**\r\n * Runs `operation` inside a single Firebird transaction: commit on success,\r\n * rollback on failure, detach in every case. Use it to make multi-statement\r\n * writes atomic instead of relying on auto-commit per statement.\r\n */\r\n public static async withTransaction<T>(\r\n options: Options,\r\n operation: (transaction: Transaction) => Promise<T>,\r\n ): Promise<T> {\r\n const db = await this.connect(options);\r\n let transaction: Transaction | undefined;\r\n\r\n try {\r\n transaction = await this.startTransaction(db);\r\n const result = await operation(transaction);\r\n await this.commitTransaction(transaction);\r\n return result;\r\n } catch (error) {\r\n if (transaction) {\r\n try {\r\n await this.rollbackTransaction(transaction);\r\n } catch {\r\n // Se la rollback fallisce (connessione persa) l'errore originale resta quello rilevante.\r\n }\r\n }\r\n throw error;\r\n } finally {\r\n await this.detachQuietly(db);\r\n }\r\n }\r\n\r\n /** Esegue una query su una transazione esistente e ne restituisce il risultato. */\r\n public static transactionQuery<T = unknown>(\r\n transaction: Transaction,\r\n query: string,\r\n parameters: QueryParams = [],\r\n ): Promise<T> {\r\n return new Promise<T>((resolve, reject): void => {\r\n transaction.query(query, parameters, (error: unknown, result: unknown[]): void => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n resolve(result as T);\r\n });\r\n });\r\n }\r\n\r\n public static async startTransaction(db: Database): Promise<Transaction> {\r\n return new Promise((resolve, reject): void => {\r\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: unknown, transaction: Transaction): void {\r\n if (err) {\r\n return reject(err);\r\n }\r\n\r\n return resolve(transaction);\r\n });\r\n });\r\n }\r\n\r\n public static async commitTransaction(transaction: Transaction): Promise<string> {\r\n return new Promise((resolve, reject): void => {\r\n transaction.commit((err: unknown): void => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n\r\n return resolve(\"Transaction committed successfully.\");\r\n });\r\n });\r\n }\r\n\r\n public static async rollbackTransaction(transaction: Transaction): Promise<string> {\r\n return new Promise((resolve, reject): void => {\r\n transaction.rollback((err: unknown): void => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n\r\n return resolve(\"Transaction rolled back successfully.\");\r\n });\r\n });\r\n }\r\n\r\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: QueryParams }[]): Promise<string> {\r\n await Orm.withTransaction(options, async (transaction) => {\r\n for (const qwp of queriesWithParams) {\r\n await Orm.transactionQuery(transaction, qwp.query, qwp.params);\r\n }\r\n });\r\n\r\n return \"OK\";\r\n }\r\n\r\n public static async executeQueries(transaction: Transaction, queries: string[], params: QueryParams[]): Promise<unknown> {\r\n try {\r\n return await queries.reduce((promiseChain: Promise<unknown>, currentQuery: string, index: number) => {\r\n return promiseChain.then(() => new Promise((resolve, reject) => {\r\n transaction.query(currentQuery, params[index] ?? [], (err: unknown, result: unknown[]): void => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n\r\n return resolve(result);\r\n });\r\n }));\r\n }, Promise.resolve());\r\n } catch (error) {\r\n return await new Promise((_resolve, reject) => {\r\n transaction.rollback((rollbackErr: unknown): void => {\r\n if (rollbackErr) {\r\n return reject(rollbackErr);\r\n }\r\n\r\n return reject(error);\r\n });\r\n });\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Orm.js","sourceRoot":"","sources":["../src/Orm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport { ConnectionPool, Database, Options, QueryParams, Transaction } from \"node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n describeFirebirdCompatibilityOptions,\n enhanceFirebirdError,\n FirebirdOptions,\n normalizeFirebirdOptions,\n} from \"./firebird-compat\";\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n private static pools: Map<string, ConnectionPool> = new Map();\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */\n private static getPoolSize(options: Options): number {\n const raw = (options as FirebirdOptions).poolSize;\n if (raw === 0) {\n return 0;\n }\n const size = raw === undefined ? 5 : Number(raw);\n return Number.isFinite(size) && size > 0 ? Math.trunc(size) : 0;\n }\n\n private static shouldLogQueryParameters(options: Options): boolean {\n return (options as FirebirdOptions).logQueryParameters === true;\n }\n\n private static formatQueryForLog(query: string, parameters: QueryParams, includeValues: boolean): string {\n const parameterList = Array.isArray(parameters) ? parameters : Object.values(parameters ?? {});\n if (includeValues) {\n return RestUtilities.printQueryWithParams(query, parameterList);\n }\n return `${query.replace(/\\s+/g, \" \").trim()} [params=${parameterList.length}]`;\n }\n\n private static buildPoolKey(options: Options, size: number): string {\n const normalized = normalizeFirebirdOptions(options);\n return [\n size,\n normalized.host ?? \"\",\n normalized.port ?? \"\",\n normalized.database ?? \"\",\n normalized.user ?? \"\",\n normalized.pluginName ?? \"\",\n String(normalized.wireCrypt ?? \"\"),\n ].join(\"|\");\n }\n\n /**\n * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,\n * perché i pool mantengono connessioni e timer attivi.\n */\n public static async closePools(): Promise<void> {\n const pools = Array.from(this.pools.values());\n this.pools.clear();\n await Promise.all(pools.map((pool) => new Promise<void>((resolve) => {\n try {\n pool.destroy(() => resolve());\n } catch {\n resolve();\n }\n })));\n }\n\n private static getPool(options: Options, size: number): ConnectionPool {\n const normalized = normalizeFirebirdOptions(options);\n const key = this.buildPoolKey(normalized, size);\n let pool = this.pools.get(key);\n if (!pool) {\n this.logger.info(`Firebird pool created (max=${size}) using ${describeFirebirdCompatibilityOptions(normalized)}`);\n pool = Firebird.pool(size, normalized);\n pool.on(\"error\", (error: Error) => {\n this.logger.error(`Firebird pool error: ${error.message}`);\n });\n this.pools.set(key, pool);\n }\n return pool;\n }\n\n private static getTimeoutMs(options: Options): number {\n const candidate = (options as FirebirdOptions).connectTimeout ?? 15000;\n return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;\n }\n\n private static createTimeoutError(stage: string, timeoutMs: number, options: Options, query?: string): Error {\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n const suffix = query ? ` | sql=${query.replace(/\\s+/g, \" \").trim()}` : \"\";\n return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);\n }\n\n private static async detachQuietly(db: Database | undefined): Promise<void> {\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n try {\n db.detach(() => resolve());\n } catch {\n resolve();\n }\n });\n }\n\n private static shouldTrimStringResults(options: FirebirdOptions): boolean {\n return options.trimStringResults !== false;\n }\n\n private static normalizeResultValue(value: unknown, trimStringResults: boolean): unknown {\n if (!trimStringResults || value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === \"string\" || value instanceof String) {\n return String(value).trimEnd();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeResultValue(item, trimStringResults));\n }\n\n if (value instanceof Date || Buffer.isBuffer(value)) {\n return value;\n }\n\n if (typeof value === \"object\") {\n const source = value as Record<string, unknown>;\n return Object.keys(source).reduce((normalized: Record<string, unknown>, key: string) => {\n normalized[key] = this.normalizeResultValue(source[key], trimStringResults);\n return normalized;\n }, {});\n }\n\n return value;\n }\n\n private static attachWithTimeout(options: Options): Promise<Database> {\n return new Promise((resolve, reject): void => {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n const poolSize = this.getPoolSize(options);\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"attach\", timeoutMs, normalizedOptions),\n normalizedOptions,\n { stage: \"attach\" },\n ),\n );\n }, timeoutMs);\n\n const handle = async (err: unknown, db: Database): Promise<void> => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n\n if (err) {\n return reject(enhanceFirebirdError(err, normalizedOptions, { stage: \"attach\" }));\n }\n\n return resolve(db);\n };\n\n try {\n if (poolSize > 0) {\n this.getPool(options, poolSize).get(handle);\n return;\n }\n\n this.logger.info(`Firebird attach using ${describeFirebirdCompatibilityOptions(normalizedOptions)}`);\n\n Firebird.attach(normalizedOptions, handle);\n } catch (error) {\n // Attach/get sincrono fallito: evita di lasciare il timer di timeout pendente.\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"attach\" }));\n }\n }\n });\n }\n\n public static async testConnection(options: Options): Promise<boolean> {\n return new Promise((resolve): void => {\n this.attachWithTimeout(options)\n .then(async (db: Database): Promise<void> => {\n this.logger.info(\"DATABASE connesso.\");\n await this.detachQuietly(db);\n resolve(true);\n })\n .catch((err: Error): void => {\n this.logger.error(\"La connessione con il DATABASE non e andata a buon fine.\");\n this.logger.error(err);\n resolve(false);\n });\n });\n }\n\n public static async query<T = Record<string, unknown>>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"query\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"query\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.query<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"query\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"query\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static async execute<T = Record<string, unknown>>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"execute\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"execute\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.execute<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"execute\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"execute\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static trimParam<T>(param: T): string | T {\n if (typeof param === \"string\" || param instanceof String) {\n return String(param).trim();\n }\n return param;\n }\n\n public static async connect(options: Options): Promise<Database> {\n return this.attachWithTimeout(options);\n }\n\n /**\n * Runs `operation` inside a single Firebird transaction: commit on success,\n * rollback on failure, detach in every case. Use it to make multi-statement\n * writes atomic instead of relying on auto-commit per statement.\n */\n public static async withTransaction<T>(\n options: Options,\n operation: (transaction: Transaction) => Promise<T>,\n ): Promise<T> {\n const db = await this.connect(options);\n let transaction: Transaction | undefined;\n\n try {\n transaction = await this.startTransaction(db);\n const result = await operation(transaction);\n await this.commitTransaction(transaction);\n return result;\n } catch (error) {\n if (transaction) {\n try {\n await this.rollbackTransaction(transaction);\n } catch {\n // Se la rollback fallisce (connessione persa) l'errore originale resta quello rilevante.\n }\n }\n throw error;\n } finally {\n await this.detachQuietly(db);\n }\n }\n\n /** Esegue una query su una transazione esistente e ne restituisce il risultato. */\n public static transactionQuery<T = unknown>(\n transaction: Transaction,\n query: string,\n parameters: QueryParams = [],\n ): Promise<T> {\n return new Promise<T>((resolve, reject): void => {\n transaction.query(query, parameters, (error: unknown, result: unknown[]): void => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(result as T);\n });\n });\n }\n\n public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: unknown, transaction: Transaction): void {\n if (err) {\n return reject(err);\n }\n\n return resolve(transaction);\n });\n });\n }\n\n public static async commitTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.commit((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction committed successfully.\");\n });\n });\n }\n\n public static async rollbackTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.rollback((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: QueryParams }[]): Promise<string> {\n await Orm.withTransaction(options, async (transaction) => {\n for (const qwp of queriesWithParams) {\n await Orm.transactionQuery(transaction, qwp.query, qwp.params);\n }\n });\n\n return \"OK\";\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: QueryParams[]): Promise<unknown> {\n try {\n return await queries.reduce((promiseChain: Promise<unknown>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index] ?? [], (err: unknown, result: unknown[]): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((_resolve, reject) => {\n transaction.rollback((rollbackErr: unknown): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n }\n\n return reject(error);\n });\n });\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoutesLoggerMiddleware.js","sourceRoot":"","sources":["../src/RoutesLoggerMiddleware.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,sBAAsB;IAG/B;;;OAGG;IACH,YAAY,MAAc;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QAC5D,MAAM,KAAK,GAAS,IAAI,IAAI,EAAE,CAAC,CAAC,wCAAwC;QAExE,0EAA0E;QAC1E,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAS,EAAE;YACxB,MAAM,GAAG,GAAS,IAAI,IAAI,EAAE,CAAC,CAAC,sCAAsC;YACpE,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,8CAA8C;YAEvG,gDAAgD;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,KAAK,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,yDAAyD;QACzD,IAAI,EAAE,CAAC;IACX,CAAC;CACJ;AAhCD,wDAgCC","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\
|
|
1
|
+
{"version":3,"file":"RoutesLoggerMiddleware.js","sourceRoot":"","sources":["../src/RoutesLoggerMiddleware.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,sBAAsB;IAG/B;;;OAGG;IACH,YAAY,MAAc;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QAC5D,MAAM,KAAK,GAAS,IAAI,IAAI,EAAE,CAAC,CAAC,wCAAwC;QAExE,0EAA0E;QAC1E,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAS,EAAE;YACxB,MAAM,GAAG,GAAS,IAAI,IAAI,EAAE,CAAC,CAAC,sCAAsC;YACpE,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,8CAA8C;YAEvG,gDAAgD;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,KAAK,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,yDAAyD;QACzD,IAAI,EAAE,CAAC;IACX,CAAC;CACJ;AAhCD,wDAgCC","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport { Logger } from \".\";\n\n/**\n * Middleware class for logging the execution time of routes.\n */\nexport class RoutesLoggerMiddleware {\n private logger: Logger;\n\n /**\n * Initializes the logger instance to be used.\n * @param logger - The logger instance.\n */\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Middleware function to log the execution time of each route.\n * @param req - The incoming HTTP request.\n * @param res - The HTTP response.\n * @param next - The next middleware function in the chain.\n */\n logExecutionTime(req: Request, res: Response, next: NextFunction): void {\n const start: Date = new Date(); // Record the start time of the request.\n\n // Attach a listener to the response object to calculate the elapsed time.\n res.on(\"finish\", (): void => {\n const end: Date = new Date(); // Record the end time of the request.\n const elapsed: number = end.getTime() - start.getTime(); // Calculate the elapsed time in milliseconds.\n\n // Log the HTTP method, URL, and execution time.\n this.logger.info(`Execution time for ${req.method} ${req.originalUrl}: ${elapsed} ms`);\n });\n\n // Continue to the next middleware function in the chain.\n next();\n }\n}\n"]}
|
package/dist/Utilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../src/Utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { Response } from 'express';\r\nimport { FirebirdOptions } from \"./firebird-compat\";\r\nimport { Logger } from \"./Logger\";\r\nimport crypto from \"crypto\";\r\n\r\n\r\nexport enum StatusCode {\r\n Ok = 0,\r\n Warning = 1,\r\n Error = 2,\r\n}\r\n\r\nexport class DateUtilities {\r\n /**\r\n * Pads a number with leading zeros to reach a specified length.\r\n * @param num - The number to pad.\r\n * @param totalLength - The total length of the resulting string.\r\n * @returns The padded string.\r\n */\r\n static addStartingZeros(num: number, totalLength: number): string {\r\n return String(num).padStart(totalLength, '0');\r\n }\r\n\r\n /**\r\n * Formats a Date object as a Moncler-style string.\r\n * @param dData - The date to format.\r\n * @param bAddMs - Whether to include milliseconds.\r\n * @returns The formatted date string.\r\n */\r\n static dateToMoncler(dData: Date, bAddMs: boolean = false): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n const hh = this.addStartingZeros(dData.getHours(), 2);\r\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\r\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\r\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\r\n return bAddMs ? `${yy}${mm}${dd}${hh}${nn}${ss}${ms}` : `${yy}${mm}${dd}${hh}${nn}${ss}`;\r\n }\r\n\r\n /**\r\n * Formats a Date object as a SQL-style string.\r\n * @param dData - The date to format.\r\n * @param bAddMs - Whether to include milliseconds.\r\n * @returns The formatted date string.\r\n */\r\n static dateToSql(dData: Date, bAddMs: boolean = false): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n const hh = this.addStartingZeros(dData.getHours(), 2);\r\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\r\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\r\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\r\n return bAddMs\r\n ? `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}.${ms}`\r\n : `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}`;\r\n }\r\n\r\n /**\r\n * Formats a Date object as a simple string (dd-MM-yyyy).\r\n * @param dData - The date to format.\r\n * @returns The formatted date string.\r\n */\r\n static dateToSimple(dData: Date): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n return `${dd}-${mm}-${yy}`;\r\n }\r\n\r\n /**\r\n * Gets the current date and time as a formatted string.\r\n * @returns The current date and time in the format dd.MM.yyyy HH:mm:ss.\r\n */\r\n static getNowDateString(): string {\r\n const now: Date = new Date();\r\n const day = now.getDate().toString().padStart(2, \"0\");\r\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\r\n const year = now.getFullYear();\r\n const hours = now.getHours().toString().padStart(2, \"0\");\r\n const minutes = now.getMinutes().toString().padStart(2, \"0\");\r\n const seconds = now.getSeconds().toString().padStart(2, \"0\");\r\n return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n /**\r\n * Parses a date string in the format dd/MM/yyyy into a Date object.\r\n * @param date - The date string to parse.\r\n * @returns A Date object.\r\n */\r\n static parseDate(date: string): Date {\r\n const parts: string[] = date.split(\"/\");\r\n return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));\r\n }\r\n}\r\n\r\n\r\nexport class RestUtilities {\r\n /**\r\n * Sends an OK message as a response.\r\n * @param res - Express Response object.\r\n * @param message - The success message.\r\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\r\n * @returns The Response object.\r\n */\r\n static sendOKMessage(res: Response, message: string, status: number = 200): Response {\r\n return res.status(status).send({\r\n severity: \"success\",\r\n status,\r\n statusCode: StatusCode.Ok,\r\n message,\r\n });\r\n }\r\n\r\n /**\r\n * Sends an error message as a response.\r\n * @param res - Express Response object.\r\n * @param error - The error to send.\r\n * @param tag - Optional tag for additional context.\r\n * @param status - HTTP status code (default: 500).\r\n * @returns The Response object.\r\n */\r\n static sendErrorMessage(res: Response, error: unknown, _tag: string = \"[BASE ERROR]\", status: number = 500): Response {\r\n const rawMessage = error instanceof Error ? error.message : String(error ?? \"\");\r\n const errorWithResponse = error as { getResponse?: () => unknown } | null | undefined;\r\n const exceptionResponse = typeof errorWithResponse?.getResponse === \"function\"\r\n ? errorWithResponse.getResponse()\r\n : undefined;\r\n const exceptionPayload = exceptionResponse && typeof exceptionResponse === \"object\"\r\n ? exceptionResponse as { code?: unknown; message?: unknown; details?: unknown }\r\n : undefined;\r\n const explicitCode = typeof exceptionPayload?.code === \"string\" ? exceptionPayload.code : undefined;\r\n const explicitMessage = typeof exceptionPayload?.message === \"string\" ? exceptionPayload.message : undefined;\r\n const explicitDetails = Array.isArray(exceptionPayload?.details)\r\n ? exceptionPayload.details.filter((detail): detail is string => typeof detail === \"string\")\r\n : undefined;\r\n const schemaError = this.isDatabaseSchemaError(error);\r\n // Per le HttpException lo status corretto e quello dell'eccezione (es. 400 di validazione),\r\n // anche quando il chiamante non lo passa esplicitamente. Lo status esplicito vale per gli altri errori.\r\n const exceptionStatus = typeof errorWithResponse?.getResponse === \"function\"\r\n ? Number((error as { getStatus?: () => number }).getStatus?.())\r\n : undefined;\r\n const effectiveStatus = schemaError\r\n ? 503\r\n : Number.isInteger(exceptionStatus) && (exceptionStatus as number) >= 400\r\n ? (exceptionStatus as number)\r\n : status;\r\n const code = schemaError\r\n ? \"ACCESSI_DATABASE_SCHEMA_OUTDATED\"\r\n : explicitCode ?? (effectiveStatus >= 500\r\n ? \"ACCESSI_INTERNAL_ERROR\"\r\n : effectiveStatus === 401\r\n ? \"ACCESSI_UNAUTHORIZED\"\r\n : effectiveStatus === 403\r\n ? \"ACCESSI_FORBIDDEN\"\r\n : \"ACCESSI_REQUEST_ERROR\");\r\n const message = schemaError\r\n ? \"Lo schema del database Accessi non e aggiornato. Eseguire la migrazione database e riprovare.\"\r\n : explicitMessage ?? (effectiveStatus >= 500\r\n ? \"Errore interno del modulo Accessi.\"\r\n : effectiveStatus === 401\r\n ? \"Autenticazione non valida o scaduta.\"\r\n : effectiveStatus === 403\r\n ? \"Operazione non autorizzata.\"\r\n : rawMessage || \"Richiesta non valida.\");\r\n\r\n return res.status(effectiveStatus).send({\r\n severity: \"error\",\r\n status: effectiveStatus,\r\n statusCode: StatusCode.Error,\r\n code,\r\n message,\r\n // Compatibilita: il campo storico resta presente, ma non espone SQL, stack o dati sensibili.\r\n error: code,\r\n ...(explicitDetails?.length ? { details: explicitDetails } : {}),\r\n });\r\n }\r\n\r\n /** Riconosce errori di metadata Firebird che richiedono una migrazione. */\r\n static isDatabaseSchemaError(error: unknown): boolean {\r\n const message = error instanceof Error ? error.message : String(error ?? \"\");\r\n return /column unknown|table unknown|dynamic sql error|unsuccessful metadata update|invalid request blr/i.test(message);\r\n }\r\n\r\n\r\n static sendUnauthorized(res: Response): Response {\r\n return res.status(401).send({\r\n severity: \"error\",\r\n status: 401,\r\n statusCode: StatusCode.Error,\r\n code: \"ACCESSI_UNAUTHORIZED\",\r\n error: \"ACCESSI_UNAUTHORIZED\",\r\n message: \"Autenticazione non valida o scaduta.\",\r\n });\r\n }\r\n\r\n static sendInvalidCredentials(res: Response): Response {\r\n return res.status(401).send({\r\n severity: \"error\",\r\n status: 401,\r\n statusCode: StatusCode.Error,\r\n code: \"ACCESSI_INVALID_CREDENTIALS\",\r\n error: \"ACCESSI_INVALID_CREDENTIALS\",\r\n message: \"Credenziali non valide\",\r\n });\r\n }\r\n\r\n static sendPasswordExpired(res: Response): Response {\r\n return res.status(403).send({\r\n severity: \"warning\",\r\n status: 403,\r\n statusCode: StatusCode.Warning,\r\n code: \"PASSWORD_EXPIRED\",\r\n error: \"PASSWORD_EXPIRED\",\r\n message: \"Password scaduta. E' necessario aggiornarla\"\r\n })\r\n }\r\n\r\n /**\r\n * Sends a base response with a payload.\r\n * @param res - Express Response object.\r\n * @param payload - The payload to include in the response.\r\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\r\n * @returns The Response object.\r\n */\r\n static sendBaseResponse(res: Response, payload: unknown, status: number = 200): Response {\r\n try {\r\n payload = JSON.parse(JSON.stringify(payload));\r\n const response = {\r\n Status: {\r\n errorCode: \"0\",\r\n errorDescription: \"\",\r\n },\r\n Result: payload,\r\n Message: \"Dati recuperati con successo.\",\r\n };\r\n return res.status(status).send(response);\r\n } catch (error) {\r\n return this.sendErrorMessage(res, `Error sending response: ${error}`, \"[UTILITIES]\", 500);\r\n }\r\n }\r\n\r\n /**\r\n * Sends an execution message as a response.\r\n * @param res - Express Response object.\r\n * @param executionObject - The execution data.\r\n * @param title - The title of the response.\r\n * @param status - HTTP success status. Defaults to 200.\r\n * @returns The Response object.\r\n */\r\n static sendExecMessage(res: Response, executionObject: unknown, title: string, status: number = 200): Response {\r\n try {\r\n const response = {\r\n Status: {\r\n errorCode: \"0\",\r\n errorDescription: \"\",\r\n },\r\n Sql: \"\",\r\n ID: (executionObject as { id?: unknown } | null | undefined)?.id,\r\n data: executionObject,\r\n Title: title,\r\n };\r\n return res.status(status).send(response);\r\n } catch (error) {\r\n return this.sendErrorMessage(res, `Error sending execution message: ${error}`, title, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Prints a SQL query with parameters replaced. Replacement is literal: values\r\n * containing `?` or `$&` no longer corrupt the output as in the legacy\r\n * `String.replace` implementation.\r\n * @param query - The SQL query.\r\n * @param params - The parameters to replace.\r\n * @returns The formatted query.\r\n */\r\n static printQueryWithParams(query: string = \"\", params: unknown[] = []): string {\r\n let index = 0;\r\n return query.replace(/\\?/g, () => {\r\n if (index >= params.length) {\r\n return \"?\";\r\n }\r\n const param = params[index++];\r\n return param === undefined || param === null ? \"NULL\" : String(param);\r\n });\r\n }\r\n\r\n\r\n public static convertKeysToCamelCase<T = Record<string, unknown>>(obj: unknown): T {\r\n if (obj !== null && typeof obj === \"object\" && obj.constructor === Object) {\r\n const source = obj as Record<string, unknown>;\r\n const converted = Object.keys(source).reduce((acc: Record<string, unknown>, key: string) => {\r\n const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => (g[1] ?? '').toUpperCase());\r\n acc[camelCaseKey] = source[key];\r\n return acc;\r\n }, {});\r\n return converted as T;\r\n }\r\n return obj as T;\r\n }\r\n}\r\n\r\n\r\nexport class CryptUtilities {\r\n private static readonly logger = new Logger(CryptUtilities.name);\r\n\r\n /**\r\n * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.\r\n * \r\n * @param plainText - Il testo in chiaro da cifrare.\r\n * @param key - La chiave di cifratura (16 byte per AES-128).\r\n * @param outputEncoding - Codifica del risultato cifrato (predefinito: \"base64\").\r\n * @returns Il testo cifrato codificato.\r\n * @throws Errore in caso di problemi durante la cifratura.\r\n */\r\n public static encrypt(plainData: string, key: string, outputEncoding: BufferEncoding = \"base64\"): string {\r\n try {\r\n // Crea un oggetto Cipher usando AES-128 in modalità ECB\r\n const cipher = crypto.createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\r\n\r\n // Cifra il testo in chiaro e finalizza il processo\r\n const encryptedBuffer = Buffer.concat([\r\n cipher.update(plainData, \"utf8\"),\r\n cipher.final(),\r\n ]);\r\n\r\n // Restituisce il risultato cifrato codificato\r\n return encryptedBuffer.toString(outputEncoding);\r\n } catch (error) {\r\n // Gestisce eventuali errori di cifratura\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Errore durante la cifratura: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Decifra un testo cifrato usando l'algoritmo AES-128 in modalità ECB.\r\n * \r\n * @param encryptedData - Il testo cifrato da decifrare.\r\n * @param key - La chiave di decifratura (16 byte per AES-128).\r\n * @returns Il testo decifrato o null in caso di errore.\r\n */\r\n public static decrypt(encryptedData: string, key: string): string | null {\r\n try {\r\n // Crea un oggetto Decipher usando AES-128 in modalità ECB\r\n const decipher = crypto.createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\r\n decipher.setAutoPadding(false);\r\n\r\n // Decifra il testo cifrato\r\n let decoded = decipher.update(encryptedData, \"base64\", \"utf8\");\r\n decoded += decipher.final(\"utf8\");\r\n\r\n // Rimuove il padding manuale\r\n const lastChar = decoded.charCodeAt(decoded.length - 1);\r\n decoded = decoded.slice(0, decoded.length - lastChar);\r\n\r\n return decoded;\r\n } catch (error) {\r\n CryptUtilities.logger.error(\"Errore durante la decifratura:\", error);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport class PasswordUtilities {\r\n private static readonly HASH_PREFIX = \"scrypt\";\r\n private static readonly LEGACY_HASH_PREFIX = \"scrypt-legacy\";\r\n private static readonly SCRYPT_N = 16384;\r\n private static readonly SCRYPT_R = 8;\r\n private static readonly SCRYPT_P = 1;\r\n private static readonly SALT_LENGTH = 16;\r\n\r\n private static hashSecret(secretValue: string, prefix: string): string {\r\n if (typeof secretValue !== \"string\" || secretValue.length === 0) {\r\n throw new Error(\"Il valore da proteggere non puo essere vuoto.\");\r\n }\r\n const salt = crypto.randomBytes(this.SALT_LENGTH).toString(\"hex\");\r\n const derivedKey = crypto.scryptSync(\r\n secretValue,\r\n salt,\r\n 64,\r\n {\r\n N: this.SCRYPT_N,\r\n r: this.SCRYPT_R,\r\n p: this.SCRYPT_P,\r\n maxmem: 64 * 1024 * 1024,\r\n },\r\n );\r\n\r\n return [\r\n prefix,\r\n this.SCRYPT_N,\r\n this.SCRYPT_R,\r\n this.SCRYPT_P,\r\n salt,\r\n derivedKey.toString(\"hex\"),\r\n ].join(\"$\");\r\n }\r\n\r\n private static hasPrefix(value: string, prefix: string): boolean {\r\n return typeof value === \"string\" && value.startsWith(`${prefix}$`);\r\n }\r\n\r\n private static parseHash(\r\n storedPassword: string,\r\n expectedPrefix: string\r\n ): {\r\n salt: string;\r\n expectedHash: Buffer;\r\n N: number;\r\n r: number;\r\n p: number;\r\n } | null {\r\n if (!this.hasPrefix(storedPassword, expectedPrefix)) {\r\n return null;\r\n }\r\n\r\n const [, rawN, rawR, rawP, salt, expectedHashHex] = storedPassword.split(\"$\");\r\n const N = Number(rawN);\r\n const r = Number(rawR);\r\n const p = Number(rawP);\r\n\r\n if (!salt || !expectedHashHex || !Number.isFinite(N) || !Number.isFinite(r) || !Number.isFinite(p)) {\r\n return null;\r\n }\r\n\r\n const expectedHash = Buffer.from(expectedHashHex, \"hex\");\r\n if (expectedHash.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n salt,\r\n expectedHash,\r\n N,\r\n r,\r\n p,\r\n };\r\n }\r\n\r\n private static verifySecret(secretValue: string, storedPassword: string, expectedPrefix: string): boolean {\r\n if (typeof secretValue !== \"string\") {\r\n return false;\r\n }\r\n\r\n const parsedHash = this.parseHash(storedPassword, expectedPrefix);\r\n if (!parsedHash) {\r\n return false;\r\n }\r\n\r\n const derivedKey = crypto.scryptSync(\r\n secretValue,\r\n parsedHash.salt,\r\n parsedHash.expectedHash.length,\r\n {\r\n N: parsedHash.N,\r\n r: parsedHash.r,\r\n p: parsedHash.p,\r\n maxmem: 64 * 1024 * 1024,\r\n },\r\n );\r\n\r\n return crypto.timingSafeEqual(derivedKey, parsedHash.expectedHash);\r\n }\r\n\r\n public static hashPassword(plainPassword: string): string {\r\n return this.hashSecret(plainPassword, this.HASH_PREFIX);\r\n }\r\n\r\n public static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string {\r\n return this.hashSecret(legacyEncryptedPassword, this.LEGACY_HASH_PREFIX);\r\n }\r\n\r\n public static isPasswordHash(value: string): boolean {\r\n return this.hasPrefix(value, this.HASH_PREFIX);\r\n }\r\n\r\n public static isLegacyPasswordHash(value: string): boolean {\r\n return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);\r\n }\r\n\r\n /** Confronto a tempo costante tra due stringhe (per dati legacy non hashati). */\r\n public static timingSafeStringEquals(value: string, candidate: string): boolean {\r\n if (typeof value !== \"string\" || typeof candidate !== \"string\") {\r\n return false;\r\n }\r\n\r\n const valueBuffer = Buffer.from(value, \"utf8\");\r\n const candidateBuffer = Buffer.from(candidate, \"utf8\");\r\n\r\n if (valueBuffer.length !== candidateBuffer.length) {\r\n // Confronta comunque per non rivelare la lunghezza tramite timing.\r\n crypto.timingSafeEqual(valueBuffer, valueBuffer);\r\n return false;\r\n }\r\n\r\n return crypto.timingSafeEqual(valueBuffer, candidateBuffer);\r\n }\r\n\r\n public static verifyPassword(plainPassword: string, storedPassword: string): boolean {\r\n return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);\r\n }\r\n\r\n public static verifyLegacyEncryptedPassword(\r\n legacyEncryptedPassword: string,\r\n storedPassword: string\r\n ): boolean {\r\n return this.verifySecret(legacyEncryptedPassword, storedPassword, this.LEGACY_HASH_PREFIX);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Utility class for managing database-related configurations and operations.\r\n */\r\nexport class DatabaseUtilities {\r\n /**\r\n * Creates a configuration object for connecting to a Firebird database.\r\n *\r\n * @param {string} host - The hostname or IP address of the database server.\r\n * @param {number} port - The port number on which the database server is running.\r\n * @param {string} database - The path or alias of the database to connect to.\r\n * @param {string} [username='SYSDBA'] - The username for authentication. Defaults to 'SYSDBA'.\r\n * @param {string} [password='masterkey'] - The password for authentication. Defaults to 'masterkey'.\r\n * @returns {Options} - The configuration object to use for establishing a Firebird database connection.\r\n *\r\n * @example\r\n * ```typescript\r\n * const options = DatabaseUtilities.createOption(\r\n * 'localhost',\r\n * 3050,\r\n * '/path/to/database.fdb',\r\n * 'myUsername',\r\n * 'myPassword'\r\n * );\r\n * ```\r\n */\r\n public static createOption(\r\n host: string,\r\n port: number,\r\n database: string,\r\n username = 'SYSDBA',\r\n password = 'masterkey'\r\n ): FirebirdOptions {\r\n return {\r\n host, // The hostname or IP address of the database server.\r\n port, // The port number used by the database server.\r\n user: username, // The username for database authentication.\r\n password, // The password for database authentication.\r\n database, // The path or alias of the target database.\r\n lowercase_keys: false, // Determines if the keys in query results should be in lowercase. Default: false.\r\n role: undefined, // The role for the database connection. Default: undefined.\r\n pageSize: 100000, // The page size for database transactions. Default: 100,000.\r\n retryConnectionInterval: 1000, // The interval (in ms) to retry a failed connection. Default: 1,000 ms.\r\n blobAsText: true, // Determines if BLOB fields should be treated as text. Default: true.\r\n connectTimeout: 15000,\r\n connectTimeoutMs: 15000,\r\n trimStringResults: true,\r\n };\r\n }\r\n}\r\n\r\nconst deprecationLogger = new Logger('Deprecated');\r\n\r\nexport function Deprecated(message: string) {\r\n return function (target: object, key?: string, descriptor?: PropertyDescriptor) {\r\n void target;\r\n void key;\r\n void descriptor;\r\n deprecationLogger.warning(`[DEPRECATED] ${message}`);\r\n };\r\n }\r\n"]}
|
|
1
|
+
{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../src/Utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { Response } from 'express';\nimport { FirebirdOptions } from \"./firebird-compat\";\nimport { Logger } from \"./Logger\";\nimport crypto from \"crypto\";\n\n\nexport enum StatusCode {\n Ok = 0,\n Warning = 1,\n Error = 2,\n}\n\nexport class DateUtilities {\n /**\n * Pads a number with leading zeros to reach a specified length.\n * @param num - The number to pad.\n * @param totalLength - The total length of the resulting string.\n * @returns The padded string.\n */\n static addStartingZeros(num: number, totalLength: number): string {\n return String(num).padStart(totalLength, '0');\n }\n\n /**\n * Formats a Date object as a Moncler-style string.\n * @param dData - The date to format.\n * @param bAddMs - Whether to include milliseconds.\n * @returns The formatted date string.\n */\n static dateToMoncler(dData: Date, bAddMs: boolean = false): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n const hh = this.addStartingZeros(dData.getHours(), 2);\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\n return bAddMs ? `${yy}${mm}${dd}${hh}${nn}${ss}${ms}` : `${yy}${mm}${dd}${hh}${nn}${ss}`;\n }\n\n /**\n * Formats a Date object as a SQL-style string.\n * @param dData - The date to format.\n * @param bAddMs - Whether to include milliseconds.\n * @returns The formatted date string.\n */\n static dateToSql(dData: Date, bAddMs: boolean = false): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n const hh = this.addStartingZeros(dData.getHours(), 2);\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\n return bAddMs\n ? `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}.${ms}`\n : `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}`;\n }\n\n /**\n * Formats a Date object as a simple string (dd-MM-yyyy).\n * @param dData - The date to format.\n * @returns The formatted date string.\n */\n static dateToSimple(dData: Date): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n return `${dd}-${mm}-${yy}`;\n }\n\n /**\n * Gets the current date and time as a formatted string.\n * @returns The current date and time in the format dd.MM.yyyy HH:mm:ss.\n */\n static getNowDateString(): string {\n const now: Date = new Date();\n const day = now.getDate().toString().padStart(2, \"0\");\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const year = now.getFullYear();\n const hours = now.getHours().toString().padStart(2, \"0\");\n const minutes = now.getMinutes().toString().padStart(2, \"0\");\n const seconds = now.getSeconds().toString().padStart(2, \"0\");\n return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;\n }\n\n /**\n * Parses a date string in the format dd/MM/yyyy into a Date object.\n * @param date - The date string to parse.\n * @returns A Date object.\n */\n static parseDate(date: string): Date {\n const parts: string[] = date.split(\"/\");\n return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));\n }\n}\n\n\nexport class RestUtilities {\n /**\n * Sends an OK message as a response.\n * @param res - Express Response object.\n * @param message - The success message.\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\n * @returns The Response object.\n */\n static sendOKMessage(res: Response, message: string, status: number = 200): Response {\n return res.status(status).send({\n severity: \"success\",\n status,\n statusCode: StatusCode.Ok,\n message,\n });\n }\n\n /**\n * Sends an error message as a response.\n * @param res - Express Response object.\n * @param error - The error to send.\n * @param tag - Optional tag for additional context.\n * @param status - HTTP status code (default: 500).\n * @returns The Response object.\n */\n static sendErrorMessage(res: Response, error: unknown, _tag: string = \"[BASE ERROR]\", status: number = 500): Response {\n const rawMessage = error instanceof Error ? error.message : String(error ?? \"\");\n const errorWithResponse = error as { getResponse?: () => unknown } | null | undefined;\n const exceptionResponse = typeof errorWithResponse?.getResponse === \"function\"\n ? errorWithResponse.getResponse()\n : undefined;\n const exceptionPayload = exceptionResponse && typeof exceptionResponse === \"object\"\n ? exceptionResponse as { code?: unknown; message?: unknown; details?: unknown }\n : undefined;\n const explicitCode = typeof exceptionPayload?.code === \"string\" ? exceptionPayload.code : undefined;\n const explicitMessage = typeof exceptionPayload?.message === \"string\" ? exceptionPayload.message : undefined;\n const explicitDetails = Array.isArray(exceptionPayload?.details)\n ? exceptionPayload.details.filter((detail): detail is string => typeof detail === \"string\")\n : undefined;\n const schemaError = this.isDatabaseSchemaError(error);\n // Per le HttpException lo status corretto e quello dell'eccezione (es. 400 di validazione),\n // anche quando il chiamante non lo passa esplicitamente. Lo status esplicito vale per gli altri errori.\n const exceptionStatus = typeof errorWithResponse?.getResponse === \"function\"\n ? Number((error as { getStatus?: () => number }).getStatus?.())\n : undefined;\n const effectiveStatus = schemaError\n ? 503\n : Number.isInteger(exceptionStatus) && (exceptionStatus as number) >= 400\n ? (exceptionStatus as number)\n : status;\n const code = schemaError\n ? \"ACCESSI_DATABASE_SCHEMA_OUTDATED\"\n : explicitCode ?? (effectiveStatus >= 500\n ? \"ACCESSI_INTERNAL_ERROR\"\n : effectiveStatus === 401\n ? \"ACCESSI_UNAUTHORIZED\"\n : effectiveStatus === 403\n ? \"ACCESSI_FORBIDDEN\"\n : \"ACCESSI_REQUEST_ERROR\");\n const message = schemaError\n ? \"Lo schema del database Accessi non e aggiornato. Eseguire la migrazione database e riprovare.\"\n : explicitMessage ?? (effectiveStatus >= 500\n ? \"Errore interno del modulo Accessi.\"\n : effectiveStatus === 401\n ? \"Autenticazione non valida o scaduta.\"\n : effectiveStatus === 403\n ? \"Operazione non autorizzata.\"\n : rawMessage || \"Richiesta non valida.\");\n\n return res.status(effectiveStatus).send({\n severity: \"error\",\n status: effectiveStatus,\n statusCode: StatusCode.Error,\n code,\n message,\n // Compatibilita: il campo storico resta presente, ma non espone SQL, stack o dati sensibili.\n error: code,\n ...(explicitDetails?.length ? { details: explicitDetails } : {}),\n });\n }\n\n /** Riconosce errori di metadata Firebird che richiedono una migrazione. */\n static isDatabaseSchemaError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /column unknown|table unknown|dynamic sql error|unsuccessful metadata update|invalid request blr/i.test(message);\n }\n\n\n static sendUnauthorized(res: Response): Response {\n return res.status(401).send({\n severity: \"error\",\n status: 401,\n statusCode: StatusCode.Error,\n code: \"ACCESSI_UNAUTHORIZED\",\n error: \"ACCESSI_UNAUTHORIZED\",\n message: \"Autenticazione non valida o scaduta.\",\n });\n }\n\n static sendInvalidCredentials(res: Response): Response {\n return res.status(401).send({\n severity: \"error\",\n status: 401,\n statusCode: StatusCode.Error,\n code: \"ACCESSI_INVALID_CREDENTIALS\",\n error: \"ACCESSI_INVALID_CREDENTIALS\",\n message: \"Credenziali non valide\",\n });\n }\n\n static sendPasswordExpired(res: Response): Response {\n return res.status(403).send({\n severity: \"warning\",\n status: 403,\n statusCode: StatusCode.Warning,\n code: \"PASSWORD_EXPIRED\",\n error: \"PASSWORD_EXPIRED\",\n message: \"Password scaduta. E' necessario aggiornarla\"\n })\n }\n\n /**\n * Sends a base response with a payload.\n * @param res - Express Response object.\n * @param payload - The payload to include in the response.\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\n * @returns The Response object.\n */\n static sendBaseResponse(res: Response, payload: unknown, status: number = 200): Response {\n try {\n payload = JSON.parse(JSON.stringify(payload));\n const response = {\n Status: {\n errorCode: \"0\",\n errorDescription: \"\",\n },\n Result: payload,\n Message: \"Dati recuperati con successo.\",\n };\n return res.status(status).send(response);\n } catch (error) {\n return this.sendErrorMessage(res, `Error sending response: ${error}`, \"[UTILITIES]\", 500);\n }\n }\n\n /**\n * Sends an execution message as a response.\n * @param res - Express Response object.\n * @param executionObject - The execution data.\n * @param title - The title of the response.\n * @param status - HTTP success status. Defaults to 200.\n * @returns The Response object.\n */\n static sendExecMessage(res: Response, executionObject: unknown, title: string, status: number = 200): Response {\n try {\n const response = {\n Status: {\n errorCode: \"0\",\n errorDescription: \"\",\n },\n Sql: \"\",\n ID: (executionObject as { id?: unknown } | null | undefined)?.id,\n data: executionObject,\n Title: title,\n };\n return res.status(status).send(response);\n } catch (error) {\n return this.sendErrorMessage(res, `Error sending execution message: ${error}`, title, 500);\n }\n }\n\n /**\n * Prints a SQL query with parameters replaced. Replacement is literal: values\n * containing `?` or `$&` no longer corrupt the output as in the legacy\n * `String.replace` implementation.\n * @param query - The SQL query.\n * @param params - The parameters to replace.\n * @returns The formatted query.\n */\n static printQueryWithParams(query: string = \"\", params: unknown[] = []): string {\n let index = 0;\n return query.replace(/\\?/g, () => {\n if (index >= params.length) {\n return \"?\";\n }\n const param = params[index++];\n return param === undefined || param === null ? \"NULL\" : String(param);\n });\n }\n\n\n public static convertKeysToCamelCase<T = Record<string, unknown>>(obj: unknown): T {\n if (obj !== null && typeof obj === \"object\" && obj.constructor === Object) {\n const source = obj as Record<string, unknown>;\n const converted = Object.keys(source).reduce((acc: Record<string, unknown>, key: string) => {\n const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => (g[1] ?? '').toUpperCase());\n acc[camelCaseKey] = source[key];\n return acc;\n }, {});\n return converted as T;\n }\n return obj as T;\n }\n}\n\n\nexport class CryptUtilities {\n private static readonly logger = new Logger(CryptUtilities.name);\n\n /**\n * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.\n * \n * @param plainText - Il testo in chiaro da cifrare.\n * @param key - La chiave di cifratura (16 byte per AES-128).\n * @param outputEncoding - Codifica del risultato cifrato (predefinito: \"base64\").\n * @returns Il testo cifrato codificato.\n * @throws Errore in caso di problemi durante la cifratura.\n */\n public static encrypt(plainData: string, key: string, outputEncoding: BufferEncoding = \"base64\"): string {\n try {\n // Crea un oggetto Cipher usando AES-128 in modalità ECB\n const cipher = crypto.createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n\n // Cifra il testo in chiaro e finalizza il processo\n const encryptedBuffer = Buffer.concat([\n cipher.update(plainData, \"utf8\"),\n cipher.final(),\n ]);\n\n // Restituisce il risultato cifrato codificato\n return encryptedBuffer.toString(outputEncoding);\n } catch (error) {\n // Gestisce eventuali errori di cifratura\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Errore durante la cifratura: ${message}`);\n }\n }\n\n /**\n * Decifra un testo cifrato usando l'algoritmo AES-128 in modalità ECB.\n * \n * @param encryptedData - Il testo cifrato da decifrare.\n * @param key - La chiave di decifratura (16 byte per AES-128).\n * @returns Il testo decifrato o null in caso di errore.\n */\n public static decrypt(encryptedData: string, key: string): string | null {\n try {\n // Crea un oggetto Decipher usando AES-128 in modalità ECB\n const decipher = crypto.createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n decipher.setAutoPadding(false);\n\n // Decifra il testo cifrato\n let decoded = decipher.update(encryptedData, \"base64\", \"utf8\");\n decoded += decipher.final(\"utf8\");\n\n // Rimuove il padding manuale\n const lastChar = decoded.charCodeAt(decoded.length - 1);\n decoded = decoded.slice(0, decoded.length - lastChar);\n\n return decoded;\n } catch (error) {\n CryptUtilities.logger.error(\"Errore durante la decifratura:\", error);\n return null;\n }\n }\n}\n\nexport class PasswordUtilities {\n private static readonly HASH_PREFIX = \"scrypt\";\n private static readonly LEGACY_HASH_PREFIX = \"scrypt-legacy\";\n private static readonly SCRYPT_N = 16384;\n private static readonly SCRYPT_R = 8;\n private static readonly SCRYPT_P = 1;\n private static readonly SALT_LENGTH = 16;\n\n private static hashSecret(secretValue: string, prefix: string): string {\n if (typeof secretValue !== \"string\" || secretValue.length === 0) {\n throw new Error(\"Il valore da proteggere non puo essere vuoto.\");\n }\n const salt = crypto.randomBytes(this.SALT_LENGTH).toString(\"hex\");\n const derivedKey = crypto.scryptSync(\n secretValue,\n salt,\n 64,\n {\n N: this.SCRYPT_N,\n r: this.SCRYPT_R,\n p: this.SCRYPT_P,\n maxmem: 64 * 1024 * 1024,\n },\n );\n\n return [\n prefix,\n this.SCRYPT_N,\n this.SCRYPT_R,\n this.SCRYPT_P,\n salt,\n derivedKey.toString(\"hex\"),\n ].join(\"$\");\n }\n\n private static hasPrefix(value: string, prefix: string): boolean {\n return typeof value === \"string\" && value.startsWith(`${prefix}$`);\n }\n\n private static parseHash(\n storedPassword: string,\n expectedPrefix: string\n ): {\n salt: string;\n expectedHash: Buffer;\n N: number;\n r: number;\n p: number;\n } | null {\n if (!this.hasPrefix(storedPassword, expectedPrefix)) {\n return null;\n }\n\n const [, rawN, rawR, rawP, salt, expectedHashHex] = storedPassword.split(\"$\");\n const N = Number(rawN);\n const r = Number(rawR);\n const p = Number(rawP);\n\n if (!salt || !expectedHashHex || !Number.isFinite(N) || !Number.isFinite(r) || !Number.isFinite(p)) {\n return null;\n }\n\n const expectedHash = Buffer.from(expectedHashHex, \"hex\");\n if (expectedHash.length === 0) {\n return null;\n }\n\n return {\n salt,\n expectedHash,\n N,\n r,\n p,\n };\n }\n\n private static verifySecret(secretValue: string, storedPassword: string, expectedPrefix: string): boolean {\n if (typeof secretValue !== \"string\") {\n return false;\n }\n\n const parsedHash = this.parseHash(storedPassword, expectedPrefix);\n if (!parsedHash) {\n return false;\n }\n\n const derivedKey = crypto.scryptSync(\n secretValue,\n parsedHash.salt,\n parsedHash.expectedHash.length,\n {\n N: parsedHash.N,\n r: parsedHash.r,\n p: parsedHash.p,\n maxmem: 64 * 1024 * 1024,\n },\n );\n\n return crypto.timingSafeEqual(derivedKey, parsedHash.expectedHash);\n }\n\n public static hashPassword(plainPassword: string): string {\n return this.hashSecret(plainPassword, this.HASH_PREFIX);\n }\n\n public static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string {\n return this.hashSecret(legacyEncryptedPassword, this.LEGACY_HASH_PREFIX);\n }\n\n public static isPasswordHash(value: string): boolean {\n return this.hasPrefix(value, this.HASH_PREFIX);\n }\n\n public static isLegacyPasswordHash(value: string): boolean {\n return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);\n }\n\n /** Confronto a tempo costante tra due stringhe (per dati legacy non hashati). */\n public static timingSafeStringEquals(value: string, candidate: string): boolean {\n if (typeof value !== \"string\" || typeof candidate !== \"string\") {\n return false;\n }\n\n const valueBuffer = Buffer.from(value, \"utf8\");\n const candidateBuffer = Buffer.from(candidate, \"utf8\");\n\n if (valueBuffer.length !== candidateBuffer.length) {\n // Confronta comunque per non rivelare la lunghezza tramite timing.\n crypto.timingSafeEqual(valueBuffer, valueBuffer);\n return false;\n }\n\n return crypto.timingSafeEqual(valueBuffer, candidateBuffer);\n }\n\n public static verifyPassword(plainPassword: string, storedPassword: string): boolean {\n return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);\n }\n\n public static verifyLegacyEncryptedPassword(\n legacyEncryptedPassword: string,\n storedPassword: string\n ): boolean {\n return this.verifySecret(legacyEncryptedPassword, storedPassword, this.LEGACY_HASH_PREFIX);\n }\n}\n\n\n\n\n\n/**\n * Utility class for managing database-related configurations and operations.\n */\nexport class DatabaseUtilities {\n /**\n * Creates a configuration object for connecting to a Firebird database.\n *\n * @param {string} host - The hostname or IP address of the database server.\n * @param {number} port - The port number on which the database server is running.\n * @param {string} database - The path or alias of the database to connect to.\n * @param {string} [username='SYSDBA'] - The username for authentication. Defaults to 'SYSDBA'.\n * @param {string} [password='masterkey'] - The password for authentication. Defaults to 'masterkey'.\n * @returns {Options} - The configuration object to use for establishing a Firebird database connection.\n *\n * @example\n * ```typescript\n * const options = DatabaseUtilities.createOption(\n * 'localhost',\n * 3050,\n * '/path/to/database.fdb',\n * 'myUsername',\n * 'myPassword'\n * );\n * ```\n */\n public static createOption(\n host: string,\n port: number,\n database: string,\n username = 'SYSDBA',\n password = 'masterkey'\n ): FirebirdOptions {\n return {\n host, // The hostname or IP address of the database server.\n port, // The port number used by the database server.\n user: username, // The username for database authentication.\n password, // The password for database authentication.\n database, // The path or alias of the target database.\n lowercase_keys: false, // Determines if the keys in query results should be in lowercase. Default: false.\n role: undefined, // The role for the database connection. Default: undefined.\n pageSize: 100000, // The page size for database transactions. Default: 100,000.\n retryConnectionInterval: 1000, // The interval (in ms) to retry a failed connection. Default: 1,000 ms.\n blobAsText: true, // Determines if BLOB fields should be treated as text. Default: true.\n connectTimeout: 15000,\n connectTimeoutMs: 15000,\n trimStringResults: true,\n };\n }\n}\n\nconst deprecationLogger = new Logger('Deprecated');\n\nexport function Deprecated(message: string) {\n return function (target: object, key?: string, descriptor?: PropertyDescriptor) {\n void target;\n void key;\n void descriptor;\n deprecationLogger.warning(`[DEPRECATED] ${message}`);\n };\n }\n"]}
|