emilsoftware-utilities 2.0.0-dev.24 → 2.0.0-dev.26
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 +5 -0
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +82 -46
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
- package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +9 -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.26.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
|
@@ -94,32 +94,54 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
94
94
|
return rows.length > 0;
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
|
+
/** Nome deterministico del CHECK che replica NOT NULL su Firebird 2.5 (limite identificatore: 31 caratteri). */
|
|
98
|
+
static notNullConstraint(table, column) {
|
|
99
|
+
return `CK_NN_${table}_${column}`.toUpperCase().slice(0, 31);
|
|
100
|
+
}
|
|
101
|
+
/** Su Firebird 2.5 NOT NULL sulle colonne esistenti e' replicato da un CHECK: la verifica lo accetta. */
|
|
102
|
+
static notNullEnforcedByCheck(checks, engineMajor, table, column) {
|
|
103
|
+
if (engineMajor >= 3)
|
|
104
|
+
return false;
|
|
105
|
+
const name = this.notNullConstraint(table, column);
|
|
106
|
+
return checks.some(row => row.NAME === name && this.sameCheck(String(row.CHECK_SOURCE), `${column} IS NOT NULL`));
|
|
107
|
+
}
|
|
97
108
|
static relationIssues(options) {
|
|
98
109
|
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
// RDB$VIEW_BLR esiste in tutte le versioni; RDB$RELATION_TYPE solo da Firebird 3.0.
|
|
111
|
+
// Una vista ha RDB$VIEW_BLR non nullo: se una tabella Accessi esiste come vista, va segnalato.
|
|
112
|
+
const rows = yield this.query(options, `SELECT TRIM(RDB$RELATION_NAME) AS NAME
|
|
113
|
+
FROM RDB$RELATIONS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0 AND RDB$VIEW_BLR IS NOT NULL`);
|
|
114
|
+
return rows.filter(row => accessiSchema_1.accessiTables[String(row.NAME)]).map(row => `${row.NAME}: richiesta tabella persistente, trovata vista`);
|
|
102
115
|
});
|
|
103
116
|
}
|
|
104
|
-
static
|
|
117
|
+
static engineInfo(options) {
|
|
105
118
|
return __awaiter(this, void 0, void 0, function* () {
|
|
106
119
|
var _a, _b;
|
|
107
120
|
const rows = yield this.query(options, "SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') AS ENGINE_VERSION FROM RDB$DATABASE");
|
|
108
121
|
const version = String((_b = (_a = rows[0]) === null || _a === void 0 ? void 0 : _a.ENGINE_VERSION) !== null && _b !== void 0 ? _b : 'sconosciuta');
|
|
109
|
-
|
|
110
|
-
|
|
122
|
+
const match = /^(\d+)(?:\.(\d+))?/.exec(version);
|
|
123
|
+
return { version, major: match ? Number(match[1]) : Number.NaN, minor: (match === null || match === void 0 ? void 0 : match[2]) ? Number(match[2]) : 0 };
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
static engineIssue(options) {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
const { version, major, minor } = yield this.engineInfo(options);
|
|
129
|
+
// Firebird 2.5 e successivi: la 2.5 usa CREATE GENERATOR, dalla 3.0 lo schema usa CREATE SEQUENCE.
|
|
130
|
+
const supported = major > 2 || (major === 2 && minor >= 5);
|
|
131
|
+
if (!supported)
|
|
132
|
+
return `Firebird ${version}: lo schema Accessi richiede Firebird 2.5 o successivo`;
|
|
111
133
|
});
|
|
112
134
|
}
|
|
113
135
|
static columns(options) {
|
|
114
136
|
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
-
return this.query(options, `SELECT TRIM(RF.RDB$RELATION_NAME) AS TABLE_NAME, TRIM(RF.RDB$FIELD_NAME) AS COLUMN_NAME,
|
|
116
|
-
F.RDB$FIELD_TYPE AS FIELD_TYPE, F.RDB$FIELD_SUB_TYPE AS SUB_TYPE, F.RDB$FIELD_SCALE AS FIELD_SCALE,
|
|
117
|
-
F.RDB$CHARACTER_LENGTH AS TEXT_LENGTH, TRIM(CS.RDB$CHARACTER_SET_NAME) AS CHARSET_NAME,
|
|
118
|
-
COALESCE(RF.RDB$NULL_FLAG, F.RDB$NULL_FLAG, 0) AS NOT_NULL,
|
|
119
|
-
CAST(COALESCE(RF.RDB$DEFAULT_SOURCE, F.RDB$DEFAULT_SOURCE) AS VARCHAR(1024)) AS DEFAULT_SOURCE,
|
|
120
|
-
CASE WHEN F.RDB$COMPUTED_BLR IS NULL THEN 0 ELSE 1 END AS IS_COMPUTED
|
|
121
|
-
FROM RDB$RELATION_FIELDS RF JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
|
|
122
|
-
LEFT JOIN RDB$CHARACTER_SETS CS ON CS.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID
|
|
137
|
+
return this.query(options, `SELECT TRIM(RF.RDB$RELATION_NAME) AS TABLE_NAME, TRIM(RF.RDB$FIELD_NAME) AS COLUMN_NAME,
|
|
138
|
+
F.RDB$FIELD_TYPE AS FIELD_TYPE, F.RDB$FIELD_SUB_TYPE AS SUB_TYPE, F.RDB$FIELD_SCALE AS FIELD_SCALE,
|
|
139
|
+
F.RDB$CHARACTER_LENGTH AS TEXT_LENGTH, TRIM(CS.RDB$CHARACTER_SET_NAME) AS CHARSET_NAME,
|
|
140
|
+
COALESCE(RF.RDB$NULL_FLAG, F.RDB$NULL_FLAG, 0) AS NOT_NULL,
|
|
141
|
+
CAST(COALESCE(RF.RDB$DEFAULT_SOURCE, F.RDB$DEFAULT_SOURCE) AS VARCHAR(1024)) AS DEFAULT_SOURCE,
|
|
142
|
+
CASE WHEN F.RDB$COMPUTED_BLR IS NULL THEN 0 ELSE 1 END AS IS_COMPUTED
|
|
143
|
+
FROM RDB$RELATION_FIELDS RF JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
|
|
144
|
+
LEFT JOIN RDB$CHARACTER_SETS CS ON CS.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID
|
|
123
145
|
WHERE RF.RDB$RELATION_NAME IN (${Object.keys(accessiSchema_1.accessiTables).map(name => `'${name}'`).join(', ')})`);
|
|
124
146
|
});
|
|
125
147
|
}
|
|
@@ -162,15 +184,15 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
162
184
|
}
|
|
163
185
|
static constraints(options) {
|
|
164
186
|
return __awaiter(this, void 0, void 0, function* () {
|
|
165
|
-
return this.query(options, `SELECT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME, TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME,
|
|
166
|
-
TRIM(C.RDB$CONSTRAINT_TYPE) AS KIND, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME, S.RDB$FIELD_POSITION AS POS,
|
|
167
|
-
TRIM(T.RDB$RELATION_NAME) AS TARGET_TABLE, TRIM(TS.RDB$FIELD_NAME) AS TARGET_COLUMN,
|
|
168
|
-
TRIM(R.RDB$DELETE_RULE) AS DELETE_RULE
|
|
169
|
-
FROM RDB$RELATION_CONSTRAINTS C
|
|
170
|
-
LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = C.RDB$INDEX_NAME
|
|
171
|
-
LEFT JOIN RDB$REF_CONSTRAINTS R ON R.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME
|
|
172
|
-
LEFT JOIN RDB$RELATION_CONSTRAINTS T ON T.RDB$CONSTRAINT_NAME = R.RDB$CONST_NAME_UQ
|
|
173
|
-
LEFT JOIN RDB$INDEX_SEGMENTS TS ON TS.RDB$INDEX_NAME = T.RDB$INDEX_NAME AND TS.RDB$FIELD_POSITION = S.RDB$FIELD_POSITION
|
|
187
|
+
return this.query(options, `SELECT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME, TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME,
|
|
188
|
+
TRIM(C.RDB$CONSTRAINT_TYPE) AS KIND, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME, S.RDB$FIELD_POSITION AS POS,
|
|
189
|
+
TRIM(T.RDB$RELATION_NAME) AS TARGET_TABLE, TRIM(TS.RDB$FIELD_NAME) AS TARGET_COLUMN,
|
|
190
|
+
TRIM(R.RDB$DELETE_RULE) AS DELETE_RULE
|
|
191
|
+
FROM RDB$RELATION_CONSTRAINTS C
|
|
192
|
+
LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = C.RDB$INDEX_NAME
|
|
193
|
+
LEFT JOIN RDB$REF_CONSTRAINTS R ON R.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME
|
|
194
|
+
LEFT JOIN RDB$RELATION_CONSTRAINTS T ON T.RDB$CONSTRAINT_NAME = R.RDB$CONST_NAME_UQ
|
|
195
|
+
LEFT JOIN RDB$INDEX_SEGMENTS TS ON TS.RDB$INDEX_NAME = T.RDB$INDEX_NAME AND TS.RDB$FIELD_POSITION = S.RDB$FIELD_POSITION
|
|
174
196
|
ORDER BY C.RDB$CONSTRAINT_NAME, S.RDB$FIELD_POSITION`);
|
|
175
197
|
});
|
|
176
198
|
}
|
|
@@ -191,10 +213,10 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
191
213
|
}
|
|
192
214
|
static checks(options) {
|
|
193
215
|
return __awaiter(this, void 0, void 0, function* () {
|
|
194
|
-
return this.query(options, `SELECT DISTINCT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME,
|
|
195
|
-
TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME, CAST(T.RDB$TRIGGER_SOURCE AS VARCHAR(2048)) AS CHECK_SOURCE
|
|
196
|
-
FROM RDB$RELATION_CONSTRAINTS C JOIN RDB$CHECK_CONSTRAINTS K ON K.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME
|
|
197
|
-
JOIN RDB$TRIGGERS T ON T.RDB$TRIGGER_NAME = K.RDB$TRIGGER_NAME
|
|
216
|
+
return this.query(options, `SELECT DISTINCT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME,
|
|
217
|
+
TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME, CAST(T.RDB$TRIGGER_SOURCE AS VARCHAR(2048)) AS CHECK_SOURCE
|
|
218
|
+
FROM RDB$RELATION_CONSTRAINTS C JOIN RDB$CHECK_CONSTRAINTS K ON K.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME
|
|
219
|
+
JOIN RDB$TRIGGERS T ON T.RDB$TRIGGER_NAME = K.RDB$TRIGGER_NAME
|
|
198
220
|
WHERE C.RDB$CONSTRAINT_TYPE = 'CHECK'`);
|
|
199
221
|
});
|
|
200
222
|
}
|
|
@@ -204,9 +226,9 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
204
226
|
}
|
|
205
227
|
static indexes(options) {
|
|
206
228
|
return __awaiter(this, void 0, void 0, function* () {
|
|
207
|
-
return this.groups(yield this.query(options, `SELECT TRIM(I.RDB$INDEX_NAME) AS NAME, TRIM(I.RDB$RELATION_NAME) AS TABLE_NAME,
|
|
208
|
-
COALESCE(I.RDB$INDEX_INACTIVE, 0) AS INACTIVE, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME
|
|
209
|
-
FROM RDB$INDICES I LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = I.RDB$INDEX_NAME
|
|
229
|
+
return this.groups(yield this.query(options, `SELECT TRIM(I.RDB$INDEX_NAME) AS NAME, TRIM(I.RDB$RELATION_NAME) AS TABLE_NAME,
|
|
230
|
+
COALESCE(I.RDB$INDEX_INACTIVE, 0) AS INACTIVE, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME
|
|
231
|
+
FROM RDB$INDICES I LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = I.RDB$INDEX_NAME
|
|
210
232
|
ORDER BY I.RDB$INDEX_NAME, S.RDB$FIELD_POSITION`));
|
|
211
233
|
});
|
|
212
234
|
}
|
|
@@ -215,10 +237,10 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
215
237
|
}
|
|
216
238
|
static triggers(options) {
|
|
217
239
|
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
-
return this.query(options, `SELECT TRIM(RDB$TRIGGER_NAME) AS NAME, TRIM(RDB$RELATION_NAME) AS TABLE_NAME,
|
|
219
|
-
RDB$TRIGGER_INACTIVE AS INACTIVE, RDB$TRIGGER_TYPE AS TRIGGER_TYPE,
|
|
220
|
-
CAST(RDB$TRIGGER_SOURCE AS VARCHAR(8191)) AS SOURCE
|
|
221
|
-
FROM RDB$TRIGGERS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0
|
|
240
|
+
return this.query(options, `SELECT TRIM(RDB$TRIGGER_NAME) AS NAME, TRIM(RDB$RELATION_NAME) AS TABLE_NAME,
|
|
241
|
+
RDB$TRIGGER_INACTIVE AS INACTIVE, RDB$TRIGGER_TYPE AS TRIGGER_TYPE,
|
|
242
|
+
CAST(RDB$TRIGGER_SOURCE AS VARCHAR(8191)) AS SOURCE
|
|
243
|
+
FROM RDB$TRIGGERS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0
|
|
222
244
|
AND RDB$RELATION_NAME IN (${Object.keys(accessiSchema_1.accessiTables).map(name => `'${name}'`).join(', ')})`);
|
|
223
245
|
});
|
|
224
246
|
}
|
|
@@ -262,8 +284,10 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
262
284
|
const engine = yield this.engineIssue(options);
|
|
263
285
|
if (engine)
|
|
264
286
|
return { compatible: false, issues: [engine] };
|
|
287
|
+
const { major: engineMajor } = yield this.engineInfo(options);
|
|
265
288
|
const issues = yield this.relationIssues(options);
|
|
266
289
|
const columns = yield this.columns(options);
|
|
290
|
+
const checks = yield this.checks(options);
|
|
267
291
|
const future = yield this.futureVersionIssue(options, columns);
|
|
268
292
|
if (future)
|
|
269
293
|
issues.push(future);
|
|
@@ -282,14 +306,14 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
282
306
|
const problem = this.typeIssue(row, definition);
|
|
283
307
|
if (problem)
|
|
284
308
|
issues.push(`${table}.${name}: ${problem}`);
|
|
285
|
-
if (definition.includes('NOT NULL') && !Number(row.NOT_NULL))
|
|
309
|
+
if (definition.includes('NOT NULL') && !Number(row.NOT_NULL) && !this.notNullEnforcedByCheck(checks, engineMajor, table, name)) {
|
|
286
310
|
issues.push(`${table}.${name}: manca NOT NULL`);
|
|
311
|
+
}
|
|
287
312
|
const expected = this.defaultValue(definition);
|
|
288
313
|
if (expected && this.normalizeDefault(row.DEFAULT_SOURCE) !== this.normalizeDefault(expected))
|
|
289
314
|
issues.push(`${table}.${name}: richiesto DEFAULT ${expected}`);
|
|
290
315
|
}
|
|
291
316
|
}
|
|
292
|
-
const checks = yield this.checks(options);
|
|
293
317
|
for (const check of accessiSchema_1.accessiChecks) {
|
|
294
318
|
if (!checks.some(row => row.TABLE_NAME === check.table && this.sameCheck(String(row.CHECK_SOURCE), check.expression)))
|
|
295
319
|
issues.push(`${check.table}: manca CHECK (${check.expression})`);
|
|
@@ -315,7 +339,7 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
315
339
|
}
|
|
316
340
|
for (const generator of accessiSchema_1.accessiGenerators) {
|
|
317
341
|
if (!(yield this.sequenceExists(options, generator.name)))
|
|
318
|
-
issues.push(`${generator.name}: sequence mancante`);
|
|
342
|
+
issues.push(`${generator.name}: sequence/generatore mancante`);
|
|
319
343
|
else if (columns.some(row => row.TABLE_NAME === generator.table && row.COLUMN_NAME === generator.column)) {
|
|
320
344
|
const rows = yield this.query(options, `SELECT GEN_ID(${generator.name}, 0) AS CURRENT_VALUE, (SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table}) AS MAX_VALUE FROM RDB$DATABASE`);
|
|
321
345
|
if (Number((_a = rows[0]) === null || _a === void 0 ? void 0 : _a.CURRENT_VALUE) < Number((_b = rows[0]) === null || _b === void 0 ? void 0 : _b.MAX_VALUE))
|
|
@@ -347,7 +371,9 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
347
371
|
const engine = yield this.engineIssue(options);
|
|
348
372
|
if (engine)
|
|
349
373
|
throw new Error(engine);
|
|
374
|
+
const { major: engineMajor } = yield this.engineInfo(options);
|
|
350
375
|
const columns = yield this.columns(options);
|
|
376
|
+
const checks = yield this.checks(options);
|
|
351
377
|
const future = yield this.futureVersionIssue(options, columns);
|
|
352
378
|
if (future)
|
|
353
379
|
throw new Error(future);
|
|
@@ -388,7 +414,16 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
388
414
|
if (definition.includes('NOT NULL') && !Number(row.NOT_NULL)) {
|
|
389
415
|
if (expected)
|
|
390
416
|
yield this.execute(options, `UPDATE ${table} SET ${name} = ${expected} WHERE ${name} IS NULL`);
|
|
391
|
-
|
|
417
|
+
if (engineMajor >= 3) {
|
|
418
|
+
yield this.execute(options, `ALTER TABLE ${table} ALTER ${name} SET NOT NULL`);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
// Firebird 2.5 non supporta ALTER ... SET NOT NULL: replica la regola con un CHECK equivalente.
|
|
422
|
+
const nnName = this.notNullConstraint(table, name);
|
|
423
|
+
if (!checks.some(entry => entry.NAME === nnName)) {
|
|
424
|
+
yield this.execute(options, `ALTER TABLE ${table} ADD CONSTRAINT ${nnName} CHECK (${name} IS NOT NULL)`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
392
427
|
}
|
|
393
428
|
}
|
|
394
429
|
}
|
|
@@ -402,8 +437,8 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
402
437
|
yield this.execute(options, `ALTER TABLE ${table} ADD CONSTRAINT PK_${table} PRIMARY KEY (${schema.primaryKey.join(', ')})`);
|
|
403
438
|
}
|
|
404
439
|
// Only preserve provider namespaces already referenced by historical SSO identities.
|
|
405
|
-
yield this.execute(options, `INSERT INTO SSO_PROVIDER (PROVIDER, DESCRIZIONE, FLGATTIVO)
|
|
406
|
-
SELECT DISTINCT I.PROVIDER, I.PROVIDER, 1 FROM UTENTI_IDENTITA_EXT I
|
|
440
|
+
yield this.execute(options, `INSERT INTO SSO_PROVIDER (PROVIDER, DESCRIZIONE, FLGATTIVO)
|
|
441
|
+
SELECT DISTINCT I.PROVIDER, I.PROVIDER, 1 FROM UTENTI_IDENTITA_EXT I
|
|
407
442
|
WHERE NOT EXISTS (SELECT 1 FROM SSO_PROVIDER P WHERE P.PROVIDER = I.PROVIDER)`);
|
|
408
443
|
for (const fk of accessiSchema_1.accessiForeignKeys) {
|
|
409
444
|
const existing = constraints.find(rows => rows[0].KIND === 'FOREIGN KEY' && rows[0].TABLE_NAME === fk.table && this.sameColumns(rows, [fk.column]));
|
|
@@ -420,7 +455,6 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
420
455
|
}
|
|
421
456
|
yield this.execute(options, `ALTER TABLE ${fk.table} ADD CONSTRAINT ${fk.name} FOREIGN KEY (${fk.column}) REFERENCES ${fk.target} (${fk.targetColumn})${fk.cascade ? ' ON DELETE CASCADE' : ''}`);
|
|
422
457
|
}
|
|
423
|
-
const checks = yield this.checks(options);
|
|
424
458
|
for (const check of accessiSchema_1.accessiChecks) {
|
|
425
459
|
if (!checks.some(row => row.TABLE_NAME === check.table && this.sameCheck(String(row.CHECK_SOURCE), check.expression))) {
|
|
426
460
|
yield this.execute(options, `ALTER TABLE ${check.table} ADD CONSTRAINT ${check.name} CHECK (${check.expression})`);
|
|
@@ -435,12 +469,14 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
|
|
|
435
469
|
}
|
|
436
470
|
}
|
|
437
471
|
for (const generator of accessiSchema_1.accessiGenerators) {
|
|
438
|
-
if (!(yield this.sequenceExists(options, generator.name)))
|
|
439
|
-
|
|
472
|
+
if (!(yield this.sequenceExists(options, generator.name))) {
|
|
473
|
+
// Firebird 2.5 non conosce CREATE SEQUENCE: usa CREATE GENERATOR. Da 3.0 si usa la sintassi standard.
|
|
474
|
+
yield this.execute(options, engineMajor >= 3 ? `CREATE SEQUENCE ${generator.name}` : `CREATE GENERATOR ${generator.name}`);
|
|
475
|
+
}
|
|
440
476
|
// Advance by a positive delta only: do not reset an existing sequence or reuse an allocated value.
|
|
441
|
-
yield this.execute(options, `EXECUTE BLOCK AS DECLARE VARIABLE MAX_ID BIGINT; DECLARE VARIABLE CURRENT_ID BIGINT; DECLARE VARIABLE NEXT_ID BIGINT;
|
|
442
|
-
BEGIN SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table} INTO :MAX_ID;
|
|
443
|
-
CURRENT_ID = GEN_ID(${generator.name}, 0);
|
|
477
|
+
yield this.execute(options, `EXECUTE BLOCK AS DECLARE VARIABLE MAX_ID BIGINT; DECLARE VARIABLE CURRENT_ID BIGINT; DECLARE VARIABLE NEXT_ID BIGINT;
|
|
478
|
+
BEGIN SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table} INTO :MAX_ID;
|
|
479
|
+
CURRENT_ID = GEN_ID(${generator.name}, 0);
|
|
444
480
|
IF (MAX_ID > CURRENT_ID) THEN NEXT_ID = GEN_ID(${generator.name}, MAX_ID - CURRENT_ID); END`);
|
|
445
481
|
}
|
|
446
482
|
const triggers = yield this.triggers(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessiDatabaseUpdater.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/AccessiDatabaseUpdater.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAkE;AAElE,2DAAwD;AACxD,mCAAgC;AAChC,yCAAsC;AACtC,mDAAoL;AAKpL,8EAA8E;AAEvE,IAAM,sBAAsB,8BAA5B,MAAM,sBAAuB,SAAQ,iCAAe;IAKzD,YAAwD,cAA8B;QAAI,KAAK,EAAE,CAAC;QAA1C,mBAAc,GAAd,cAAc,CAAgB;IAAa,CAAC;IAE9F,YAAY;8DAAoB,MAAM,wBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;KAAA;IAErG,qGAAqG;IACrG,MAAM,CAAC,UAAU,CAAC,OAAuB;QACvC,IAAI,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,OAAO,CAAC,kBAAkB,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,gBAAgB,KAAa,OAAO,sCAAsB,CAAC,CAAC,CAAC;IAEpE,MAAM,CAAO,iBAAiB,CAAC,OAAuB;;;YACpD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjF,MAAM,IAAI,GAAG,MAAM,SAAG,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAClD,+CAA+C,EAAE,CAAC,mCAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;YACjF,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC;YAChC,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACxG,CAAC;KAAA;IAED,gHAAgH;IAChH,MAAM,CAAC,GAAG,CAAC,OAAuB;;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAA,EAAE,CAAC,IAAI,mCAAI,WAAW,EAAE,MAAA,EAAE,CAAC,IAAI,mCAAI,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAO,KAAK;6DAAC,OAAuB,EAAE,GAAW,EAAE,SAAoB,EAAE;YACrF,OAAO,SAAG,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;KAAA;IAEO,MAAM,CAAO,OAAO;6DAAC,OAAuB,EAAE,GAAW,EAAE,SAAoB,EAAE;YACvF,IAAI,CAAC;gBAAC,MAAM,SAAG,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAAC,CAAC;YACvE,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,KAAK,OAAO,sFAAsF,CAAC,CAAC;YAC3J,CAAC;QACH,CAAC;KAAA;IAEO,MAAM,CAAO,cAAc,CAAC,OAAuB,EAAE,IAAY;;YACvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,2DAA2D,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1H,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,CAAC;KAAA;IAEO,MAAM,CAAO,cAAc,CAAC,OAAuB;;YACzD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;gEACqB,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,6BAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,2DAA2D,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpL,CAAC;KAAA;IAEO,MAAM,CAAO,WAAW,CAAC,OAAuB;;;YACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,wFAAwF,CAAC,CAAC;YACjI,MAAM,OAAO,GAAG,MAAM,CAAC,MAAA,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,cAAc,mCAAI,aAAa,CAAC,CAAC;YACjE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,YAAY,OAAO,wDAAwD,CAAC;QAC/H,CAAC;KAAA;IAEO,MAAM,CAAO,OAAO,CAAC,OAAuB;;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;;;;;;uCAQQ,MAAM,CAAC,IAAI,CAAC,6BAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxG,CAAC;KAAA;IAEO,MAAM,CAAC,YAAY,CAAC,UAAkB;;QAC5C,OAAO,MAAA,4BAA4B,CAAC,IAAI,CAAC,UAAU,CAAC,0CAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,GAAQ,EAAE,UAAkB;;QACnD,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO,wCAAwC,CAAC;QAC7E,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAAE,OAAO,oBAAoB,UAAU,GAAG,CAAC;YACzF,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,aAAa,GAAG,CAAC,WAAW,sBAAsB,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAClI,MAAM,OAAO,GAAG,MAAA,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,0CAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,OAAO;gBAAE,OAAO,iBAAiB,GAAG,CAAC,YAAY,eAAe,OAAO,EAAE,CAAC;QAC/J,CAAC;aAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,OAAO,qBAAqB,UAAU,GAAG,CAAC;QAC/H,CAAC;aAAM,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAAE,OAAO,4BAA4B,CAAC;QACtF,CAAC;aAAM,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE;gBAAE,OAAO,qBAAqB,CAAC;QAClE,CAAC;aAAM,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,yBAAyB,CAAC;QACrG,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAO,WAAW,CAAC,OAAuB;;YACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;;;;;;;2DAS4B,CAAC,CAAC;QAC3D,CAAC;KAAA;IAED,qFAAqF;IAC7E,MAAM,CAAC,MAAM,CAAC,IAAW;QAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAEO,MAAM,CAAO,MAAM,CAAC,OAAuB;;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;;4CAIa,CAAC,CAAC;QAC5C,CAAC;KAAA;IAEO,MAAM,CAAC,SAAS,CAAC,MAAc,EAAE,UAAkB;QACzD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACrG,OAAO,SAAS,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAO,OAAO,CAAC,OAAuB;;YAClD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;sDAGK,CAAC,CAAC,CAAC;QACvD,CAAC;KAAA;IAEO,MAAM,CAAC,WAAW,CAAC,IAAW,EAAE,OAAiB;QACvD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;IAEO,MAAM,CAAO,QAAQ,CAAC,OAAuB;;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;;kCAIG,MAAM,CAAC,IAAI,CAAC,6BAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC;KAAA;IAED,qGAAqG;IAC7F,MAAM,CAAC,iBAAiB,CAAC,GAAQ,EAAE,OAAuC;;QAChF,IAAI,GAAG,CAAC,UAAU,KAAK,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAA,GAAG,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACzI,MAAM,QAAQ,GAA6B;YACzC,SAAS,EAAE,CAAC,oBAAoB,EAAE,kCAAkC,EAAE,8BAA8B,CAAC;YACrG,QAAQ,EAAE,CAAC,oBAAoB,EAAE,iCAAiC,CAAC;YACnE,UAAU,EAAE,CAAC,kBAAkB,EAAE,SAAS,EAAE,kCAAkC,EAAE,gBAAgB,CAAC;YACjG,eAAe,EAAE,CAAC,8BAA8B,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,wBAAwB,CAAC;SACrI,CAAC;QACF,OAAO,CAAC,MAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,CAAC;IAEO,MAAM,CAAO,kBAAkB,CAAC,OAAuB,EAAE,OAAc;;;YAC7E,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,WAAW,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;gBAAE,OAAO;YACjI,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,sCAAsC,OAAO,EAAE,CAAC;YAC7F,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,sCAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC;oBAAE,OAAO,kBAAkB,OAAO,gCAAgC,sCAAsB,wCAAwC,CAAC;gBACxK,IAAI,CAAC,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC;oBAAE,OAAO;YAClD,CAAC;QACH,CAAC;KAAA;IAED,4EAA4E;IAC5E,MAAM,CAAO,aAAa,CAAC,OAAuB;;;YAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAa,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAa,CAAC,EAAE,CAAC;gBAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC;gBAChE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC7E,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;oBAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;wBAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;wBAAC,SAAS;oBAAC,CAAC;oBAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;oBACzD,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,kBAAkB,CAAC,CAAC;oBAC9G,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBAC/C,IAAI,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,uBAAuB,QAAQ,EAAE,CAAC,CAAC;gBAChK,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,6BAAa,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,kBAAkB,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;YAC1L,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACjE,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAa,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,gCAAgC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnO,CAAC;YACD,KAAK,MAAM,EAAE,IAAI,kCAAkB,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,0BAA0B,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;YACnd,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,8BAAc,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,8BAA8B,CAAC,CAAC;YAChM,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,+BAAe,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,8BAA8B,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,KAAK,sCAAsC,CAAC,CAAC;YACrM,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,iCAAiB,EAAE,CAAC;gBAC1C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,qBAAqB,CAAC,CAAC;qBAC1G,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,iBAAiB,SAAS,CAAC,IAAI,+CAA+C,SAAS,CAAC,MAAM,cAAc,SAAS,CAAC,KAAK,kCAAkC,CAAC,CAAC;oBACtM,IAAI,MAAM,CAAC,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,aAAa,CAAC,GAAG,MAAM,CAAC,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,SAAS,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,oDAAoD,CAAC,CAAC;gBACtJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACrD,CAAC;KAAA;IAED,MAAM,CAAO,gBAAgB,CAAC,OAAuB;;YACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,0GAA0G,CAAC,CAAC;QAC7N,CAAC;KAAA;IAEO,MAAM,CAAC,gBAAgB,CAAC,KAAc;QAC5C,OAAO,MAAM,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACjG,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAO,SAAS,CAAC,OAAuB;;YACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,sGAAsG;YACtG,MAAM,QAAQ,GAAa,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC9D,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAa,CAAC,EAAE,CAAC;gBAC5D,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;oBACtF,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBAChD,IAAI,OAAO;4BAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjH,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAa,CAAC,EAAE,CAAC;gBAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC;gBAChE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACzJ,SAAS;gBACX,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;oBAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;4BACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,qCAAqC,KAAK,EAAE,CAAC,CAAC;4BACrF,IAAI,IAAI,CAAC,MAAM;gCAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,IAAI,IAAI,6GAA6G,CAAC,CAAC;wBACzL,CAAC;wBACD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,KAAK,QAAQ,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;oBAChF,CAAC;yBAAM,CAAC;wBACN,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;wBAC/C,IAAI,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;4BAAE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,KAAK,UAAU,IAAI,gBAAgB,QAAQ,EAAE,CAAC,CAAC;wBACzL,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC7D,IAAI,QAAQ;gCAAE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,KAAK,QAAQ,IAAI,MAAM,QAAQ,UAAU,IAAI,UAAU,CAAC,CAAC;4BAC7G,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,KAAK,UAAU,IAAI,eAAe,CAAC,CAAC;wBACjF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACjE,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAa,CAAC,EAAE,CAAC;gBAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;gBACzG,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4FAA4F,CAAC,CAAC;gBACpL,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,KAAK,sBAAsB,KAAK,iBAAiB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7I,CAAC;YACD,qFAAqF;YACrF,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;;oFAEoD,CAAC,CAAC;YAClF,KAAK,MAAM,EAAE,IAAI,kCAAkB,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpJ,IAAI,QAAQ,EAAE,CAAC;oBACb,mFAAmF;oBACnF,yEAAyE;oBACzE,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO;wBAC7B,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS;wBACvC,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;oBACxE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,EAAE,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;wBAC7G,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,qBAAqB,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,0BAA0B,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,iBAAiB,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,gCAAgC,CAAC,CAAC;oBAC/N,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,KAAK,mBAAmB,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,MAAM,gBAAgB,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpM,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,6BAAa,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oBACtH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,KAAK,CAAC,KAAK,mBAAmB,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;gBACrH,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,8BAAc,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACpI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,0EAA0E,CAAC,CAAC;oBAChK,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5G,CAAC;YACH,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,iCAAiB,EAAE,CAAC;gBAC1C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5H,mGAAmG;gBACnG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;oCACE,SAAS,CAAC,MAAM,cAAc,SAAS,CAAC,KAAK;8BACnD,SAAS,CAAC,IAAI;yDACa,SAAS,CAAC,IAAI,6BAA6B,CAAC,CAAC;YAClG,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,+BAAe,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpH,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxG,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,aAAa,OAAO,CAAC,KAAK,iEAAiE,OAAO,CAAC,IAAI,2CAA2C,CAAC,CAAC;oBACtL,CAAC;oBACD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,eAAe,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxI,CAAC;YACH,CAAC;YACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACrC,uFAAuF;YACvF,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,kFAAkF,EAAE,CAAC,mCAAmB,EAAE,sCAAsB,CAAC,CAAC,CAAC;YAC/J,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,sCAAsB,GAAG,CAAC,CAAC;QAC5E,CAAC;KAAA;;AAzWU,wDAAsB;AACP,6BAAM,GAAG,IAAI,eAAM,CAAC,wBAAsB,CAAC,IAAI,CAAC,AAA1C,CAA2C;AACnD,qCAAc,GAAG,IAAI,OAAO,EAAiC,AAA/C,CAAgD;AAC9D,8BAAO,GAAG,IAAI,GAAG,EAAyB,AAAnC,CAAoC;iCAHxD,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAME,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;;GAL3B,sBAAsB,CA0WlC","sourcesContent":["import { Injectable, Inject, OnModuleInit } from '@nestjs/common';\r\nimport type { AccessiOptions } from '../AccessiModule';\r\nimport { DatabaseUpdater } from '../../DatabaseUpdater';\r\nimport { Orm } from '../../Orm';\r\nimport { Logger } from '../../Logger';\r\nimport { ACCESSI_SCHEMA_VERSION, ACCESSI_VERSION_KEY, accessiTables, accessiForeignKeys, accessiIndexes, accessiTriggers, accessiGenerators, accessiChecks } from './accessiSchema';\r\n\r\ntype Row = Record<string, unknown>;\r\nexport interface AccessiSchemaReport { compatible: boolean; issues: string[]; }\r\n\r\n/** Reconciles the actual schema; version labels never bypass verification. */\r\n@Injectable()\r\nexport class AccessiDatabaseUpdater extends DatabaseUpdater implements OnModuleInit {\r\n protected static override logger = new Logger(AccessiDatabaseUpdater.name);\r\n private static readonly initialization = new WeakMap<AccessiOptions, Promise<void>>();\r\n private static readonly running = new Map<string, Promise<void>>();\r\n\r\n constructor(@Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions) { super(); }\r\n\r\n async onModuleInit(): Promise<void> { await AccessiDatabaseUpdater.initialize(this.accessiOptions); }\r\n\r\n /** Shared bootstrap barrier for services in the same Nest module. Failed attempts may be retried. */\r\n static initialize(options: AccessiOptions): Promise<void> {\r\n let pending = this.initialization.get(options);\r\n if (!pending) {\r\n pending = options.autoUpdateDatabase === false ? this.assertCompatible(options) : this.run(options);\r\n this.initialization.set(options, pending);\r\n const cleanup = () => this.initialization.delete(options);\r\n pending.then(cleanup, cleanup);\r\n }\r\n return pending;\r\n }\r\n\r\n static getLatestVersion(): string { return ACCESSI_SCHEMA_VERSION; }\r\n\r\n static async getCurrentVersion(options: AccessiOptions): Promise<string | null> {\r\n if (!(await this.tableExists(options.databaseOptions, 'PARAMETRI'))) return null;\r\n const rows = await Orm.query(options.databaseOptions,\r\n 'SELECT DESPAR FROM PARAMETRI WHERE CODPAR = ?', [ACCESSI_VERSION_KEY], false);\r\n const version = rows[0]?.DESPAR;\r\n return typeof version === 'string' ? version.trim() : version == null ? null : String(version).trim();\r\n }\r\n\r\n /** Serialize callers targeting the same database in this process. Cross-process DDL is a deployment concern. */\r\n static run(options: AccessiOptions): Promise<void> {\r\n const db = options.databaseOptions;\r\n const key = JSON.stringify([db.host ?? 'localhost', db.port ?? 3050, db.database]);\r\n const previous = this.running.get(key) ?? Promise.resolve();\r\n const pending = previous.catch(() => {}).then(() => this.reconcile(options));\r\n this.running.set(key, pending);\r\n const cleanup = () => { if (this.running.get(key) === pending) this.running.delete(key); };\r\n pending.then(cleanup, cleanup);\r\n return pending;\r\n }\r\n\r\n private static async query(options: AccessiOptions, sql: string, params: unknown[] = []): Promise<Row[]> {\r\n return Orm.query(options.databaseOptions, sql, params, false);\r\n }\r\n\r\n private static async execute(options: AccessiOptions, sql: string, params: unknown[] = []): Promise<void> {\r\n try { await Orm.execute(options.databaseOptions, sql, params, false); }\r\n catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Migrazione Accessi interrotta: ${sql}. ${message}. Correggere lo schema/dati indicati e rilanciare; la versione non e stata avanzata.`);\r\n }\r\n }\r\n\r\n private static async sequenceExists(options: AccessiOptions, name: string): Promise<boolean> {\r\n const rows = await this.query(options, 'SELECT 1 FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = ?', [name.toUpperCase()]);\r\n return rows.length > 0;\r\n }\r\n\r\n private static async relationIssues(options: AccessiOptions): Promise<string[]> {\r\n const rows = await this.query(options, `SELECT TRIM(RDB$RELATION_NAME) AS NAME, COALESCE(RDB$RELATION_TYPE, 0) AS KIND\r\n FROM RDB$RELATIONS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0`);\r\n return rows.filter(row => accessiTables[String(row.NAME)] && Number(row.KIND) !== 0).map(row => `${row.NAME}: richiesta tabella persistente, trovato tipo relazione ${row.KIND}`);\r\n }\r\n\r\n private static async engineIssue(options: AccessiOptions): Promise<string | undefined> {\r\n const rows = await this.query(options, \"SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') AS ENGINE_VERSION FROM RDB$DATABASE\");\r\n const version = String(rows[0]?.ENGINE_VERSION ?? 'sconosciuta');\r\n if (!(Number.parseInt(version, 10) >= 3)) return `Firebird ${version}: lo schema Accessi richiede Firebird 3.0 o successivo`;\r\n }\r\n\r\n private static async columns(options: AccessiOptions): Promise<Row[]> {\r\n return this.query(options, `SELECT TRIM(RF.RDB$RELATION_NAME) AS TABLE_NAME, TRIM(RF.RDB$FIELD_NAME) AS COLUMN_NAME,\r\n F.RDB$FIELD_TYPE AS FIELD_TYPE, F.RDB$FIELD_SUB_TYPE AS SUB_TYPE, F.RDB$FIELD_SCALE AS FIELD_SCALE,\r\n F.RDB$CHARACTER_LENGTH AS TEXT_LENGTH, TRIM(CS.RDB$CHARACTER_SET_NAME) AS CHARSET_NAME,\r\n COALESCE(RF.RDB$NULL_FLAG, F.RDB$NULL_FLAG, 0) AS NOT_NULL,\r\n CAST(COALESCE(RF.RDB$DEFAULT_SOURCE, F.RDB$DEFAULT_SOURCE) AS VARCHAR(1024)) AS DEFAULT_SOURCE,\r\n CASE WHEN F.RDB$COMPUTED_BLR IS NULL THEN 0 ELSE 1 END AS IS_COMPUTED\r\n FROM RDB$RELATION_FIELDS RF JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE\r\n LEFT JOIN RDB$CHARACTER_SETS CS ON CS.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID\r\n WHERE RF.RDB$RELATION_NAME IN (${Object.keys(accessiTables).map(name => `'${name}'`).join(', ')})`);\r\n }\r\n\r\n private static defaultValue(definition: string): string | undefined {\r\n return /\\bDEFAULT\\s+('[^']*'|\\S+)/i.exec(definition)?.[1];\r\n }\r\n\r\n private static typeIssue(row: Row, definition: string): string | undefined {\r\n if (Number(row.IS_COMPUTED)) return 'colonna calcolata invece di scrivibile';\r\n const stringLength = /^(?:VAR)?CHAR\\((\\d+)\\)/.exec(definition);\r\n if (stringLength) {\r\n if (![14, 37].includes(Number(row.FIELD_TYPE))) return `richiesto testo (${definition})`;\r\n if (Number(row.TEXT_LENGTH) < Number(stringLength[1])) return `lunghezza ${row.TEXT_LENGTH}, richiesta almeno ${stringLength[1]}`;\r\n const charset = /CHARACTER SET (\\w+)/.exec(definition)?.[1];\r\n if (charset && typeof row.CHARSET_NAME === 'string' && row.CHARSET_NAME.trim() !== charset) return `character set ${row.CHARSET_NAME}, richiesto ${charset}`;\r\n } else if (/^(SMALLINT|INTEGER)/.test(definition)) {\r\n const acceptable = definition.startsWith('SMALLINT') ? [7, 8, 16] : [8, 16];\r\n if (!acceptable.includes(Number(row.FIELD_TYPE)) || Number(row.FIELD_SCALE) !== 0) return `richiesto intero (${definition})`;\r\n } else if (definition.startsWith('DATE')) {\r\n if (![12, 35].includes(Number(row.FIELD_TYPE))) return 'richiesto DATE o TIMESTAMP';\r\n } else if (definition.startsWith('TIMESTAMP')) {\r\n if (Number(row.FIELD_TYPE) !== 35) return 'richiesto TIMESTAMP';\r\n } else if (definition.startsWith('BLOB')) {\r\n if (Number(row.FIELD_TYPE) !== 261 || Number(row.SUB_TYPE) !== 1) return 'richiesto BLOB testuale';\r\n }\r\n return undefined;\r\n }\r\n\r\n private static async constraints(options: AccessiOptions): Promise<Row[]> {\r\n return this.query(options, `SELECT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME, TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME,\r\n TRIM(C.RDB$CONSTRAINT_TYPE) AS KIND, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME, S.RDB$FIELD_POSITION AS POS,\r\n TRIM(T.RDB$RELATION_NAME) AS TARGET_TABLE, TRIM(TS.RDB$FIELD_NAME) AS TARGET_COLUMN,\r\n TRIM(R.RDB$DELETE_RULE) AS DELETE_RULE\r\n FROM RDB$RELATION_CONSTRAINTS C\r\n LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = C.RDB$INDEX_NAME\r\n LEFT JOIN RDB$REF_CONSTRAINTS R ON R.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME\r\n LEFT JOIN RDB$RELATION_CONSTRAINTS T ON T.RDB$CONSTRAINT_NAME = R.RDB$CONST_NAME_UQ\r\n LEFT JOIN RDB$INDEX_SEGMENTS TS ON TS.RDB$INDEX_NAME = T.RDB$INDEX_NAME AND TS.RDB$FIELD_POSITION = S.RDB$FIELD_POSITION\r\n ORDER BY C.RDB$CONSTRAINT_NAME, S.RDB$FIELD_POSITION`);\r\n }\r\n\r\n /** Raggruppa per nome; ogni gruppo e non vuoto per costruzione (tupla non vuota). */\r\n private static groups(rows: Row[]): Array<[Row, ...Row[]]> {\r\n const groups = new Map<string, [Row, ...Row[]]>();\r\n for (const row of rows) {\r\n const key = String(row.NAME);\r\n const existing = groups.get(key);\r\n if (existing) {\r\n existing.push(row);\r\n } else {\r\n groups.set(key, [row]);\r\n }\r\n }\r\n return Array.from(groups.values());\r\n }\r\n\r\n private static async checks(options: AccessiOptions): Promise<Row[]> {\r\n return this.query(options, `SELECT DISTINCT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME,\r\n TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME, CAST(T.RDB$TRIGGER_SOURCE AS VARCHAR(2048)) AS CHECK_SOURCE\r\n FROM RDB$RELATION_CONSTRAINTS C JOIN RDB$CHECK_CONSTRAINTS K ON K.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME\r\n JOIN RDB$TRIGGERS T ON T.RDB$TRIGGER_NAME = K.RDB$TRIGGER_NAME\r\n WHERE C.RDB$CONSTRAINT_TYPE = 'CHECK'`);\r\n }\r\n\r\n private static sameCheck(source: string, expression: string): boolean {\r\n const normalize = (s: string) => s.replace(/^\\s*CHECK\\s*/i, '').replace(/[\\s()]/g, '').toUpperCase();\r\n return normalize(source ?? '') === normalize(expression);\r\n }\r\n\r\n private static async indexes(options: AccessiOptions): Promise<Array<[Row, ...Row[]]>> {\r\n return this.groups(await this.query(options, `SELECT TRIM(I.RDB$INDEX_NAME) AS NAME, TRIM(I.RDB$RELATION_NAME) AS TABLE_NAME,\r\n COALESCE(I.RDB$INDEX_INACTIVE, 0) AS INACTIVE, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME\r\n FROM RDB$INDICES I LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = I.RDB$INDEX_NAME\r\n ORDER BY I.RDB$INDEX_NAME, S.RDB$FIELD_POSITION`));\r\n }\r\n\r\n private static sameColumns(rows: Row[], columns: string[]): boolean {\r\n return rows.map(row => row.COLUMN_NAME).join(',') === columns.join(',');\r\n }\r\n\r\n private static async triggers(options: AccessiOptions): Promise<Row[]> {\r\n return this.query(options, `SELECT TRIM(RDB$TRIGGER_NAME) AS NAME, TRIM(RDB$RELATION_NAME) AS TABLE_NAME,\r\n RDB$TRIGGER_INACTIVE AS INACTIVE, RDB$TRIGGER_TYPE AS TRIGGER_TYPE,\r\n CAST(RDB$TRIGGER_SOURCE AS VARCHAR(8191)) AS SOURCE\r\n FROM RDB$TRIGGERS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0\r\n AND RDB$RELATION_NAME IN (${Object.keys(accessiTables).map(name => `'${name}'`).join(', ')})`);\r\n }\r\n\r\n /** Accept historical formatting and renamed triggers, but require the operations used by Accessi. */\r\n private static compatibleTrigger(row: Row, trigger: typeof accessiTriggers[number]): boolean {\r\n if (row.TABLE_NAME !== trigger.table || Number(row.INACTIVE) || Number(row.TRIGGER_TYPE) !== trigger.type) return false;\r\n const source = String(row.SOURCE ?? '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/--[^\\r\\n]*/g, '').replace(/[\\s()]/g, '').toUpperCase();\r\n const required: Record<string, string[]> = {\r\n UTENTI_BI: ['IFNEW.CODUTEISNULL', 'NEW.CODUTE=GEN_IDGEN_UTENTI_ID,1', 'NEW.DATINS=CURRENT_TIMESTAMP'],\r\n RUOLI_BI: ['IFNEW.CODRUOISNULL', 'NEW.CODRUO=GEN_IDGEN_RUOLI_ID,1'],\r\n FILTRI_BI0: ['IFNEW.PROGISNULL', 'MAXPROG', 'FROMFILTRIWHERECODUTE=NEW.CODUTE', 'NEW.PROG=TOT+1'],\r\n UTENTI_GDPR_BI0: ['NEW.DATACC=CURRENT_TIMESTAMP', 'UPDATEUTENTISETFLGGDPR=1', 'DATGDPR=CURRENT_TIMESTAMP', 'WHERECODUTE=NEW.CODUTE'],\r\n };\r\n return (required[trigger.name] ?? []).every(fragment => source.includes(fragment));\r\n }\r\n\r\n private static async futureVersionIssue(options: AccessiOptions, columns: Row[]): Promise<string | undefined> {\r\n if (!['CODPAR', 'DESPAR'].every(name => columns.some(row => row.TABLE_NAME === 'PARAMETRI' && row.COLUMN_NAME === name))) return;\r\n const version = await this.getCurrentVersion(options);\r\n if (!version) return;\r\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(version)) return `Versione Accessi non riconosciuta: ${version}`;\r\n const actual = version.split('.').map(Number), latest = ACCESSI_SCHEMA_VERSION.split('.').map(Number);\r\n for (let i = 0; i < 3; i++) {\r\n if ((actual[i] ?? 0) > (latest[i] ?? 0)) return `Schema Accessi ${version} piu recente della libreria (${ACCESSI_SCHEMA_VERSION}); downgrade automatico non consentito`;\r\n if ((actual[i] ?? 0) < (latest[i] ?? 0)) return;\r\n }\r\n }\r\n\r\n /** Read-only diagnostics, including when automatic updates are disabled. */\r\n static async inspectSchema(options: AccessiOptions): Promise<AccessiSchemaReport> {\r\n const engine = await this.engineIssue(options);\r\n if (engine) return { compatible: false, issues: [engine] };\r\n const issues: string[] = await this.relationIssues(options);\r\n const columns = await this.columns(options);\r\n const future = await this.futureVersionIssue(options, columns);\r\n if (future) issues.push(future);\r\n for (const [table, schema] of Object.entries(accessiTables)) {\r\n const present = columns.filter(row => row.TABLE_NAME === table);\r\n if (!present.length) { issues.push(`Tabella mancante: ${table}`); continue; }\r\n for (const [name, definition] of Object.entries(schema.columns)) {\r\n const row = present.find(row => row.COLUMN_NAME === name);\r\n if (!row) { issues.push(`Colonna mancante: ${table}.${name}`); continue; }\r\n const problem = this.typeIssue(row, definition);\r\n if (problem) issues.push(`${table}.${name}: ${problem}`);\r\n if (definition.includes('NOT NULL') && !Number(row.NOT_NULL)) issues.push(`${table}.${name}: manca NOT NULL`);\r\n const expected = this.defaultValue(definition);\r\n if (expected && this.normalizeDefault(row.DEFAULT_SOURCE) !== this.normalizeDefault(expected)) issues.push(`${table}.${name}: richiesto DEFAULT ${expected}`);\r\n }\r\n }\r\n const checks = await this.checks(options);\r\n for (const check of accessiChecks) {\r\n if (!checks.some(row => row.TABLE_NAME === check.table && this.sameCheck(String(row.CHECK_SOURCE), check.expression))) issues.push(`${check.table}: manca CHECK (${check.expression})`);\r\n }\r\n const constraints = this.groups(await this.constraints(options));\r\n for (const [table, schema] of Object.entries(accessiTables)) {\r\n if (!constraints.some(rows => rows[0].TABLE_NAME === table && rows[0].KIND === 'PRIMARY KEY' && this.sameColumns(rows, schema.primaryKey))) issues.push(`${table}: chiave primaria richiesta (${schema.primaryKey.join(', ')})`);\r\n }\r\n for (const fk of accessiForeignKeys) {\r\n if (!constraints.some(rows => rows.length === 1 && rows[0].KIND === 'FOREIGN KEY' && rows[0].TABLE_NAME === fk.table && rows[0].COLUMN_NAME === fk.column && rows[0].TARGET_TABLE === fk.target && rows[0].TARGET_COLUMN === fk.targetColumn && (fk.cascade ? rows[0].DELETE_RULE === 'CASCADE' : ['NO ACTION', 'RESTRICT'].includes(String(rows[0].DELETE_RULE))))) issues.push(`${fk.name}: manca FK compatibile ${fk.table}.${fk.column} -> ${fk.target}.${fk.targetColumn}`);\r\n }\r\n const indexes = await this.indexes(options);\r\n for (const index of accessiIndexes) {\r\n if (!indexes.some(rows => rows[0].TABLE_NAME === index.table && !Number(rows[0].INACTIVE) && this.sameColumns(rows, index.columns))) issues.push(`${index.name}: indice mancante o inattivo`);\r\n }\r\n const triggers = await this.triggers(options);\r\n for (const trigger of accessiTriggers) {\r\n if (!triggers.some(row => this.compatibleTrigger(row, trigger))) issues.push(`${trigger.name}: trigger richiesto attivo ${trigger.event} su ${trigger.table}, con le operazioni Accessi previste`);\r\n }\r\n for (const generator of accessiGenerators) {\r\n if (!(await this.sequenceExists(options, generator.name))) issues.push(`${generator.name}: sequence mancante`);\r\n else if (columns.some(row => row.TABLE_NAME === generator.table && row.COLUMN_NAME === generator.column)) {\r\n const rows = await this.query(options, `SELECT GEN_ID(${generator.name}, 0) AS CURRENT_VALUE, (SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table}) AS MAX_VALUE FROM RDB$DATABASE`);\r\n if (Number(rows[0]?.CURRENT_VALUE) < Number(rows[0]?.MAX_VALUE)) issues.push(`${generator.name}: sequence inferiore agli identificativi esistenti`);\r\n }\r\n }\r\n return { compatible: issues.length === 0, issues };\r\n }\r\n\r\n static async assertCompatible(options: AccessiOptions): Promise<void> {\r\n const report = await this.inspectSchema(options);\r\n if (!report.compatible) throw new Error(`Schema database Accessi incompatibile:\\n- ${report.issues.join('\\n- ')}\\nEseguire AccessiDatabaseUpdater.run con un utente autorizzato o correggere lo schema prima dell'avvio.`);\r\n }\r\n\r\n private static normalizeDefault(value: unknown): string {\r\n return String(value ?? '').replace(/^\\s*DEFAULT\\s+/i, '').replace(/[()\\s]/g, '').toUpperCase();\r\n }\r\n\r\n /**\r\n * Riconciliazione idempotente e ripartibile. Firebird non rende utilizzabili gli oggetti\r\n * creati nella stessa transazione (metadata cache), quindi il DDL resta auto-commit per\r\n * statement: eventuali errori a meta vengono recuperati rieseguendo la migrazione e la\r\n * versione viene avanzata solo dopo la verifica finale `assertCompatible`.\r\n */\r\n private static async reconcile(options: AccessiOptions): Promise<void> {\r\n this.logger.info('Verifica dello schema effettivo Accessi.');\r\n const engine = await this.engineIssue(options);\r\n if (engine) throw new Error(engine);\r\n const columns = await this.columns(options);\r\n const future = await this.futureVersionIssue(options, columns);\r\n if (future) throw new Error(future);\r\n // Detect incompatible existing definitions before making any changes. Never guess at data conversion.\r\n const problems: string[] = await this.relationIssues(options);\r\n for (const [table, schema] of Object.entries(accessiTables)) {\r\n for (const [name, definition] of Object.entries(schema.columns)) {\r\n const row = columns.find(row => row.TABLE_NAME === table && row.COLUMN_NAME === name);\r\n if (row) {\r\n const problem = this.typeIssue(row, definition);\r\n if (problem) problems.push(`${table}.${name}: ${problem}`);\r\n }\r\n }\r\n }\r\n if (problems.length) throw new Error(`Schema Accessi richiede intervento sui tipi:\\n- ${problems.join('\\n- ')}`);\r\n for (const [table, schema] of Object.entries(accessiTables)) {\r\n const present = columns.filter(row => row.TABLE_NAME === table);\r\n if (!present.length) {\r\n await this.execute(options, `CREATE TABLE ${table} (${Object.entries(schema.columns).map(([name, definition]) => `${name} ${definition}`).join(', ')})`);\r\n continue;\r\n }\r\n for (const [name, definition] of Object.entries(schema.columns)) {\r\n const row = present.find(row => row.COLUMN_NAME === name);\r\n if (!row) {\r\n if (definition.includes('NOT NULL') && !this.defaultValue(definition)) {\r\n const data = await this.query(options, `SELECT FIRST 1 1 AS HAS_DATA FROM ${table}`);\r\n if (data.length) throw new Error(`Impossibile aggiungere ${table}.${name} obbligatoria: tabella popolata, serve un backfill esplicito. Nessun valore identificativo viene inventato.`);\r\n }\r\n await this.execute(options, `ALTER TABLE ${table} ADD ${name} ${definition}`);\r\n } else {\r\n const expected = this.defaultValue(definition);\r\n if (expected && this.normalizeDefault(row.DEFAULT_SOURCE) !== this.normalizeDefault(expected)) await this.execute(options, `ALTER TABLE ${table} ALTER ${name} SET DEFAULT ${expected}`);\r\n if (definition.includes('NOT NULL') && !Number(row.NOT_NULL)) {\r\n if (expected) await this.execute(options, `UPDATE ${table} SET ${name} = ${expected} WHERE ${name} IS NULL`);\r\n await this.execute(options, `ALTER TABLE ${table} ALTER ${name} SET NOT NULL`);\r\n }\r\n }\r\n }\r\n }\r\n const constraints = this.groups(await this.constraints(options));\r\n for (const [table, schema] of Object.entries(accessiTables)) {\r\n const primary = constraints.find(rows => rows[0].TABLE_NAME === table && rows[0].KIND === 'PRIMARY KEY');\r\n if (primary && !this.sameColumns(primary, schema.primaryKey)) throw new Error(`${table}: chiave primaria esistente incompatibile; nessun vincolo viene eliminato automaticamente.`);\r\n if (!primary) await this.execute(options, `ALTER TABLE ${table} ADD CONSTRAINT PK_${table} PRIMARY KEY (${schema.primaryKey.join(', ')})`);\r\n }\r\n // Only preserve provider namespaces already referenced by historical SSO identities.\r\n await this.execute(options, `INSERT INTO SSO_PROVIDER (PROVIDER, DESCRIZIONE, FLGATTIVO)\r\n SELECT DISTINCT I.PROVIDER, I.PROVIDER, 1 FROM UTENTI_IDENTITA_EXT I\r\n WHERE NOT EXISTS (SELECT 1 FROM SSO_PROVIDER P WHERE P.PROVIDER = I.PROVIDER)`);\r\n for (const fk of accessiForeignKeys) {\r\n const existing = constraints.find(rows => rows[0].KIND === 'FOREIGN KEY' && rows[0].TABLE_NAME === fk.table && this.sameColumns(rows, [fk.column]));\r\n if (existing) {\r\n // Una FK sulla stessa colonna ma verso un target/regola diverso non e compatibile:\r\n // correggere il target cambiando semantica e va segnalato, non ignorato.\r\n const deleteRuleOk = fk.cascade\r\n ? existing[0].DELETE_RULE === 'CASCADE'\r\n : ['NO ACTION', 'RESTRICT'].includes(String(existing[0].DELETE_RULE));\r\n if (existing[0].TARGET_TABLE !== fk.target || existing[0].TARGET_COLUMN !== fk.targetColumn || !deleteRuleOk) {\r\n throw new Error(`${fk.name}: FK esistente su ${fk.table}.${fk.column} incompatibile (target ${existing[0].TARGET_TABLE}.${existing[0].TARGET_COLUMN}, delete rule ${existing[0].DELETE_RULE}); correggerla esplicitamente.`);\r\n }\r\n continue;\r\n }\r\n await this.execute(options, `ALTER TABLE ${fk.table} ADD CONSTRAINT ${fk.name} FOREIGN KEY (${fk.column}) REFERENCES ${fk.target} (${fk.targetColumn})${fk.cascade ? ' ON DELETE CASCADE' : ''}`);\r\n }\r\n const checks = await this.checks(options);\r\n for (const check of accessiChecks) {\r\n if (!checks.some(row => row.TABLE_NAME === check.table && this.sameCheck(String(row.CHECK_SOURCE), check.expression))) {\r\n await this.execute(options, `ALTER TABLE ${check.table} ADD CONSTRAINT ${check.name} CHECK (${check.expression})`);\r\n }\r\n }\r\n const indexes = await this.indexes(options);\r\n for (const index of accessiIndexes) {\r\n if (!indexes.some(rows => rows[0].TABLE_NAME === index.table && !Number(rows[0].INACTIVE) && this.sameColumns(rows, index.columns))) {\r\n if (indexes.some(rows => rows[0].NAME === index.name)) throw new Error(`${index.name}: indice esistente incompatibile o inattivo; correggerlo esplicitamente.`);\r\n await this.execute(options, `CREATE INDEX ${index.name} ON ${index.table} (${index.columns.join(', ')})`);\r\n }\r\n }\r\n for (const generator of accessiGenerators) {\r\n if (!(await this.sequenceExists(options, generator.name))) await this.execute(options, `CREATE SEQUENCE ${generator.name}`);\r\n // Advance by a positive delta only: do not reset an existing sequence or reuse an allocated value.\r\n await this.execute(options, `EXECUTE BLOCK AS DECLARE VARIABLE MAX_ID BIGINT; DECLARE VARIABLE CURRENT_ID BIGINT; DECLARE VARIABLE NEXT_ID BIGINT;\r\n BEGIN SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table} INTO :MAX_ID;\r\n CURRENT_ID = GEN_ID(${generator.name}, 0);\r\n IF (MAX_ID > CURRENT_ID) THEN NEXT_ID = GEN_ID(${generator.name}, MAX_ID - CURRENT_ID); END`);\r\n }\r\n const triggers = await this.triggers(options);\r\n for (const trigger of accessiTriggers) {\r\n if (!triggers.some(row => this.compatibleTrigger(row, trigger)) && !triggers.some(row => row.NAME === trigger.name)) {\r\n if (triggers.some(row => row.TABLE_NAME === trigger.table && Number(row.TRIGGER_TYPE) === trigger.type)) {\r\n throw new Error(`${trigger.table}: trigger ${trigger.event} personalizzato non riconosciuto; verificare le operazioni di ${trigger.name} prima di aggiungere trigger concorrenti.`);\r\n }\r\n await this.execute(options, `CREATE TRIGGER ${trigger.name} FOR ${trigger.table} ACTIVE ${trigger.event} POSITION 0 ${trigger.body}`);\r\n }\r\n }\r\n await this.assertCompatible(options);\r\n // The host's VersioneDB/DBVERSION values belong to the host and are never overwritten.\r\n await this.execute(options, 'UPDATE OR INSERT INTO PARAMETRI (CODPAR, DESPAR) VALUES (?, ?) MATCHING (CODPAR)', [ACCESSI_VERSION_KEY, ACCESSI_SCHEMA_VERSION]);\r\n this.logger.info(`Schema Accessi verificato: ${ACCESSI_SCHEMA_VERSION}.`);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"AccessiDatabaseUpdater.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/AccessiDatabaseUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Inject, OnModuleInit } from '@nestjs/common';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { DatabaseUpdater } from '../../DatabaseUpdater';\nimport { Orm } from '../../Orm';\nimport { Logger } from '../../Logger';\nimport { ACCESSI_SCHEMA_VERSION, ACCESSI_VERSION_KEY, accessiTables, accessiForeignKeys, accessiIndexes, accessiTriggers, accessiGenerators, accessiChecks } from './accessiSchema';\n\ntype Row = Record<string, unknown>;\nexport interface AccessiSchemaReport { compatible: boolean; issues: string[]; }\n\n/** Reconciles the actual schema; version labels never bypass verification. */\n@Injectable()\nexport class AccessiDatabaseUpdater extends DatabaseUpdater implements OnModuleInit {\n protected static override logger = new Logger(AccessiDatabaseUpdater.name);\n private static readonly initialization = new WeakMap<AccessiOptions, Promise<void>>();\n private static readonly running = new Map<string, Promise<void>>();\n\n constructor(@Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions) { super(); }\n\n async onModuleInit(): Promise<void> { await AccessiDatabaseUpdater.initialize(this.accessiOptions); }\n\n /** Shared bootstrap barrier for services in the same Nest module. Failed attempts may be retried. */\n static initialize(options: AccessiOptions): Promise<void> {\n let pending = this.initialization.get(options);\n if (!pending) {\n pending = options.autoUpdateDatabase === false ? this.assertCompatible(options) : this.run(options);\n this.initialization.set(options, pending);\n const cleanup = () => this.initialization.delete(options);\n pending.then(cleanup, cleanup);\n }\n return pending;\n }\n\n static getLatestVersion(): string { return ACCESSI_SCHEMA_VERSION; }\n\n static async getCurrentVersion(options: AccessiOptions): Promise<string | null> {\n if (!(await this.tableExists(options.databaseOptions, 'PARAMETRI'))) return null;\n const rows = await Orm.query(options.databaseOptions,\n 'SELECT DESPAR FROM PARAMETRI WHERE CODPAR = ?', [ACCESSI_VERSION_KEY], false);\n const version = rows[0]?.DESPAR;\n return typeof version === 'string' ? version.trim() : version == null ? null : String(version).trim();\n }\n\n /** Serialize callers targeting the same database in this process. Cross-process DDL is a deployment concern. */\n static run(options: AccessiOptions): Promise<void> {\n const db = options.databaseOptions;\n const key = JSON.stringify([db.host ?? 'localhost', db.port ?? 3050, db.database]);\n const previous = this.running.get(key) ?? Promise.resolve();\n const pending = previous.catch(() => {}).then(() => this.reconcile(options));\n this.running.set(key, pending);\n const cleanup = () => { if (this.running.get(key) === pending) this.running.delete(key); };\n pending.then(cleanup, cleanup);\n return pending;\n }\n\n private static async query(options: AccessiOptions, sql: string, params: unknown[] = []): Promise<Row[]> {\n return Orm.query(options.databaseOptions, sql, params, false);\n }\n\n private static async execute(options: AccessiOptions, sql: string, params: unknown[] = []): Promise<void> {\n try { await Orm.execute(options.databaseOptions, sql, params, false); }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Migrazione Accessi interrotta: ${sql}. ${message}. Correggere lo schema/dati indicati e rilanciare; la versione non e stata avanzata.`);\n }\n }\n\n private static async sequenceExists(options: AccessiOptions, name: string): Promise<boolean> {\n const rows = await this.query(options, 'SELECT 1 FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = ?', [name.toUpperCase()]);\n return rows.length > 0;\n }\n\n /** Nome deterministico del CHECK che replica NOT NULL su Firebird 2.5 (limite identificatore: 31 caratteri). */\n private static notNullConstraint(table: string, column: string): string {\n return `CK_NN_${table}_${column}`.toUpperCase().slice(0, 31);\n }\n\n /** Su Firebird 2.5 NOT NULL sulle colonne esistenti e' replicato da un CHECK: la verifica lo accetta. */\n private static notNullEnforcedByCheck(checks: Row[], engineMajor: number, table: string, column: string): boolean {\n if (engineMajor >= 3) return false;\n const name = this.notNullConstraint(table, column);\n return checks.some(row => row.NAME === name && this.sameCheck(String(row.CHECK_SOURCE), `${column} IS NOT NULL`));\n }\n\n private static async relationIssues(options: AccessiOptions): Promise<string[]> {\n // RDB$VIEW_BLR esiste in tutte le versioni; RDB$RELATION_TYPE solo da Firebird 3.0.\n // Una vista ha RDB$VIEW_BLR non nullo: se una tabella Accessi esiste come vista, va segnalato.\n const rows = await this.query(options, `SELECT TRIM(RDB$RELATION_NAME) AS NAME\n FROM RDB$RELATIONS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0 AND RDB$VIEW_BLR IS NOT NULL`);\n return rows.filter(row => accessiTables[String(row.NAME)]).map(row => `${row.NAME}: richiesta tabella persistente, trovata vista`);\n }\n\n private static async engineInfo(options: AccessiOptions): Promise<{ version: string; major: number; minor: number }> {\n const rows = await this.query(options, \"SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') AS ENGINE_VERSION FROM RDB$DATABASE\");\n const version = String(rows[0]?.ENGINE_VERSION ?? 'sconosciuta');\n const match = /^(\\d+)(?:\\.(\\d+))?/.exec(version);\n return { version, major: match ? Number(match[1]) : Number.NaN, minor: match?.[2] ? Number(match[2]) : 0 };\n }\n\n private static async engineIssue(options: AccessiOptions): Promise<string | undefined> {\n const { version, major, minor } = await this.engineInfo(options);\n // Firebird 2.5 e successivi: la 2.5 usa CREATE GENERATOR, dalla 3.0 lo schema usa CREATE SEQUENCE.\n const supported = major > 2 || (major === 2 && minor >= 5);\n if (!supported) return `Firebird ${version}: lo schema Accessi richiede Firebird 2.5 o successivo`;\n }\n\n private static async columns(options: AccessiOptions): Promise<Row[]> {\n return this.query(options, `SELECT TRIM(RF.RDB$RELATION_NAME) AS TABLE_NAME, TRIM(RF.RDB$FIELD_NAME) AS COLUMN_NAME,\n F.RDB$FIELD_TYPE AS FIELD_TYPE, F.RDB$FIELD_SUB_TYPE AS SUB_TYPE, F.RDB$FIELD_SCALE AS FIELD_SCALE,\n F.RDB$CHARACTER_LENGTH AS TEXT_LENGTH, TRIM(CS.RDB$CHARACTER_SET_NAME) AS CHARSET_NAME,\n COALESCE(RF.RDB$NULL_FLAG, F.RDB$NULL_FLAG, 0) AS NOT_NULL,\n CAST(COALESCE(RF.RDB$DEFAULT_SOURCE, F.RDB$DEFAULT_SOURCE) AS VARCHAR(1024)) AS DEFAULT_SOURCE,\n CASE WHEN F.RDB$COMPUTED_BLR IS NULL THEN 0 ELSE 1 END AS IS_COMPUTED\n FROM RDB$RELATION_FIELDS RF JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE\n LEFT JOIN RDB$CHARACTER_SETS CS ON CS.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID\n WHERE RF.RDB$RELATION_NAME IN (${Object.keys(accessiTables).map(name => `'${name}'`).join(', ')})`);\n }\n\n private static defaultValue(definition: string): string | undefined {\n return /\\bDEFAULT\\s+('[^']*'|\\S+)/i.exec(definition)?.[1];\n }\n\n private static typeIssue(row: Row, definition: string): string | undefined {\n if (Number(row.IS_COMPUTED)) return 'colonna calcolata invece di scrivibile';\n const stringLength = /^(?:VAR)?CHAR\\((\\d+)\\)/.exec(definition);\n if (stringLength) {\n if (![14, 37].includes(Number(row.FIELD_TYPE))) return `richiesto testo (${definition})`;\n if (Number(row.TEXT_LENGTH) < Number(stringLength[1])) return `lunghezza ${row.TEXT_LENGTH}, richiesta almeno ${stringLength[1]}`;\n const charset = /CHARACTER SET (\\w+)/.exec(definition)?.[1];\n if (charset && typeof row.CHARSET_NAME === 'string' && row.CHARSET_NAME.trim() !== charset) return `character set ${row.CHARSET_NAME}, richiesto ${charset}`;\n } else if (/^(SMALLINT|INTEGER)/.test(definition)) {\n const acceptable = definition.startsWith('SMALLINT') ? [7, 8, 16] : [8, 16];\n if (!acceptable.includes(Number(row.FIELD_TYPE)) || Number(row.FIELD_SCALE) !== 0) return `richiesto intero (${definition})`;\n } else if (definition.startsWith('DATE')) {\n if (![12, 35].includes(Number(row.FIELD_TYPE))) return 'richiesto DATE o TIMESTAMP';\n } else if (definition.startsWith('TIMESTAMP')) {\n if (Number(row.FIELD_TYPE) !== 35) return 'richiesto TIMESTAMP';\n } else if (definition.startsWith('BLOB')) {\n if (Number(row.FIELD_TYPE) !== 261 || Number(row.SUB_TYPE) !== 1) return 'richiesto BLOB testuale';\n }\n return undefined;\n }\n\n private static async constraints(options: AccessiOptions): Promise<Row[]> {\n return this.query(options, `SELECT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME, TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME,\n TRIM(C.RDB$CONSTRAINT_TYPE) AS KIND, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME, S.RDB$FIELD_POSITION AS POS,\n TRIM(T.RDB$RELATION_NAME) AS TARGET_TABLE, TRIM(TS.RDB$FIELD_NAME) AS TARGET_COLUMN,\n TRIM(R.RDB$DELETE_RULE) AS DELETE_RULE\n FROM RDB$RELATION_CONSTRAINTS C\n LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = C.RDB$INDEX_NAME\n LEFT JOIN RDB$REF_CONSTRAINTS R ON R.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME\n LEFT JOIN RDB$RELATION_CONSTRAINTS T ON T.RDB$CONSTRAINT_NAME = R.RDB$CONST_NAME_UQ\n LEFT JOIN RDB$INDEX_SEGMENTS TS ON TS.RDB$INDEX_NAME = T.RDB$INDEX_NAME AND TS.RDB$FIELD_POSITION = S.RDB$FIELD_POSITION\n ORDER BY C.RDB$CONSTRAINT_NAME, S.RDB$FIELD_POSITION`);\n }\n\n /** Raggruppa per nome; ogni gruppo e non vuoto per costruzione (tupla non vuota). */\n private static groups(rows: Row[]): Array<[Row, ...Row[]]> {\n const groups = new Map<string, [Row, ...Row[]]>();\n for (const row of rows) {\n const key = String(row.NAME);\n const existing = groups.get(key);\n if (existing) {\n existing.push(row);\n } else {\n groups.set(key, [row]);\n }\n }\n return Array.from(groups.values());\n }\n\n private static async checks(options: AccessiOptions): Promise<Row[]> {\n return this.query(options, `SELECT DISTINCT TRIM(C.RDB$CONSTRAINT_NAME) AS NAME,\n TRIM(C.RDB$RELATION_NAME) AS TABLE_NAME, CAST(T.RDB$TRIGGER_SOURCE AS VARCHAR(2048)) AS CHECK_SOURCE\n FROM RDB$RELATION_CONSTRAINTS C JOIN RDB$CHECK_CONSTRAINTS K ON K.RDB$CONSTRAINT_NAME = C.RDB$CONSTRAINT_NAME\n JOIN RDB$TRIGGERS T ON T.RDB$TRIGGER_NAME = K.RDB$TRIGGER_NAME\n WHERE C.RDB$CONSTRAINT_TYPE = 'CHECK'`);\n }\n\n private static sameCheck(source: string, expression: string): boolean {\n const normalize = (s: string) => s.replace(/^\\s*CHECK\\s*/i, '').replace(/[\\s()]/g, '').toUpperCase();\n return normalize(source ?? '') === normalize(expression);\n }\n\n private static async indexes(options: AccessiOptions): Promise<Array<[Row, ...Row[]]>> {\n return this.groups(await this.query(options, `SELECT TRIM(I.RDB$INDEX_NAME) AS NAME, TRIM(I.RDB$RELATION_NAME) AS TABLE_NAME,\n COALESCE(I.RDB$INDEX_INACTIVE, 0) AS INACTIVE, TRIM(S.RDB$FIELD_NAME) AS COLUMN_NAME\n FROM RDB$INDICES I LEFT JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME = I.RDB$INDEX_NAME\n ORDER BY I.RDB$INDEX_NAME, S.RDB$FIELD_POSITION`));\n }\n\n private static sameColumns(rows: Row[], columns: string[]): boolean {\n return rows.map(row => row.COLUMN_NAME).join(',') === columns.join(',');\n }\n\n private static async triggers(options: AccessiOptions): Promise<Row[]> {\n return this.query(options, `SELECT TRIM(RDB$TRIGGER_NAME) AS NAME, TRIM(RDB$RELATION_NAME) AS TABLE_NAME,\n RDB$TRIGGER_INACTIVE AS INACTIVE, RDB$TRIGGER_TYPE AS TRIGGER_TYPE,\n CAST(RDB$TRIGGER_SOURCE AS VARCHAR(8191)) AS SOURCE\n FROM RDB$TRIGGERS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0\n AND RDB$RELATION_NAME IN (${Object.keys(accessiTables).map(name => `'${name}'`).join(', ')})`);\n }\n\n /** Accept historical formatting and renamed triggers, but require the operations used by Accessi. */\n private static compatibleTrigger(row: Row, trigger: typeof accessiTriggers[number]): boolean {\n if (row.TABLE_NAME !== trigger.table || Number(row.INACTIVE) || Number(row.TRIGGER_TYPE) !== trigger.type) return false;\n const source = String(row.SOURCE ?? '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/--[^\\r\\n]*/g, '').replace(/[\\s()]/g, '').toUpperCase();\n const required: Record<string, string[]> = {\n UTENTI_BI: ['IFNEW.CODUTEISNULL', 'NEW.CODUTE=GEN_IDGEN_UTENTI_ID,1', 'NEW.DATINS=CURRENT_TIMESTAMP'],\n RUOLI_BI: ['IFNEW.CODRUOISNULL', 'NEW.CODRUO=GEN_IDGEN_RUOLI_ID,1'],\n FILTRI_BI0: ['IFNEW.PROGISNULL', 'MAXPROG', 'FROMFILTRIWHERECODUTE=NEW.CODUTE', 'NEW.PROG=TOT+1'],\n UTENTI_GDPR_BI0: ['NEW.DATACC=CURRENT_TIMESTAMP', 'UPDATEUTENTISETFLGGDPR=1', 'DATGDPR=CURRENT_TIMESTAMP', 'WHERECODUTE=NEW.CODUTE'],\n };\n return (required[trigger.name] ?? []).every(fragment => source.includes(fragment));\n }\n\n private static async futureVersionIssue(options: AccessiOptions, columns: Row[]): Promise<string | undefined> {\n if (!['CODPAR', 'DESPAR'].every(name => columns.some(row => row.TABLE_NAME === 'PARAMETRI' && row.COLUMN_NAME === name))) return;\n const version = await this.getCurrentVersion(options);\n if (!version) return;\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(version)) return `Versione Accessi non riconosciuta: ${version}`;\n const actual = version.split('.').map(Number), latest = ACCESSI_SCHEMA_VERSION.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((actual[i] ?? 0) > (latest[i] ?? 0)) return `Schema Accessi ${version} piu recente della libreria (${ACCESSI_SCHEMA_VERSION}); downgrade automatico non consentito`;\n if ((actual[i] ?? 0) < (latest[i] ?? 0)) return;\n }\n }\n\n /** Read-only diagnostics, including when automatic updates are disabled. */\n static async inspectSchema(options: AccessiOptions): Promise<AccessiSchemaReport> {\n const engine = await this.engineIssue(options);\n if (engine) return { compatible: false, issues: [engine] };\n const { major: engineMajor } = await this.engineInfo(options);\n const issues: string[] = await this.relationIssues(options);\n const columns = await this.columns(options);\n const checks = await this.checks(options);\n const future = await this.futureVersionIssue(options, columns);\n if (future) issues.push(future);\n for (const [table, schema] of Object.entries(accessiTables)) {\n const present = columns.filter(row => row.TABLE_NAME === table);\n if (!present.length) { issues.push(`Tabella mancante: ${table}`); continue; }\n for (const [name, definition] of Object.entries(schema.columns)) {\n const row = present.find(row => row.COLUMN_NAME === name);\n if (!row) { issues.push(`Colonna mancante: ${table}.${name}`); continue; }\n const problem = this.typeIssue(row, definition);\n if (problem) issues.push(`${table}.${name}: ${problem}`);\n if (definition.includes('NOT NULL') && !Number(row.NOT_NULL) && !this.notNullEnforcedByCheck(checks, engineMajor, table, name)) {\n issues.push(`${table}.${name}: manca NOT NULL`);\n }\n const expected = this.defaultValue(definition);\n if (expected && this.normalizeDefault(row.DEFAULT_SOURCE) !== this.normalizeDefault(expected)) issues.push(`${table}.${name}: richiesto DEFAULT ${expected}`);\n }\n }\n for (const check of accessiChecks) {\n if (!checks.some(row => row.TABLE_NAME === check.table && this.sameCheck(String(row.CHECK_SOURCE), check.expression))) issues.push(`${check.table}: manca CHECK (${check.expression})`);\n }\n const constraints = this.groups(await this.constraints(options));\n for (const [table, schema] of Object.entries(accessiTables)) {\n if (!constraints.some(rows => rows[0].TABLE_NAME === table && rows[0].KIND === 'PRIMARY KEY' && this.sameColumns(rows, schema.primaryKey))) issues.push(`${table}: chiave primaria richiesta (${schema.primaryKey.join(', ')})`);\n }\n for (const fk of accessiForeignKeys) {\n if (!constraints.some(rows => rows.length === 1 && rows[0].KIND === 'FOREIGN KEY' && rows[0].TABLE_NAME === fk.table && rows[0].COLUMN_NAME === fk.column && rows[0].TARGET_TABLE === fk.target && rows[0].TARGET_COLUMN === fk.targetColumn && (fk.cascade ? rows[0].DELETE_RULE === 'CASCADE' : ['NO ACTION', 'RESTRICT'].includes(String(rows[0].DELETE_RULE))))) issues.push(`${fk.name}: manca FK compatibile ${fk.table}.${fk.column} -> ${fk.target}.${fk.targetColumn}`);\n }\n const indexes = await this.indexes(options);\n for (const index of accessiIndexes) {\n if (!indexes.some(rows => rows[0].TABLE_NAME === index.table && !Number(rows[0].INACTIVE) && this.sameColumns(rows, index.columns))) issues.push(`${index.name}: indice mancante o inattivo`);\n }\n const triggers = await this.triggers(options);\n for (const trigger of accessiTriggers) {\n if (!triggers.some(row => this.compatibleTrigger(row, trigger))) issues.push(`${trigger.name}: trigger richiesto attivo ${trigger.event} su ${trigger.table}, con le operazioni Accessi previste`);\n }\n for (const generator of accessiGenerators) {\n if (!(await this.sequenceExists(options, generator.name))) issues.push(`${generator.name}: sequence/generatore mancante`);\n else if (columns.some(row => row.TABLE_NAME === generator.table && row.COLUMN_NAME === generator.column)) {\n const rows = await this.query(options, `SELECT GEN_ID(${generator.name}, 0) AS CURRENT_VALUE, (SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table}) AS MAX_VALUE FROM RDB$DATABASE`);\n if (Number(rows[0]?.CURRENT_VALUE) < Number(rows[0]?.MAX_VALUE)) issues.push(`${generator.name}: sequence inferiore agli identificativi esistenti`);\n }\n }\n return { compatible: issues.length === 0, issues };\n }\n\n static async assertCompatible(options: AccessiOptions): Promise<void> {\n const report = await this.inspectSchema(options);\n if (!report.compatible) throw new Error(`Schema database Accessi incompatibile:\\n- ${report.issues.join('\\n- ')}\\nEseguire AccessiDatabaseUpdater.run con un utente autorizzato o correggere lo schema prima dell'avvio.`);\n }\n\n private static normalizeDefault(value: unknown): string {\n return String(value ?? '').replace(/^\\s*DEFAULT\\s+/i, '').replace(/[()\\s]/g, '').toUpperCase();\n }\n\n /**\n * Riconciliazione idempotente e ripartibile. Firebird non rende utilizzabili gli oggetti\n * creati nella stessa transazione (metadata cache), quindi il DDL resta auto-commit per\n * statement: eventuali errori a meta vengono recuperati rieseguendo la migrazione e la\n * versione viene avanzata solo dopo la verifica finale `assertCompatible`.\n */\n private static async reconcile(options: AccessiOptions): Promise<void> {\n this.logger.info('Verifica dello schema effettivo Accessi.');\n const engine = await this.engineIssue(options);\n if (engine) throw new Error(engine);\n const { major: engineMajor } = await this.engineInfo(options);\n const columns = await this.columns(options);\n const checks = await this.checks(options);\n const future = await this.futureVersionIssue(options, columns);\n if (future) throw new Error(future);\n // Detect incompatible existing definitions before making any changes. Never guess at data conversion.\n const problems: string[] = await this.relationIssues(options);\n for (const [table, schema] of Object.entries(accessiTables)) {\n for (const [name, definition] of Object.entries(schema.columns)) {\n const row = columns.find(row => row.TABLE_NAME === table && row.COLUMN_NAME === name);\n if (row) {\n const problem = this.typeIssue(row, definition);\n if (problem) problems.push(`${table}.${name}: ${problem}`);\n }\n }\n }\n if (problems.length) throw new Error(`Schema Accessi richiede intervento sui tipi:\\n- ${problems.join('\\n- ')}`);\n for (const [table, schema] of Object.entries(accessiTables)) {\n const present = columns.filter(row => row.TABLE_NAME === table);\n if (!present.length) {\n await this.execute(options, `CREATE TABLE ${table} (${Object.entries(schema.columns).map(([name, definition]) => `${name} ${definition}`).join(', ')})`);\n continue;\n }\n for (const [name, definition] of Object.entries(schema.columns)) {\n const row = present.find(row => row.COLUMN_NAME === name);\n if (!row) {\n if (definition.includes('NOT NULL') && !this.defaultValue(definition)) {\n const data = await this.query(options, `SELECT FIRST 1 1 AS HAS_DATA FROM ${table}`);\n if (data.length) throw new Error(`Impossibile aggiungere ${table}.${name} obbligatoria: tabella popolata, serve un backfill esplicito. Nessun valore identificativo viene inventato.`);\n }\n await this.execute(options, `ALTER TABLE ${table} ADD ${name} ${definition}`);\n } else {\n const expected = this.defaultValue(definition);\n if (expected && this.normalizeDefault(row.DEFAULT_SOURCE) !== this.normalizeDefault(expected)) await this.execute(options, `ALTER TABLE ${table} ALTER ${name} SET DEFAULT ${expected}`);\n if (definition.includes('NOT NULL') && !Number(row.NOT_NULL)) {\n if (expected) await this.execute(options, `UPDATE ${table} SET ${name} = ${expected} WHERE ${name} IS NULL`);\n if (engineMajor >= 3) {\n await this.execute(options, `ALTER TABLE ${table} ALTER ${name} SET NOT NULL`);\n } else {\n // Firebird 2.5 non supporta ALTER ... SET NOT NULL: replica la regola con un CHECK equivalente.\n const nnName = this.notNullConstraint(table, name);\n if (!checks.some(entry => entry.NAME === nnName)) {\n await this.execute(options, `ALTER TABLE ${table} ADD CONSTRAINT ${nnName} CHECK (${name} IS NOT NULL)`);\n }\n }\n }\n }\n }\n }\n const constraints = this.groups(await this.constraints(options));\n for (const [table, schema] of Object.entries(accessiTables)) {\n const primary = constraints.find(rows => rows[0].TABLE_NAME === table && rows[0].KIND === 'PRIMARY KEY');\n if (primary && !this.sameColumns(primary, schema.primaryKey)) throw new Error(`${table}: chiave primaria esistente incompatibile; nessun vincolo viene eliminato automaticamente.`);\n if (!primary) await this.execute(options, `ALTER TABLE ${table} ADD CONSTRAINT PK_${table} PRIMARY KEY (${schema.primaryKey.join(', ')})`);\n }\n // Only preserve provider namespaces already referenced by historical SSO identities.\n await this.execute(options, `INSERT INTO SSO_PROVIDER (PROVIDER, DESCRIZIONE, FLGATTIVO)\n SELECT DISTINCT I.PROVIDER, I.PROVIDER, 1 FROM UTENTI_IDENTITA_EXT I\n WHERE NOT EXISTS (SELECT 1 FROM SSO_PROVIDER P WHERE P.PROVIDER = I.PROVIDER)`);\n for (const fk of accessiForeignKeys) {\n const existing = constraints.find(rows => rows[0].KIND === 'FOREIGN KEY' && rows[0].TABLE_NAME === fk.table && this.sameColumns(rows, [fk.column]));\n if (existing) {\n // Una FK sulla stessa colonna ma verso un target/regola diverso non e compatibile:\n // correggere il target cambiando semantica e va segnalato, non ignorato.\n const deleteRuleOk = fk.cascade\n ? existing[0].DELETE_RULE === 'CASCADE'\n : ['NO ACTION', 'RESTRICT'].includes(String(existing[0].DELETE_RULE));\n if (existing[0].TARGET_TABLE !== fk.target || existing[0].TARGET_COLUMN !== fk.targetColumn || !deleteRuleOk) {\n throw new Error(`${fk.name}: FK esistente su ${fk.table}.${fk.column} incompatibile (target ${existing[0].TARGET_TABLE}.${existing[0].TARGET_COLUMN}, delete rule ${existing[0].DELETE_RULE}); correggerla esplicitamente.`);\n }\n continue;\n }\n await this.execute(options, `ALTER TABLE ${fk.table} ADD CONSTRAINT ${fk.name} FOREIGN KEY (${fk.column}) REFERENCES ${fk.target} (${fk.targetColumn})${fk.cascade ? ' ON DELETE CASCADE' : ''}`);\n }\n for (const check of accessiChecks) {\n if (!checks.some(row => row.TABLE_NAME === check.table && this.sameCheck(String(row.CHECK_SOURCE), check.expression))) {\n await this.execute(options, `ALTER TABLE ${check.table} ADD CONSTRAINT ${check.name} CHECK (${check.expression})`);\n }\n }\n const indexes = await this.indexes(options);\n for (const index of accessiIndexes) {\n if (!indexes.some(rows => rows[0].TABLE_NAME === index.table && !Number(rows[0].INACTIVE) && this.sameColumns(rows, index.columns))) {\n if (indexes.some(rows => rows[0].NAME === index.name)) throw new Error(`${index.name}: indice esistente incompatibile o inattivo; correggerlo esplicitamente.`);\n await this.execute(options, `CREATE INDEX ${index.name} ON ${index.table} (${index.columns.join(', ')})`);\n }\n }\n for (const generator of accessiGenerators) {\n if (!(await this.sequenceExists(options, generator.name))) {\n // Firebird 2.5 non conosce CREATE SEQUENCE: usa CREATE GENERATOR. Da 3.0 si usa la sintassi standard.\n await this.execute(options, engineMajor >= 3 ? `CREATE SEQUENCE ${generator.name}` : `CREATE GENERATOR ${generator.name}`);\n }\n // Advance by a positive delta only: do not reset an existing sequence or reuse an allocated value.\n await this.execute(options, `EXECUTE BLOCK AS DECLARE VARIABLE MAX_ID BIGINT; DECLARE VARIABLE CURRENT_ID BIGINT; DECLARE VARIABLE NEXT_ID BIGINT;\n BEGIN SELECT COALESCE(MAX(${generator.column}), 0) FROM ${generator.table} INTO :MAX_ID;\n CURRENT_ID = GEN_ID(${generator.name}, 0);\n IF (MAX_ID > CURRENT_ID) THEN NEXT_ID = GEN_ID(${generator.name}, MAX_ID - CURRENT_ID); END`);\n }\n const triggers = await this.triggers(options);\n for (const trigger of accessiTriggers) {\n if (!triggers.some(row => this.compatibleTrigger(row, trigger)) && !triggers.some(row => row.NAME === trigger.name)) {\n if (triggers.some(row => row.TABLE_NAME === trigger.table && Number(row.TRIGGER_TYPE) === trigger.type)) {\n throw new Error(`${trigger.table}: trigger ${trigger.event} personalizzato non riconosciuto; verificare le operazioni di ${trigger.name} prima di aggiungere trigger concorrenti.`);\n }\n await this.execute(options, `CREATE TRIGGER ${trigger.name} FOR ${trigger.table} ACTIVE ${trigger.event} POSITION 0 ${trigger.body}`);\n }\n }\n await this.assertCompatible(options);\n // The host's VersioneDB/DBVERSION values belong to the host and are never overwritten.\n await this.execute(options, 'UPDATE OR INSERT INTO PARAMETRI (CODPAR, DESPAR) VALUES (?, ?) MATCHING (CODPAR)', [ACCESSI_VERSION_KEY, ACCESSI_SCHEMA_VERSION]);\n this.logger.info(`Schema Accessi verificato: ${ACCESSI_SCHEMA_VERSION}.`);\n }\n}\n"]}
|
|
@@ -29,8 +29,16 @@ function getOptionalBoolean(name, fallback) {
|
|
|
29
29
|
return value.toLowerCase() === "true";
|
|
30
30
|
}
|
|
31
31
|
function createAccessiOptionsFromEnv() {
|
|
32
|
+
const databaseOptions = Utilities_1.DatabaseUtilities.createOption(getEnv(["ACCESSI_DB_HOST", "ACCESSI_FIREBIRD_HOST"]), Number(getEnv(["ACCESSI_DB_PORT", "ACCESSI_FIREBIRD_PORT"], "3050")), getEnv(["ACCESSI_DB_DATABASE", "ACCESSI_FIREBIRD_DATABASE"]), getEnv(["ACCESSI_DB_USER", "ACCESSI_FIREBIRD_USER"], "SYSDBA"), getEnv(["ACCESSI_DB_PASSWORD", "ACCESSI_FIREBIRD_PASSWORD"], "masterkey"));
|
|
33
|
+
// Firebird 2.5 richiede Legacy_Auth e non supporta la cifratura del wire: override opzionale via env.
|
|
34
|
+
const wireCrypt = process.env.ACCESSI_DB_WIRE_CRYPT;
|
|
35
|
+
const authPlugin = process.env.ACCESSI_DB_AUTH_PLUGIN;
|
|
36
|
+
if (wireCrypt)
|
|
37
|
+
databaseOptions.wireCrypt = wireCrypt;
|
|
38
|
+
if (authPlugin)
|
|
39
|
+
databaseOptions.pluginName = authPlugin;
|
|
32
40
|
return {
|
|
33
|
-
databaseOptions
|
|
41
|
+
databaseOptions,
|
|
34
42
|
confirmationEmailUrl: getEnv("ACCESSI_CONFIRMATION_EMAIL_URL", "http://localhost"),
|
|
35
43
|
confirmationEmailReturnUrl: getEnv("ACCESSI_CONFIRMATION_RETURN_EMAIL_URL", "http://localhost"),
|
|
36
44
|
confirmationEmailPrefix: process.env.ACCESSI_CONFIRMATION_EMAIL_PREFIX,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runAccessiDbUpdate.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/runAccessiDbUpdate.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,qEAAkE;AAClE,+CAAoD;AACpD,mCAAgC;AAEhC,SAAS,MAAM,CAAC,KAAwB,EAAE,QAAiB;;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAA,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,mCAAI,QAAQ,CAAC;IACvI,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAiB;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACxC,CAAC;AAED,SAAS,2BAA2B;IAClC,
|
|
1
|
+
{"version":3,"file":"runAccessiDbUpdate.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/runAccessiDbUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccessiOptions } from \"../AccessiModule\";\nimport { AccessiDatabaseUpdater } from \"./AccessiDatabaseUpdater\";\nimport { DatabaseUtilities } from \"../../Utilities\";\nimport { Orm } from \"../../Orm\";\n\nfunction getEnv(names: string | string[], fallback?: string): string {\n const candidates = Array.isArray(names) ? names : [names];\n const value = candidates.map((name) => process.env[name]).find((candidate) => candidate !== undefined && candidate !== \"\") ?? fallback;\n if (!value) {\n throw new Error(`Variabile ambiente mancante: ${candidates.join(\" oppure \")}`);\n }\n return value;\n}\n\nfunction getOptionalBoolean(name: string, fallback: boolean): boolean {\n const value = process.env[name];\n if (value === undefined) {\n return fallback;\n }\n\n return value.toLowerCase() === \"true\";\n}\n\nfunction createAccessiOptionsFromEnv(): AccessiOptions {\n const databaseOptions = DatabaseUtilities.createOption(\n getEnv([\"ACCESSI_DB_HOST\", \"ACCESSI_FIREBIRD_HOST\"]),\n Number(getEnv([\"ACCESSI_DB_PORT\", \"ACCESSI_FIREBIRD_PORT\"], \"3050\")),\n getEnv([\"ACCESSI_DB_DATABASE\", \"ACCESSI_FIREBIRD_DATABASE\"]),\n getEnv([\"ACCESSI_DB_USER\", \"ACCESSI_FIREBIRD_USER\"], \"SYSDBA\"),\n getEnv([\"ACCESSI_DB_PASSWORD\", \"ACCESSI_FIREBIRD_PASSWORD\"], \"masterkey\")\n );\n\n // Firebird 2.5 richiede Legacy_Auth e non supporta la cifratura del wire: override opzionale via env.\n const wireCrypt = process.env.ACCESSI_DB_WIRE_CRYPT;\n const authPlugin = process.env.ACCESSI_DB_AUTH_PLUGIN;\n if (wireCrypt) (databaseOptions as { wireCrypt?: string }).wireCrypt = wireCrypt;\n if (authPlugin) (databaseOptions as { pluginName?: string }).pluginName = authPlugin;\n\n return {\n databaseOptions,\n confirmationEmailUrl: getEnv(\"ACCESSI_CONFIRMATION_EMAIL_URL\", \"http://localhost\"),\n confirmationEmailReturnUrl: getEnv(\"ACCESSI_CONFIRMATION_RETURN_EMAIL_URL\", \"http://localhost\"),\n confirmationEmailPrefix: process.env.ACCESSI_CONFIRMATION_EMAIL_PREFIX,\n customResetPage: process.env.ACCESSI_CUSTOM_RESET_PAGE,\n encryptionKey: getEnv(\"ACCESSI_ENCRYPTION_KEY\", \"1234567890ABCDEF\"),\n mockDemoUser: getOptionalBoolean(\"ACCESSI_MOCK_DEMO_USER\", false),\n passwordExpiration: getOptionalBoolean(\"ACCESSI_PASSWORD_EXPIRATION\", false),\n autoUpdateDatabase: true,\n jwtOptions: {\n secret: getEnv(\"ACCESSI_JWT_SECRET\", \"local-accessi-update\"),\n expiresIn: getEnv(\"ACCESSI_JWT_EXPIRES\", \"24h\"),\n },\n emailOptions: {\n host: getEnv(\"ACCESSI_EMAIL_HOST\", \"localhost\"),\n port: Number(getEnv(\"ACCESSI_EMAIL_PORT\", \"25\")),\n secure: getOptionalBoolean(\"ACCESSI_EMAIL_SECURE\", false),\n requireTLS: getOptionalBoolean(\"ACCESSI_EMAIL_REQUIRE_TLS\", false),\n tls: {\n rejectUnauthorized: getOptionalBoolean(\"ACCESSI_EMAIL_TLS_REJECT_UNAUTHORIZED\", false),\n },\n from: getEnv(\"ACCESSI_EMAIL_FROM\", \"noreply@example.local\"),\n auth: {\n user: getEnv(\"ACCESSI_EMAIL_USER\", \"local-user\"),\n pass: getEnv(\"ACCESSI_EMAIL_PASSWORD\", \"local-password\"),\n },\n },\n extensionFieldsOptions: [],\n };\n}\n\nasync function main(): Promise<void> {\n const options = createAccessiOptionsFromEnv();\n\n const checkOnly = process.argv.includes('--check');\n console.log(checkOnly ? '[Accessi DB Update] Verifica schema in sola lettura...' : '[Accessi DB Update] Avvio aggiornamento database...');\n console.log(\n `[Accessi DB Update] Target: ${options.databaseOptions.host}:${options.databaseOptions.port} -> ${options.databaseOptions.database}`\n );\n\n if (checkOnly) await AccessiDatabaseUpdater.assertCompatible(options);\n else await AccessiDatabaseUpdater.run(options);\n\n const currentVersion = await AccessiDatabaseUpdater.getCurrentVersion(options);\n console.log(\n `[Accessi DB Update] Completato. Versione corrente: ${currentVersion ?? \"N/D\"} | Ultima disponibile: ${AccessiDatabaseUpdater.getLatestVersion()}`\n );\n}\n\nmain()\n .then(() => Orm.closePools())\n .then(() => process.exit(0))\n .catch(async (error) => {\n console.error(\"[Accessi DB Update] Errore durante l'aggiornamento:\", error);\n await Orm.closePools().catch(() => undefined);\n process.exit(1);\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessi-module/index.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { Application, Request } from \"express\";\nimport { NestFactory } from \"@nestjs/core\";\nimport { ExpressAdapter } from \"@nestjs/platform-express\";\nimport { AccessiModule, AccessiOptions } from \"./AccessiModule\";\r\nimport { Logger } from \"../Logger\";\nimport { AuthService } from \"./Services/AuthService/AuthService\";\nimport { setupSwagger } from \"../swagger/SwaggerConfig\";\nimport {\n beginAccessiAuthInitialization,\n failAccessiAuthInitialization,\n AuthenticateGenService,\n setAccessiAuthService\n} from \"./middleware/authenticateGen\";\nimport { createAccessiValidationPipe } from './security/accessiValidation';\nimport { AccessiHttpExceptionFilter } from './security/AccessiHttpExceptionFilter';\n\nfunction describeDatabaseTarget(options: AccessiOptions): string {\n const dbOptions = options.databaseOptions as {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n };\n\n return `${dbOptions.host ?? \"?\"}:${dbOptions.port ?? \"?\"} -> ${dbOptions.database ?? \"?\"} as ${dbOptions.user ?? \"?\"}`;\n}\n\n/**\n * Monta il modulo Accessi in un'applicazione Express gia esistente.\n *\n * Il bootstrap crea un host Nest isolato per le rotte `/api/accessi`, inizializza Swagger,\n * validazione ed error handler, quindi rende disponibile `authorizeAccessi` al resto dell'app.\n * Attendere questa Promise prima di aprire la porta HTTP: durante il bootstrap il middleware\n * restituisce `ACCESSI_AUTH_INITIALIZING` invece di autorizzare richieste parzialmente inizializzate.\n *\n * @param app Applicazione Express ospitante. Non viene sostituita ne vengono intercettate rotte estranee ad Accessi.\n * @param options Configurazione riservata del modulo; proviene normalmente da variabili d'ambiente o secret manager.\n */\nexport async function initializeAccessiModule(app: Application, options: AccessiOptions): Promise<void> {\n const logger: Logger = new Logger(\"initializeAccessiModule\");\n beginAccessiAuthInitialization();\n const startedAt = performance.now();\n\n try {\n logger.info(\"Inizializzazione modulo accessi avviata.\");\n logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);\n logger.info(\n `Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`\n );\n const nestHostApp = express();\n const isNestRoute = (path: string) =>\n path === \"/api/accessi\" ||\n path.startsWith(\"/api/accessi/\") ||\n path === \"/accessi/swagger\" ||\n path.startsWith(\"/accessi/swagger/\") ||\n path === \"/accessi/swagger.json\" ||\n path === \"/accessi/swagger-json\";\n\n app.use((req: Request, res, next) => {\n if (!isNestRoute(req.path)) {\n return next();\n }\n\n return nestHostApp(req, res, next);\n });\n\n const nestExpressInstance = new ExpressAdapter(nestHostApp);\n\n const nestApp = await NestFactory.create(AccessiModule.forRoot(options), nestExpressInstance, {\n bufferLogs: true\n });\n logger.info(\"Applicazione Nest accessi creata.\");\n\n nestApp.enableCors({ exposedHeaders: ['X-Total-Count'] });\n nestApp.useGlobalPipes(createAccessiValidationPipe());\n nestApp.useGlobalFilters(new AccessiHttpExceptionFilter());\n\r\n nestApp.setGlobalPrefix('api', {\n exclude: ['/swagger', '/swagger/(.*)']\n });\n\n setupSwagger(nestApp, {\n swaggerPath: \"accessi/swagger\",\n swaggerJsonPath: \"accessi/swagger.json\",\n title: \"Accessi API Documentation\",\n description: \"API del modulo accessi\",\n });\n logger.info(\"Avvio init del modulo accessi.\");\n await nestApp.init();\n logger.info(\"Init del modulo accessi completata.\");\n if (options.legacyPasswordMigrationOnStartup !== false) {\n logger.info(\"Avvio migrazione password legacy accessi.\");\n const passwordMigrationService = nestApp.get(AuthService);\n await passwordMigrationService.migrateLegacyEncryptedPasswords();\n logger.info(\"Migrazione password legacy accessi completata.\");\n }\n\n const accessiAuthService = nestApp.get(AuthenticateGenService);\n app.locals.accessiAuthService = accessiAuthService;\n setAccessiAuthService(accessiAuthService);\n const elapsedMs = performance.now() - startedAt;\n logger.info(`Accessi initialized. Tempo totale bootstrap: ${elapsedMs.toFixed(2)} ms`);\n\n } catch (error) {\n failAccessiAuthInitialization(error);\n logger.error(\n \"Errore in initialize AccessiModule:\",\n error instanceof Error\n ? { name: error.name, message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n throw error;\n }\n}\n\r\nexport { AccessiModule } from \"./AccessiModule\";\nexport { AccessiDatabaseUpdater } from \"./database-updates/AccessiDatabaseUpdater\";\nexport type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from \"./AccessiModule\";\r\nexport type { PublicRegistrationOptions, FederatedAuthenticationOptions, ServiceTokenOptions } from \"./AccessiModule\";\r\nexport { ServiceTokenService } from './Services/ServiceTokenService/ServiceTokenService';\r\nexport type {\r\n ServiceTokenMetadata,\r\n IssuedServiceToken,\r\n VerifiedServiceToken,\r\n IssueServiceTokenInput\r\n} from './Services/ServiceTokenService/ServiceTokenService';\r\nexport { ServiceTokenGuard, RequireServiceTokenScopes, getAccessiServiceToken } from './security/serviceTokenGuard';\nexport { FederatedAuthService } from './federated-auth/FederatedAuthService';\nexport type { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './federated-auth/FederatedAuthTypes';\nexport * from \"./Dtos\";\nexport {\r\n authorizeAccessi,\r\n authenticateGen\r\n} from \"./middleware/authenticateGen\";\r\nexport { accessiRequirement } from \"./middleware/accessiRequirements\";\r\nexport type {\r\n AccessiAuthorizationOptions,\r\n AccessiRequirementNode,\r\n AccessiCustomRequirementContext,\r\n AccessiCustomRequirementHandler\r\n} from \"./middleware/accessiRequirements\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessi-module/index.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { Application, Request } from \"express\";\nimport { NestFactory } from \"@nestjs/core\";\nimport { ExpressAdapter } from \"@nestjs/platform-express\";\nimport { AccessiModule, AccessiOptions } from \"./AccessiModule\";\nimport { Logger } from \"../Logger\";\nimport { AuthService } from \"./Services/AuthService/AuthService\";\nimport { setupSwagger } from \"../swagger/SwaggerConfig\";\nimport {\n beginAccessiAuthInitialization,\n failAccessiAuthInitialization,\n AuthenticateGenService,\n setAccessiAuthService\n} from \"./middleware/authenticateGen\";\nimport { createAccessiValidationPipe } from './security/accessiValidation';\nimport { AccessiHttpExceptionFilter } from './security/AccessiHttpExceptionFilter';\n\nfunction describeDatabaseTarget(options: AccessiOptions): string {\n const dbOptions = options.databaseOptions as {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n };\n\n return `${dbOptions.host ?? \"?\"}:${dbOptions.port ?? \"?\"} -> ${dbOptions.database ?? \"?\"} as ${dbOptions.user ?? \"?\"}`;\n}\n\n/**\n * Monta il modulo Accessi in un'applicazione Express gia esistente.\n *\n * Il bootstrap crea un host Nest isolato per le rotte `/api/accessi`, inizializza Swagger,\n * validazione ed error handler, quindi rende disponibile `authorizeAccessi` al resto dell'app.\n * Attendere questa Promise prima di aprire la porta HTTP: durante il bootstrap il middleware\n * restituisce `ACCESSI_AUTH_INITIALIZING` invece di autorizzare richieste parzialmente inizializzate.\n *\n * @param app Applicazione Express ospitante. Non viene sostituita ne vengono intercettate rotte estranee ad Accessi.\n * @param options Configurazione riservata del modulo; proviene normalmente da variabili d'ambiente o secret manager.\n */\nexport async function initializeAccessiModule(app: Application, options: AccessiOptions): Promise<void> {\n const logger: Logger = new Logger(\"initializeAccessiModule\");\n beginAccessiAuthInitialization();\n const startedAt = performance.now();\n\n try {\n logger.info(\"Inizializzazione modulo accessi avviata.\");\n logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);\n logger.info(\n `Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`\n );\n const nestHostApp = express();\n const isNestRoute = (path: string) =>\n path === \"/api/accessi\" ||\n path.startsWith(\"/api/accessi/\") ||\n path === \"/accessi/swagger\" ||\n path.startsWith(\"/accessi/swagger/\") ||\n path === \"/accessi/swagger.json\" ||\n path === \"/accessi/swagger-json\";\n\n app.use((req: Request, res, next) => {\n if (!isNestRoute(req.path)) {\n return next();\n }\n\n return nestHostApp(req, res, next);\n });\n\n const nestExpressInstance = new ExpressAdapter(nestHostApp);\n\n const nestApp = await NestFactory.create(AccessiModule.forRoot(options), nestExpressInstance, {\n bufferLogs: true\n });\n logger.info(\"Applicazione Nest accessi creata.\");\n\n nestApp.enableCors({ exposedHeaders: ['X-Total-Count'] });\n nestApp.useGlobalPipes(createAccessiValidationPipe());\n nestApp.useGlobalFilters(new AccessiHttpExceptionFilter());\n\n nestApp.setGlobalPrefix('api', {\n exclude: ['/swagger', '/swagger/(.*)']\n });\n\n setupSwagger(nestApp, {\n swaggerPath: \"accessi/swagger\",\n swaggerJsonPath: \"accessi/swagger.json\",\n title: \"Accessi API Documentation\",\n description: \"API del modulo accessi\",\n });\n logger.info(\"Avvio init del modulo accessi.\");\n await nestApp.init();\n logger.info(\"Init del modulo accessi completata.\");\n if (options.legacyPasswordMigrationOnStartup !== false) {\n logger.info(\"Avvio migrazione password legacy accessi.\");\n const passwordMigrationService = nestApp.get(AuthService);\n await passwordMigrationService.migrateLegacyEncryptedPasswords();\n logger.info(\"Migrazione password legacy accessi completata.\");\n }\n\n const accessiAuthService = nestApp.get(AuthenticateGenService);\n app.locals.accessiAuthService = accessiAuthService;\n setAccessiAuthService(accessiAuthService);\n const elapsedMs = performance.now() - startedAt;\n logger.info(`Accessi initialized. Tempo totale bootstrap: ${elapsedMs.toFixed(2)} ms`);\n\n } catch (error) {\n failAccessiAuthInitialization(error);\n logger.error(\n \"Errore in initialize AccessiModule:\",\n error instanceof Error\n ? { name: error.name, message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n throw error;\n }\n}\n\nexport { AccessiModule } from \"./AccessiModule\";\nexport { AccessiDatabaseUpdater } from \"./database-updates/AccessiDatabaseUpdater\";\nexport type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from \"./AccessiModule\";\nexport type { PublicRegistrationOptions, FederatedAuthenticationOptions, ServiceTokenOptions } from \"./AccessiModule\";\nexport { ServiceTokenService } from './Services/ServiceTokenService/ServiceTokenService';\nexport type {\n ServiceTokenMetadata,\n IssuedServiceToken,\n VerifiedServiceToken,\n IssueServiceTokenInput\n} from './Services/ServiceTokenService/ServiceTokenService';\nexport { ServiceTokenGuard, RequireServiceTokenScopes, getAccessiServiceToken } from './security/serviceTokenGuard';\nexport { FederatedAuthService } from './federated-auth/FederatedAuthService';\nexport type { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './federated-auth/FederatedAuthTypes';\nexport * from \"./Dtos\";\nexport {\n authorizeAccessi,\n authenticateGen\n} from \"./middleware/authenticateGen\";\nexport { accessiRequirement } from \"./middleware/accessiRequirements\";\nexport type {\n AccessiAuthorizationOptions,\n AccessiRequirementNode,\n AccessiCustomRequirementContext,\n AccessiCustomRequirementHandler\n} from \"./middleware/accessiRequirements\";\n"]}
|