emilsoftware-utilities 2.0.0-dev.34 → 2.0.0-dev.36

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.
Files changed (29) hide show
  1. package/README.MD +14 -0
  2. package/dist/accessi-module/AccessiModule.d.ts +29 -0
  3. package/dist/accessi-module/AccessiModule.js.map +1 -1
  4. package/dist/accessi-module/Console/console.js +37 -2
  5. package/dist/accessi-module/Console/wiki.js +32 -1
  6. package/dist/accessi-module/Console/wiki.js.map +1 -1
  7. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.d.ts +83 -0
  8. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.js +360 -0
  9. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.js.map +1 -0
  10. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +6 -0
  11. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +20 -1
  12. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  13. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.d.ts +5 -0
  14. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js +79 -0
  15. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js.map +1 -0
  16. package/dist/accessi-module/database-updates/accessiSchema.d.ts +1 -1
  17. package/dist/accessi-module/database-updates/accessiSchema.js +10 -1
  18. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -1
  19. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.d.ts +1 -0
  20. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.js +69 -0
  21. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.js.map +1 -0
  22. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +2 -58
  23. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  24. package/dist/accessi-module/index.d.ts +3 -0
  25. package/dist/accessi-module/index.js +10 -1
  26. package/dist/accessi-module/index.js.map +1 -1
  27. package/dist/emilsoftware-utilities-2.0.0-dev.36.tgz +0 -0
  28. package/package.json +5 -3
  29. package/dist/emilsoftware-utilities-2.0.0-dev.34.tgz +0 -0
@@ -1 +1 @@
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, accessiRenamedColumns, accessiObsoleteColumns, accessiColumnCopies } 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 // Pulizia delle colonne ibride: rinomina con copia dati e rimozione dei campi applicativi.\n // Gira dopo l'aggiunta delle colonne canoniche, cosi il target del rename esiste sempre.\n for (const rename of accessiRenamedColumns) {\n const hasLegacy = columns.some(row => row.TABLE_NAME === rename.table && row.COLUMN_NAME === rename.from);\n if (!hasLegacy) continue;\n await this.execute(options, `UPDATE ${rename.table} SET ${rename.to} = ${rename.from} WHERE ${rename.to} IS NULL AND ${rename.from} IS NOT NULL`);\n await this.execute(options, `ALTER TABLE ${rename.table} DROP ${rename.from}`);\n }\n // Copie tra tabelle diverse (es. telefono legacy UTENTI.CELLUTE -> UTENTI_CONFIG.CELLULARE).\n for (const copy of accessiColumnCopies) {\n const hasSource = columns.some(row => row.TABLE_NAME === copy.sourceTable && row.COLUMN_NAME === copy.sourceColumn);\n if (!hasSource) continue;\n await this.execute(\n options,\n `UPDATE ${copy.targetTable} SET ${copy.targetColumn} = (SELECT S.${copy.sourceColumn} FROM ${copy.sourceTable} S WHERE S.${copy.joinColumn} = ${copy.targetTable}.${copy.joinColumn}) WHERE ${copy.targetColumn} IS NULL AND EXISTS (SELECT 1 FROM ${copy.sourceTable} S WHERE S.${copy.joinColumn} = ${copy.targetTable}.${copy.joinColumn} AND S.${copy.sourceColumn} IS NOT NULL)`,\n );\n }\n for (const [table, obsoleteColumns] of Object.entries(accessiObsoleteColumns)) {\n for (const column of obsoleteColumns) {\n if (columns.some(row => row.TABLE_NAME === table && row.COLUMN_NAME === column)) {\n await this.execute(options, `ALTER TABLE ${table} DROP ${column}`);\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"]}
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, accessiRenamedColumns, accessiObsoleteColumns, accessiColumnCopies } from './accessiSchema';\nimport { applyCatalogScripts } from './AccessiCatalogMigrator';\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 = this.bootstrap(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 /**\n * Prima riconcilia lo schema, poi applica le catalog migrations applicative (menu, ruoli, ...).\n * Con `autoUpdateDatabase: false` la verifica resta in sola lettura e le catalog migrations\n * non vengono eseguite automaticamente.\n */\n private static async bootstrap(options: AccessiOptions): Promise<void> {\n if (options.autoUpdateDatabase === false) {\n await this.assertCompatible(options);\n return;\n }\n\n await this.run(options);\n if (options.catalogScripts?.enabled) {\n await applyCatalogScripts(options);\n }\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 // Pulizia delle colonne ibride: rinomina con copia dati e rimozione dei campi applicativi.\n // Gira dopo l'aggiunta delle colonne canoniche, cosi il target del rename esiste sempre.\n for (const rename of accessiRenamedColumns) {\n const hasLegacy = columns.some(row => row.TABLE_NAME === rename.table && row.COLUMN_NAME === rename.from);\n if (!hasLegacy) continue;\n await this.execute(options, `UPDATE ${rename.table} SET ${rename.to} = ${rename.from} WHERE ${rename.to} IS NULL AND ${rename.from} IS NOT NULL`);\n await this.execute(options, `ALTER TABLE ${rename.table} DROP ${rename.from}`);\n }\n // Copie tra tabelle diverse (es. telefono legacy UTENTI.CELLUTE -> UTENTI_CONFIG.CELLULARE).\n for (const copy of accessiColumnCopies) {\n const hasSource = columns.some(row => row.TABLE_NAME === copy.sourceTable && row.COLUMN_NAME === copy.sourceColumn);\n if (!hasSource) continue;\n await this.execute(\n options,\n `UPDATE ${copy.targetTable} SET ${copy.targetColumn} = (SELECT S.${copy.sourceColumn} FROM ${copy.sourceTable} S WHERE S.${copy.joinColumn} = ${copy.targetTable}.${copy.joinColumn}) WHERE ${copy.targetColumn} IS NULL AND EXISTS (SELECT 1 FROM ${copy.sourceTable} S WHERE S.${copy.joinColumn} = ${copy.targetTable}.${copy.joinColumn} AND S.${copy.sourceColumn} IS NOT NULL)`,\n );\n }\n for (const [table, obsoleteColumns] of Object.entries(accessiObsoleteColumns)) {\n for (const column of obsoleteColumns) {\n if (columns.some(row => row.TABLE_NAME === table && row.COLUMN_NAME === column)) {\n await this.execute(options, `ALTER TABLE ${table} DROP ${column}`);\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"]}
@@ -0,0 +1,5 @@
1
+ import type { AccessiOptions, CatalogScriptsOptions } from '../AccessiModule';
2
+ /** Catalog migrations lette dall'ambiente: cartella in ACCESSI_CATALOG_FOLDER. */
3
+ export declare function createCatalogScriptsOptionsFromEnv(): CatalogScriptsOptions | undefined;
4
+ /** Costruisce `AccessiOptions` dalle variabili ambiente (stesse di runAccessiDbUpdate). */
5
+ export declare function createAccessiOptionsFromEnv(): AccessiOptions;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCatalogScriptsOptionsFromEnv = createCatalogScriptsOptionsFromEnv;
4
+ exports.createAccessiOptionsFromEnv = createAccessiOptionsFromEnv;
5
+ const Utilities_1 = require("../../Utilities");
6
+ function getEnv(names, fallback) {
7
+ var _a;
8
+ const candidates = Array.isArray(names) ? names : [names];
9
+ const value = (_a = candidates.map((name) => process.env[name]).find((candidate) => candidate !== undefined && candidate !== "")) !== null && _a !== void 0 ? _a : fallback;
10
+ if (!value) {
11
+ throw new Error(`Variabile ambiente mancante: ${candidates.join(" oppure ")}`);
12
+ }
13
+ return value;
14
+ }
15
+ function getOptionalBoolean(name, fallback) {
16
+ const value = process.env[name];
17
+ if (value === undefined) {
18
+ return fallback;
19
+ }
20
+ return value.toLowerCase() === "true";
21
+ }
22
+ /** Catalog migrations lette dall'ambiente: cartella in ACCESSI_CATALOG_FOLDER. */
23
+ function createCatalogScriptsOptionsFromEnv() {
24
+ const folder = process.env.ACCESSI_CATALOG_FOLDER;
25
+ if (!folder) {
26
+ return undefined;
27
+ }
28
+ const policy = process.env.ACCESSI_CATALOG_CHECKSUM_POLICY;
29
+ const checksumPolicy = policy === 'warn' || policy === 'reapply' || policy === 'error' ? policy : undefined;
30
+ return {
31
+ enabled: true,
32
+ folder,
33
+ onChecksumMismatch: checksumPolicy,
34
+ stopOnError: getOptionalBoolean('ACCESSI_CATALOG_STOP_ON_ERROR', true),
35
+ };
36
+ }
37
+ /** Costruisce `AccessiOptions` dalle variabili ambiente (stesse di runAccessiDbUpdate). */
38
+ function createAccessiOptionsFromEnv() {
39
+ 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"));
40
+ // Firebird 2.5 richiede Legacy_Auth e non supporta la cifratura del wire: override opzionale via env.
41
+ const wireCrypt = process.env.ACCESSI_DB_WIRE_CRYPT;
42
+ const authPlugin = process.env.ACCESSI_DB_AUTH_PLUGIN;
43
+ if (wireCrypt)
44
+ databaseOptions.wireCrypt = wireCrypt;
45
+ if (authPlugin)
46
+ databaseOptions.pluginName = authPlugin;
47
+ return {
48
+ databaseOptions,
49
+ confirmationEmailUrl: getEnv("ACCESSI_CONFIRMATION_EMAIL_URL", "http://localhost"),
50
+ confirmationEmailReturnUrl: getEnv("ACCESSI_CONFIRMATION_RETURN_EMAIL_URL", "http://localhost"),
51
+ confirmationEmailPrefix: process.env.ACCESSI_CONFIRMATION_EMAIL_PREFIX,
52
+ customResetPage: process.env.ACCESSI_CUSTOM_RESET_PAGE,
53
+ encryptionKey: getEnv("ACCESSI_ENCRYPTION_KEY", "1234567890ABCDEF"),
54
+ mockDemoUser: getOptionalBoolean("ACCESSI_MOCK_DEMO_USER", false),
55
+ passwordExpiration: getOptionalBoolean("ACCESSI_PASSWORD_EXPIRATION", false),
56
+ autoUpdateDatabase: true,
57
+ jwtOptions: {
58
+ secret: getEnv("ACCESSI_JWT_SECRET", "local-accessi-update"),
59
+ expiresIn: getEnv("ACCESSI_JWT_EXPIRES", "24h"),
60
+ },
61
+ emailOptions: {
62
+ host: getEnv("ACCESSI_EMAIL_HOST", "localhost"),
63
+ port: Number(getEnv("ACCESSI_EMAIL_PORT", "25")),
64
+ secure: getOptionalBoolean("ACCESSI_EMAIL_SECURE", false),
65
+ requireTLS: getOptionalBoolean("ACCESSI_EMAIL_REQUIRE_TLS", false),
66
+ tls: {
67
+ rejectUnauthorized: getOptionalBoolean("ACCESSI_EMAIL_TLS_REJECT_UNAUTHORIZED", false),
68
+ },
69
+ from: getEnv("ACCESSI_EMAIL_FROM", "noreply@example.local"),
70
+ auth: {
71
+ user: getEnv("ACCESSI_EMAIL_USER", "local-user"),
72
+ pass: getEnv("ACCESSI_EMAIL_PASSWORD", "local-password"),
73
+ },
74
+ },
75
+ extensionFieldsOptions: [],
76
+ catalogScripts: createCatalogScriptsOptionsFromEnv(),
77
+ };
78
+ }
79
+ //# sourceMappingURL=accessiOptionsFromEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessiOptionsFromEnv.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/accessiOptionsFromEnv.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccessiOptions, CatalogScriptsOptions } from '../AccessiModule';\nimport { DatabaseUtilities } from '../../Utilities';\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 return value.toLowerCase() === \"true\";\n}\n\n/** Catalog migrations lette dall'ambiente: cartella in ACCESSI_CATALOG_FOLDER. */\nexport function createCatalogScriptsOptionsFromEnv(): CatalogScriptsOptions | undefined {\n const folder = process.env.ACCESSI_CATALOG_FOLDER;\n if (!folder) {\n return undefined;\n }\n\n const policy = process.env.ACCESSI_CATALOG_CHECKSUM_POLICY;\n const checksumPolicy = policy === 'warn' || policy === 'reapply' || policy === 'error' ? policy : undefined;\n\n return {\n enabled: true,\n folder,\n onChecksumMismatch: checksumPolicy,\n stopOnError: getOptionalBoolean('ACCESSI_CATALOG_STOP_ON_ERROR', true),\n };\n}\n\n/** Costruisce `AccessiOptions` dalle variabili ambiente (stesse di runAccessiDbUpdate). */\nexport function 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 catalogScripts: createCatalogScriptsOptionsFromEnv(),\n };\n}\n"]}
@@ -3,7 +3,7 @@ export interface SchemaTable {
3
3
  columns: Record<string, string>;
4
4
  primaryKey: string[];
5
5
  }
6
- export declare const ACCESSI_SCHEMA_VERSION = "1.10.0";
6
+ export declare const ACCESSI_SCHEMA_VERSION = "1.11.0";
7
7
  export declare const ACCESSI_VERSION_KEY = "AccessiVersion";
8
8
  /**
9
9
  * Colonne storiche/applicative non piu di dominio Accessi. La riconciliazione le copia (se
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.accessiGenerators = exports.accessiTriggers = exports.accessiChecks = exports.accessiIndexes = exports.accessiForeignKeys = exports.accessiTables = exports.accessiObsoleteColumns = exports.accessiColumnCopies = exports.accessiRenamedColumns = exports.ACCESSI_VERSION_KEY = exports.ACCESSI_SCHEMA_VERSION = void 0;
4
- exports.ACCESSI_SCHEMA_VERSION = '1.10.0';
4
+ exports.ACCESSI_SCHEMA_VERSION = '1.11.0';
5
5
  exports.ACCESSI_VERSION_KEY = 'AccessiVersion';
6
6
  /**
7
7
  * Colonne storiche/applicative non piu di dominio Accessi. La riconciliazione le copia (se
@@ -81,6 +81,15 @@ exports.accessiTables = {
81
81
  CREATED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', EXPIRES_AT: 'TIMESTAMP', LAST_USED_AT: 'TIMESTAMP', LAST_USED_IP: 'VARCHAR(45)',
82
82
  REVOKED_AT: 'TIMESTAMP', REVOKED_BY: 'INTEGER',
83
83
  }, primaryKey: ['TOKEN_ID'] },
84
+ // Ledger delle catalog migrations applicative (menu, ruoli, cataloghi): garantisce idempotenza
85
+ // a livello di database. Lo schema e di Accessi, gli script restano nel backend ospitante.
86
+ ACCESSI_CATALOG_SCRIPT: { columns: {
87
+ SCRIPT_NAME: 'VARCHAR(255) CHARACTER SET ASCII NOT NULL',
88
+ CHECKSUM: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',
89
+ APPLIED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL',
90
+ APPLIED_COUNT: 'INTEGER DEFAULT 1 NOT NULL',
91
+ NOTE: 'VARCHAR(500) CHARACTER SET UTF8',
92
+ }, primaryKey: ['SCRIPT_NAME'] },
84
93
  };
85
94
  exports.accessiForeignKeys = [
86
95
  { name: 'FK_ABILITAZIONI_1', table: 'ABILITAZIONI', column: 'CODMNU', target: 'MENU', targetColumn: 'CODMNU' },
@@ -1 +1 @@
1
- {"version":3,"file":"accessiSchema.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/accessiSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/** Minimum schema owned by Accessi. Application columns and catalog rows are deliberately absent. */\nexport interface SchemaTable {\n columns: Record<string, string>;\n primaryKey: string[];\n}\n\nexport const ACCESSI_SCHEMA_VERSION = '1.10.0';\nexport const ACCESSI_VERSION_KEY = 'AccessiVersion';\n\n/**\n * Colonne storiche/applicative non piu di dominio Accessi. La riconciliazione le copia (se\n * previsto un rename) e poi le elimina, per evitare campi ibridi nello schema Accessi.\n */\nexport const accessiRenamedColumns: ReadonlyArray<{ table: string; from: string; to: string }> = [\n { table: 'UTENTI_CONFIG', from: 'FLGADMINCONFIG', to: 'FLGADMIN' },\n];\n\n/**\n * Copie di dati prima della rimozione di colonne applicative (anche tra tabelle diverse).\n * `joinColumn` e la chiave comune usata per correlare sorgente e destinazione.\n */\nexport const accessiColumnCopies: ReadonlyArray<{\n sourceTable: string;\n sourceColumn: string;\n targetTable: string;\n targetColumn: string;\n joinColumn: string;\n}> = [\n { sourceTable: 'UTENTI', sourceColumn: 'CELLUTE', targetTable: 'UTENTI_CONFIG', targetColumn: 'CELLULARE', joinColumn: 'CODUTE' },\n];\n\n/** Colonne application-specific eliminate dallo schema Accessi: i backend devono gestirle altrove. */\nexport const accessiObsoleteColumns: Record<string, readonly string[]> = {\n UTENTI: ['ENABLEIA', 'CELLUTE'],\n UTENTI_CONFIG: [\n 'FLGMOP', 'FLGPIANA', 'FLGADDETTI', 'FLGOSPITI', 'FLGPIANARFID',\n 'FLGCONTA', 'FLGCUBI', 'FLGCICLPASS', 'FLGDIPENDENTI', 'FLGINVENTARI',\n 'CAUMOV', 'NUMMAC', 'RAGSOCCLI', 'PAGDEF',\n ],\n MENU_GRP: ['NOMECAMPO'],\n};\n\nexport const accessiTables: Record<string, SchemaTable> = {\n PARAMETRI: { columns: { CODPAR: 'VARCHAR(15) NOT NULL', DESPAR: 'VARCHAR(255)', NOTE: 'BLOB SUB_TYPE 1', GRUPPO: 'VARCHAR(20)' }, primaryKey: ['CODPAR'] },\n UTENTI: { columns: {\n CODUTE: 'INTEGER NOT NULL', USRNAME: 'VARCHAR(100)', FLGGDPR: 'SMALLINT DEFAULT 0', DATGDPR: 'DATE',\n DATINS: 'DATE', DATSCAPWD: 'DATE', DATLASTLOGIN: 'DATE', STAREG: 'SMALLINT DEFAULT 0', KEYREG: 'VARCHAR(100)',\n }, primaryKey: ['CODUTE'] },\n UTENTI_CONFIG: { columns: {\n CODUTE: 'INTEGER NOT NULL', COGNOME: 'VARCHAR(50)', NOME: 'VARCHAR(50)', AVATAR: 'VARCHAR(30)',\n FLG2FATT: 'SMALLINT DEFAULT 0', FLGPWDLESS: 'SMALLINT DEFAULT 0 NOT NULL', FLGPASSWORD: 'SMALLINT DEFAULT 1 NOT NULL',\n CODLINGUA: \"VARCHAR(2) DEFAULT 'IT'\", FLGSUPER: 'SMALLINT DEFAULT 0', FLGADMIN: 'SMALLINT DEFAULT 0',\n CELLULARE: 'VARCHAR(30)', JSON_METADATA: 'BLOB SUB_TYPE 1',\n }, primaryKey: ['CODUTE'] },\n UTENTI_PWD: { columns: { CODUTE: 'INTEGER NOT NULL', PWD: 'VARCHAR(255)' }, primaryKey: ['CODUTE'] },\n UTENTI_OLDPWD: { columns: { CODUTE: 'INTEGER NOT NULL', OLDPWD: 'VARCHAR(255)' }, primaryKey: ['CODUTE'] },\n UTENTI_GDPR: { columns: { CODUTE: 'INTEGER NOT NULL', DATACC: 'DATE NOT NULL', GDPR: 'VARCHAR(2000)' }, primaryKey: ['CODUTE', 'DATACC'] },\n RUOLI: { columns: { CODRUO: 'INTEGER NOT NULL', DESRUO: 'VARCHAR(30)' }, primaryKey: ['CODRUO'] },\n MENU_GRP: { columns: { CODGRP: 'VARCHAR(1) NOT NULL', DESGRP: 'VARCHAR(100)', FLGENABLED: 'SMALLINT DEFAULT 0', ORDINE: 'SMALLINT DEFAULT 0' }, primaryKey: ['CODGRP'] },\n MENU_TIPI: { columns: { CODTIP: 'VARCHAR(1) NOT NULL', DESTIP: 'VARCHAR(20)' }, primaryKey: ['CODTIP'] },\n MENU: { columns: {\n CODMNU: 'VARCHAR(20) NOT NULL', DESMNU: 'VARCHAR(100)', CODGRP: 'VARCHAR(1) NOT NULL', FLGENABLED: 'INTEGER DEFAULT 0',\n ICON: 'VARCHAR(50)', ORDINE: 'SMALLINT', CODTIP: 'VARCHAR(1)', PAGINA: 'VARCHAR(50)', RIFMENU: 'VARCHAR(20)', NOTE: 'VARCHAR(1000)',\n }, primaryKey: ['CODMNU'] },\n ABILITAZIONI: { columns: { CODUTE: 'INTEGER NOT NULL', CODMNU: 'VARCHAR(20) NOT NULL', TIPABI: 'SMALLINT DEFAULT 0' }, primaryKey: ['CODUTE', 'CODMNU'] },\n RUOLI_MNU: { columns: { CODRUO: 'INTEGER NOT NULL', CODMNU: 'VARCHAR(20) NOT NULL', TIPABI: 'SMALLINT' }, primaryKey: ['CODRUO', 'CODMNU'] },\n UTENTI_RUOLI: { columns: { CODUTE: 'INTEGER NOT NULL', CODRUO: 'INTEGER NOT NULL' }, primaryKey: ['CODUTE', 'CODRUO'] },\n FILTRI_TIPO: { columns: { TIPFIL: 'SMALLINT NOT NULL', DESFIL: 'VARCHAR(20)', FLDFIL: 'VARCHAR(20)', FLGENABLED: 'SMALLINT DEFAULT 1 NOT NULL' }, primaryKey: ['TIPFIL'] },\n FILTRI: { columns: {\n CODUTE: 'INTEGER NOT NULL', PROG: 'INTEGER NOT NULL', TIPFIL: 'SMALLINT',\n NUMREP: 'INTEGER', IDXPERS: 'INTEGER', CODCLISUPER: 'INTEGER', CODAGE: 'INTEGER',\n CODCLICOL: 'INTEGER', CODCLIENTI: 'VARCHAR(2000)', CODDIP: 'INTEGER', IDXPOS: 'INTEGER', CODVET: 'INTEGER',\n }, primaryKey: ['CODUTE', 'PROG'] },\n SSO_PROVIDER: { columns: {\n PROVIDER: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL', DESCRIZIONE: 'VARCHAR(160) CHARACTER SET UTF8 NOT NULL',\n FLGATTIVO: 'SMALLINT DEFAULT 1 NOT NULL', DATINS: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', NOTA: 'VARCHAR(500) CHARACTER SET UTF8',\n }, primaryKey: ['PROVIDER'] },\n UTENTI_IDENTITA_EXT: { columns: {\n IDNKEY: 'CHAR(64) CHARACTER SET ASCII NOT NULL', CODUTE: 'INTEGER NOT NULL', PROVIDER: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n SUBJECT: 'VARCHAR(512) CHARACTER SET UTF8 NOT NULL', FLGATTIVO: 'SMALLINT DEFAULT 1 NOT NULL',\n DATINS: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', DATLASTLOGIN: 'TIMESTAMP', DATDISATT: 'TIMESTAMP', NOTA: 'VARCHAR(500) CHARACTER SET UTF8',\n }, primaryKey: ['IDNKEY'] },\n ACCESSI_2FA: { columns: {\n CHALLENGE_ID: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL', CODUTE: 'INTEGER NOT NULL', EMAIL: 'VARCHAR(254) CHARACTER SET UTF8 NOT NULL',\n AUTHMODE: 'VARCHAR(12) CHARACTER SET ASCII NOT NULL', IDNKEY: 'VARCHAR(64) CHARACTER SET ASCII', CODEHASH: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n CREATED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', EXPIRES_AT: 'TIMESTAMP NOT NULL', SENT_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL',\n ATTEMPTS: 'SMALLINT DEFAULT 0 NOT NULL', SENDS: 'SMALLINT DEFAULT 1 NOT NULL',\n }, primaryKey: ['CHALLENGE_ID'] },\n // Token di servizio (macchina-a-macchina). Il segreto non e mai salvato in chiaro: TOKEN_HASH\n // contiene lo SHA-256 del segreto, confrontato a tempo costante in fase di verifica.\n ACCESSI_SERVICE_TOKEN: { columns: {\n TOKEN_ID: 'VARCHAR(40) CHARACTER SET ASCII NOT NULL', TOKEN_HASH: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n LABEL: 'VARCHAR(100) CHARACTER SET UTF8', SCOPES: 'VARCHAR(500) CHARACTER SET ASCII', CREATED_BY: 'INTEGER',\n CREATED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', EXPIRES_AT: 'TIMESTAMP', LAST_USED_AT: 'TIMESTAMP', LAST_USED_IP: 'VARCHAR(45)',\n REVOKED_AT: 'TIMESTAMP', REVOKED_BY: 'INTEGER',\n }, primaryKey: ['TOKEN_ID'] },\n};\n\nexport const accessiForeignKeys = [\n { name: 'FK_ABILITAZIONI_1', table: 'ABILITAZIONI', column: 'CODMNU', target: 'MENU', targetColumn: 'CODMNU' },\n { name: 'FK_MENU_1', table: 'MENU', column: 'CODGRP', target: 'MENU_GRP', targetColumn: 'CODGRP' },\n { name: 'FK_MENU_2', table: 'MENU', column: 'CODTIP', target: 'MENU_TIPI', targetColumn: 'CODTIP' },\n { name: 'FK_RUOLI', table: 'UTENTI_RUOLI', column: 'CODRUO', target: 'RUOLI', targetColumn: 'CODRUO', cascade: true },\n { name: 'FK_UTENTI', table: 'UTENTI_RUOLI', column: 'CODUTE', target: 'UTENTI', targetColumn: 'CODUTE', cascade: true },\n { name: 'FK_UTEIDEXT_UTENTE', table: 'UTENTI_IDENTITA_EXT', column: 'CODUTE', target: 'UTENTI', targetColumn: 'CODUTE', cascade: true },\n { name: 'FK_UTEIDEXT_PROVIDER', table: 'UTENTI_IDENTITA_EXT', column: 'PROVIDER', target: 'SSO_PROVIDER', targetColumn: 'PROVIDER' },\n { name: 'FK_ACCESSI_2FA_USER', table: 'ACCESSI_2FA', column: 'CODUTE', target: 'UTENTI', targetColumn: 'CODUTE', cascade: true },\n];\n\nexport const accessiIndexes = [\n { name: 'IDX_UTEIDEXT_CODUTE', table: 'UTENTI_IDENTITA_EXT', columns: ['CODUTE'] },\n { name: 'IDX_UTEIDEXT_PROVIDER', table: 'UTENTI_IDENTITA_EXT', columns: ['PROVIDER'] },\n { name: 'IDX_ACCESSI_2FA_USER', table: 'ACCESSI_2FA', columns: ['CODUTE', 'CREATED_AT'] },\n { name: 'IDX_ACCESSI_2FA_EXP', table: 'ACCESSI_2FA', columns: ['EXPIRES_AT'] },\n];\n\nexport const accessiChecks = [\n { name: 'CK_SSO_PROVIDER_ATTIVO', table: 'SSO_PROVIDER', expression: 'FLGATTIVO IN (0, 1)' },\n { name: 'CK_UTEIDEXT_ATTIVO', table: 'UTENTI_IDENTITA_EXT', expression: 'FLGATTIVO IN (0, 1)' },\n];\n\nexport const accessiTriggers = [\n { name: 'UTENTI_BI', table: 'UTENTI', type: 1, event: 'BEFORE INSERT', body: 'AS BEGIN IF (NEW.CODUTE IS NULL) THEN NEW.CODUTE = GEN_ID(GEN_UTENTI_ID, 1); NEW.DATINS = CURRENT_TIMESTAMP; END' },\n { name: 'RUOLI_BI', table: 'RUOLI', type: 1, event: 'BEFORE INSERT', body: 'AS BEGIN IF (NEW.CODRUO IS NULL) THEN NEW.CODRUO = GEN_ID(GEN_RUOLI_ID, 1); END' },\n { name: 'FILTRI_BI0', table: 'FILTRI', type: 1, event: 'BEFORE INSERT', body: 'AS DECLARE VARIABLE TOT INTEGER; BEGIN IF (NEW.PROG IS NULL) THEN BEGIN SELECT COALESCE(MAX(PROG), 0) FROM FILTRI WHERE CODUTE = NEW.CODUTE INTO :TOT; NEW.PROG = TOT + 1; END END' },\n { name: 'UTENTI_GDPR_BI0', table: 'UTENTI_GDPR', type: 1, event: 'BEFORE INSERT', body: 'AS BEGIN NEW.DATACC = CURRENT_TIMESTAMP; UPDATE UTENTI SET FLGGDPR = 1, DATGDPR = CURRENT_TIMESTAMP WHERE CODUTE = NEW.CODUTE; END' },\n];\n\nexport const accessiGenerators = [\n { name: 'GEN_UTENTI_ID', table: 'UTENTI', column: 'CODUTE' },\n { name: 'GEN_RUOLI_ID', table: 'RUOLI', column: 'CODRUO' },\n];\n"]}
1
+ {"version":3,"file":"accessiSchema.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/accessiSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/** Minimum schema owned by Accessi. Application columns and catalog rows are deliberately absent. */\nexport interface SchemaTable {\n columns: Record<string, string>;\n primaryKey: string[];\n}\n\nexport const ACCESSI_SCHEMA_VERSION = '1.11.0';\nexport const ACCESSI_VERSION_KEY = 'AccessiVersion';\n\n/**\n * Colonne storiche/applicative non piu di dominio Accessi. La riconciliazione le copia (se\n * previsto un rename) e poi le elimina, per evitare campi ibridi nello schema Accessi.\n */\nexport const accessiRenamedColumns: ReadonlyArray<{ table: string; from: string; to: string }> = [\n { table: 'UTENTI_CONFIG', from: 'FLGADMINCONFIG', to: 'FLGADMIN' },\n];\n\n/**\n * Copie di dati prima della rimozione di colonne applicative (anche tra tabelle diverse).\n * `joinColumn` e la chiave comune usata per correlare sorgente e destinazione.\n */\nexport const accessiColumnCopies: ReadonlyArray<{\n sourceTable: string;\n sourceColumn: string;\n targetTable: string;\n targetColumn: string;\n joinColumn: string;\n}> = [\n { sourceTable: 'UTENTI', sourceColumn: 'CELLUTE', targetTable: 'UTENTI_CONFIG', targetColumn: 'CELLULARE', joinColumn: 'CODUTE' },\n];\n\n/** Colonne application-specific eliminate dallo schema Accessi: i backend devono gestirle altrove. */\nexport const accessiObsoleteColumns: Record<string, readonly string[]> = {\n UTENTI: ['ENABLEIA', 'CELLUTE'],\n UTENTI_CONFIG: [\n 'FLGMOP', 'FLGPIANA', 'FLGADDETTI', 'FLGOSPITI', 'FLGPIANARFID',\n 'FLGCONTA', 'FLGCUBI', 'FLGCICLPASS', 'FLGDIPENDENTI', 'FLGINVENTARI',\n 'CAUMOV', 'NUMMAC', 'RAGSOCCLI', 'PAGDEF',\n ],\n MENU_GRP: ['NOMECAMPO'],\n};\n\nexport const accessiTables: Record<string, SchemaTable> = {\n PARAMETRI: { columns: { CODPAR: 'VARCHAR(15) NOT NULL', DESPAR: 'VARCHAR(255)', NOTE: 'BLOB SUB_TYPE 1', GRUPPO: 'VARCHAR(20)' }, primaryKey: ['CODPAR'] },\n UTENTI: { columns: {\n CODUTE: 'INTEGER NOT NULL', USRNAME: 'VARCHAR(100)', FLGGDPR: 'SMALLINT DEFAULT 0', DATGDPR: 'DATE',\n DATINS: 'DATE', DATSCAPWD: 'DATE', DATLASTLOGIN: 'DATE', STAREG: 'SMALLINT DEFAULT 0', KEYREG: 'VARCHAR(100)',\n }, primaryKey: ['CODUTE'] },\n UTENTI_CONFIG: { columns: {\n CODUTE: 'INTEGER NOT NULL', COGNOME: 'VARCHAR(50)', NOME: 'VARCHAR(50)', AVATAR: 'VARCHAR(30)',\n FLG2FATT: 'SMALLINT DEFAULT 0', FLGPWDLESS: 'SMALLINT DEFAULT 0 NOT NULL', FLGPASSWORD: 'SMALLINT DEFAULT 1 NOT NULL',\n CODLINGUA: \"VARCHAR(2) DEFAULT 'IT'\", FLGSUPER: 'SMALLINT DEFAULT 0', FLGADMIN: 'SMALLINT DEFAULT 0',\n CELLULARE: 'VARCHAR(30)', JSON_METADATA: 'BLOB SUB_TYPE 1',\n }, primaryKey: ['CODUTE'] },\n UTENTI_PWD: { columns: { CODUTE: 'INTEGER NOT NULL', PWD: 'VARCHAR(255)' }, primaryKey: ['CODUTE'] },\n UTENTI_OLDPWD: { columns: { CODUTE: 'INTEGER NOT NULL', OLDPWD: 'VARCHAR(255)' }, primaryKey: ['CODUTE'] },\n UTENTI_GDPR: { columns: { CODUTE: 'INTEGER NOT NULL', DATACC: 'DATE NOT NULL', GDPR: 'VARCHAR(2000)' }, primaryKey: ['CODUTE', 'DATACC'] },\n RUOLI: { columns: { CODRUO: 'INTEGER NOT NULL', DESRUO: 'VARCHAR(30)' }, primaryKey: ['CODRUO'] },\n MENU_GRP: { columns: { CODGRP: 'VARCHAR(1) NOT NULL', DESGRP: 'VARCHAR(100)', FLGENABLED: 'SMALLINT DEFAULT 0', ORDINE: 'SMALLINT DEFAULT 0' }, primaryKey: ['CODGRP'] },\n MENU_TIPI: { columns: { CODTIP: 'VARCHAR(1) NOT NULL', DESTIP: 'VARCHAR(20)' }, primaryKey: ['CODTIP'] },\n MENU: { columns: {\n CODMNU: 'VARCHAR(20) NOT NULL', DESMNU: 'VARCHAR(100)', CODGRP: 'VARCHAR(1) NOT NULL', FLGENABLED: 'INTEGER DEFAULT 0',\n ICON: 'VARCHAR(50)', ORDINE: 'SMALLINT', CODTIP: 'VARCHAR(1)', PAGINA: 'VARCHAR(50)', RIFMENU: 'VARCHAR(20)', NOTE: 'VARCHAR(1000)',\n }, primaryKey: ['CODMNU'] },\n ABILITAZIONI: { columns: { CODUTE: 'INTEGER NOT NULL', CODMNU: 'VARCHAR(20) NOT NULL', TIPABI: 'SMALLINT DEFAULT 0' }, primaryKey: ['CODUTE', 'CODMNU'] },\n RUOLI_MNU: { columns: { CODRUO: 'INTEGER NOT NULL', CODMNU: 'VARCHAR(20) NOT NULL', TIPABI: 'SMALLINT' }, primaryKey: ['CODRUO', 'CODMNU'] },\n UTENTI_RUOLI: { columns: { CODUTE: 'INTEGER NOT NULL', CODRUO: 'INTEGER NOT NULL' }, primaryKey: ['CODUTE', 'CODRUO'] },\n FILTRI_TIPO: { columns: { TIPFIL: 'SMALLINT NOT NULL', DESFIL: 'VARCHAR(20)', FLDFIL: 'VARCHAR(20)', FLGENABLED: 'SMALLINT DEFAULT 1 NOT NULL' }, primaryKey: ['TIPFIL'] },\n FILTRI: { columns: {\n CODUTE: 'INTEGER NOT NULL', PROG: 'INTEGER NOT NULL', TIPFIL: 'SMALLINT',\n NUMREP: 'INTEGER', IDXPERS: 'INTEGER', CODCLISUPER: 'INTEGER', CODAGE: 'INTEGER',\n CODCLICOL: 'INTEGER', CODCLIENTI: 'VARCHAR(2000)', CODDIP: 'INTEGER', IDXPOS: 'INTEGER', CODVET: 'INTEGER',\n }, primaryKey: ['CODUTE', 'PROG'] },\n SSO_PROVIDER: { columns: {\n PROVIDER: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL', DESCRIZIONE: 'VARCHAR(160) CHARACTER SET UTF8 NOT NULL',\n FLGATTIVO: 'SMALLINT DEFAULT 1 NOT NULL', DATINS: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', NOTA: 'VARCHAR(500) CHARACTER SET UTF8',\n }, primaryKey: ['PROVIDER'] },\n UTENTI_IDENTITA_EXT: { columns: {\n IDNKEY: 'CHAR(64) CHARACTER SET ASCII NOT NULL', CODUTE: 'INTEGER NOT NULL', PROVIDER: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n SUBJECT: 'VARCHAR(512) CHARACTER SET UTF8 NOT NULL', FLGATTIVO: 'SMALLINT DEFAULT 1 NOT NULL',\n DATINS: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', DATLASTLOGIN: 'TIMESTAMP', DATDISATT: 'TIMESTAMP', NOTA: 'VARCHAR(500) CHARACTER SET UTF8',\n }, primaryKey: ['IDNKEY'] },\n ACCESSI_2FA: { columns: {\n CHALLENGE_ID: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL', CODUTE: 'INTEGER NOT NULL', EMAIL: 'VARCHAR(254) CHARACTER SET UTF8 NOT NULL',\n AUTHMODE: 'VARCHAR(12) CHARACTER SET ASCII NOT NULL', IDNKEY: 'VARCHAR(64) CHARACTER SET ASCII', CODEHASH: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n CREATED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', EXPIRES_AT: 'TIMESTAMP NOT NULL', SENT_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL',\n ATTEMPTS: 'SMALLINT DEFAULT 0 NOT NULL', SENDS: 'SMALLINT DEFAULT 1 NOT NULL',\n }, primaryKey: ['CHALLENGE_ID'] },\n // Token di servizio (macchina-a-macchina). Il segreto non e mai salvato in chiaro: TOKEN_HASH\n // contiene lo SHA-256 del segreto, confrontato a tempo costante in fase di verifica.\n ACCESSI_SERVICE_TOKEN: { columns: {\n TOKEN_ID: 'VARCHAR(40) CHARACTER SET ASCII NOT NULL', TOKEN_HASH: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n LABEL: 'VARCHAR(100) CHARACTER SET UTF8', SCOPES: 'VARCHAR(500) CHARACTER SET ASCII', CREATED_BY: 'INTEGER',\n CREATED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL', EXPIRES_AT: 'TIMESTAMP', LAST_USED_AT: 'TIMESTAMP', LAST_USED_IP: 'VARCHAR(45)',\n REVOKED_AT: 'TIMESTAMP', REVOKED_BY: 'INTEGER',\n }, primaryKey: ['TOKEN_ID'] },\n // Ledger delle catalog migrations applicative (menu, ruoli, cataloghi): garantisce idempotenza\n // a livello di database. Lo schema e di Accessi, gli script restano nel backend ospitante.\n ACCESSI_CATALOG_SCRIPT: { columns: {\n SCRIPT_NAME: 'VARCHAR(255) CHARACTER SET ASCII NOT NULL',\n CHECKSUM: 'VARCHAR(64) CHARACTER SET ASCII NOT NULL',\n APPLIED_AT: 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL',\n APPLIED_COUNT: 'INTEGER DEFAULT 1 NOT NULL',\n NOTE: 'VARCHAR(500) CHARACTER SET UTF8',\n }, primaryKey: ['SCRIPT_NAME'] },\n};\n\nexport const accessiForeignKeys = [\n { name: 'FK_ABILITAZIONI_1', table: 'ABILITAZIONI', column: 'CODMNU', target: 'MENU', targetColumn: 'CODMNU' },\n { name: 'FK_MENU_1', table: 'MENU', column: 'CODGRP', target: 'MENU_GRP', targetColumn: 'CODGRP' },\n { name: 'FK_MENU_2', table: 'MENU', column: 'CODTIP', target: 'MENU_TIPI', targetColumn: 'CODTIP' },\n { name: 'FK_RUOLI', table: 'UTENTI_RUOLI', column: 'CODRUO', target: 'RUOLI', targetColumn: 'CODRUO', cascade: true },\n { name: 'FK_UTENTI', table: 'UTENTI_RUOLI', column: 'CODUTE', target: 'UTENTI', targetColumn: 'CODUTE', cascade: true },\n { name: 'FK_UTEIDEXT_UTENTE', table: 'UTENTI_IDENTITA_EXT', column: 'CODUTE', target: 'UTENTI', targetColumn: 'CODUTE', cascade: true },\n { name: 'FK_UTEIDEXT_PROVIDER', table: 'UTENTI_IDENTITA_EXT', column: 'PROVIDER', target: 'SSO_PROVIDER', targetColumn: 'PROVIDER' },\n { name: 'FK_ACCESSI_2FA_USER', table: 'ACCESSI_2FA', column: 'CODUTE', target: 'UTENTI', targetColumn: 'CODUTE', cascade: true },\n];\n\nexport const accessiIndexes = [\n { name: 'IDX_UTEIDEXT_CODUTE', table: 'UTENTI_IDENTITA_EXT', columns: ['CODUTE'] },\n { name: 'IDX_UTEIDEXT_PROVIDER', table: 'UTENTI_IDENTITA_EXT', columns: ['PROVIDER'] },\n { name: 'IDX_ACCESSI_2FA_USER', table: 'ACCESSI_2FA', columns: ['CODUTE', 'CREATED_AT'] },\n { name: 'IDX_ACCESSI_2FA_EXP', table: 'ACCESSI_2FA', columns: ['EXPIRES_AT'] },\n];\n\nexport const accessiChecks = [\n { name: 'CK_SSO_PROVIDER_ATTIVO', table: 'SSO_PROVIDER', expression: 'FLGATTIVO IN (0, 1)' },\n { name: 'CK_UTEIDEXT_ATTIVO', table: 'UTENTI_IDENTITA_EXT', expression: 'FLGATTIVO IN (0, 1)' },\n];\n\nexport const accessiTriggers = [\n { name: 'UTENTI_BI', table: 'UTENTI', type: 1, event: 'BEFORE INSERT', body: 'AS BEGIN IF (NEW.CODUTE IS NULL) THEN NEW.CODUTE = GEN_ID(GEN_UTENTI_ID, 1); NEW.DATINS = CURRENT_TIMESTAMP; END' },\n { name: 'RUOLI_BI', table: 'RUOLI', type: 1, event: 'BEFORE INSERT', body: 'AS BEGIN IF (NEW.CODRUO IS NULL) THEN NEW.CODRUO = GEN_ID(GEN_RUOLI_ID, 1); END' },\n { name: 'FILTRI_BI0', table: 'FILTRI', type: 1, event: 'BEFORE INSERT', body: 'AS DECLARE VARIABLE TOT INTEGER; BEGIN IF (NEW.PROG IS NULL) THEN BEGIN SELECT COALESCE(MAX(PROG), 0) FROM FILTRI WHERE CODUTE = NEW.CODUTE INTO :TOT; NEW.PROG = TOT + 1; END END' },\n { name: 'UTENTI_GDPR_BI0', table: 'UTENTI_GDPR', type: 1, event: 'BEFORE INSERT', body: 'AS BEGIN NEW.DATACC = CURRENT_TIMESTAMP; UPDATE UTENTI SET FLGGDPR = 1, DATGDPR = CURRENT_TIMESTAMP WHERE CODUTE = NEW.CODUTE; END' },\n];\n\nexport const accessiGenerators = [\n { name: 'GEN_UTENTI_ID', table: 'UTENTI', column: 'CODUTE' },\n { name: 'GEN_RUOLI_ID', table: 'RUOLI', column: 'CODRUO' },\n];\n"]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const AccessiDatabaseUpdater_1 = require("./AccessiDatabaseUpdater");
13
+ const AccessiCatalogMigrator_1 = require("./AccessiCatalogMigrator");
14
+ const accessiOptionsFromEnv_1 = require("./accessiOptionsFromEnv");
15
+ const Orm_1 = require("../../Orm");
16
+ function main() {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ var _a;
19
+ const options = (0, accessiOptionsFromEnv_1.createAccessiOptionsFromEnv)();
20
+ if (!((_a = options.catalogScripts) === null || _a === void 0 ? void 0 : _a.folder)) {
21
+ throw new Error("Variabile ambiente mancante: ACCESSI_CATALOG_FOLDER (cartella delle catalog migrations).");
22
+ }
23
+ const checkOnly = process.argv.includes('--check');
24
+ console.log(`[Accessi Catalog] Target: ${options.databaseOptions.host}:${options.databaseOptions.port} -> ${options.databaseOptions.database}`);
25
+ console.log(`[Accessi Catalog] Cartella: ${options.catalogScripts.folder}`);
26
+ // Prima lo schema si adegua, poi si eseguono gli script di catalogo.
27
+ if (!checkOnly) {
28
+ console.log('[Accessi Catalog] Riconciliazione schema...');
29
+ yield AccessiDatabaseUpdater_1.AccessiDatabaseUpdater.run(options);
30
+ }
31
+ if (checkOnly) {
32
+ const pending = yield (0, AccessiCatalogMigrator_1.listPendingCatalogScripts)(options);
33
+ console.log(`[Accessi Catalog] Gia applicati: ${pending.applied.length}`);
34
+ console.log(`[Accessi Catalog] Da applicare: ${pending.pending.length}${pending.pending.length ? ` -> ${pending.pending.join(', ')}` : ''}`);
35
+ console.log(`[Accessi Catalog] Modificati (checksum diverso): ${pending.changed.length}${pending.changed.length ? ` -> ${pending.changed.join(', ')}` : ''}`);
36
+ console.log(`[Accessi Catalog] Non conformi (solo DML): ${pending.invalid.length}`);
37
+ for (const entry of pending.invalid) {
38
+ for (const violation of entry.violations)
39
+ console.error(`[Accessi Catalog] Non conforme: ${entry.script} -> ${violation}`);
40
+ }
41
+ if (pending.invalid.length)
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ const report = yield (0, AccessiCatalogMigrator_1.applyCatalogScripts)(options);
46
+ console.log(`[Accessi Catalog] Scoperti: ${report.discovered} | Applicati: ${report.applied.length} | Saltati: ${report.skipped.length} | Non conformi: ${report.invalid.length} | Falliti: ${report.failed.length}`);
47
+ if (report.applied.length)
48
+ console.log(`[Accessi Catalog] Applicati: ${report.applied.join(', ')}`);
49
+ for (const entry of report.invalid) {
50
+ for (const violation of entry.violations)
51
+ console.error(`[Accessi Catalog] Non conforme: ${entry.script} -> ${violation}`);
52
+ }
53
+ if (report.failed.length) {
54
+ for (const failure of report.failed)
55
+ console.error(`[Accessi Catalog] Fallito: ${failure.script} -> ${failure.error}`);
56
+ }
57
+ if (report.failed.length || report.invalid.length)
58
+ process.exitCode = 1;
59
+ });
60
+ }
61
+ main()
62
+ .then(() => Orm_1.Orm.closePools())
63
+ .then(() => { var _a; return process.exit((_a = process.exitCode) !== null && _a !== void 0 ? _a : 0); })
64
+ .catch((error) => __awaiter(void 0, void 0, void 0, function* () {
65
+ console.error("[Accessi Catalog] Errore durante l'esecuzione:", error);
66
+ yield Orm_1.Orm.closePools().catch(() => undefined);
67
+ process.exit(1);
68
+ }));
69
+ //# sourceMappingURL=runAccessiCatalogMigrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runAccessiCatalogMigrations.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/runAccessiCatalogMigrations.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccessiDatabaseUpdater } from \"./AccessiDatabaseUpdater\";\nimport { applyCatalogScripts, listPendingCatalogScripts } from \"./AccessiCatalogMigrator\";\nimport { createAccessiOptionsFromEnv } from \"./accessiOptionsFromEnv\";\nimport { Orm } from \"../../Orm\";\n\nasync function main(): Promise<void> {\n const options = createAccessiOptionsFromEnv();\n if (!options.catalogScripts?.folder) {\n throw new Error(\"Variabile ambiente mancante: ACCESSI_CATALOG_FOLDER (cartella delle catalog migrations).\");\n }\n\n const checkOnly = process.argv.includes('--check');\n console.log(`[Accessi Catalog] Target: ${options.databaseOptions.host}:${options.databaseOptions.port} -> ${options.databaseOptions.database}`);\n console.log(`[Accessi Catalog] Cartella: ${options.catalogScripts.folder}`);\n\n // Prima lo schema si adegua, poi si eseguono gli script di catalogo.\n if (!checkOnly) {\n console.log('[Accessi Catalog] Riconciliazione schema...');\n await AccessiDatabaseUpdater.run(options);\n }\n\n if (checkOnly) {\n const pending = await listPendingCatalogScripts(options);\n console.log(`[Accessi Catalog] Gia applicati: ${pending.applied.length}`);\n console.log(`[Accessi Catalog] Da applicare: ${pending.pending.length}${pending.pending.length ? ` -> ${pending.pending.join(', ')}` : ''}`);\n console.log(`[Accessi Catalog] Modificati (checksum diverso): ${pending.changed.length}${pending.changed.length ? ` -> ${pending.changed.join(', ')}` : ''}`);\n console.log(`[Accessi Catalog] Non conformi (solo DML): ${pending.invalid.length}`);\n for (const entry of pending.invalid) {\n for (const violation of entry.violations) console.error(`[Accessi Catalog] Non conforme: ${entry.script} -> ${violation}`);\n }\n if (pending.invalid.length) process.exitCode = 1;\n return;\n }\n\n const report = await applyCatalogScripts(options);\n console.log(`[Accessi Catalog] Scoperti: ${report.discovered} | Applicati: ${report.applied.length} | Saltati: ${report.skipped.length} | Non conformi: ${report.invalid.length} | Falliti: ${report.failed.length}`);\n if (report.applied.length) console.log(`[Accessi Catalog] Applicati: ${report.applied.join(', ')}`);\n for (const entry of report.invalid) {\n for (const violation of entry.violations) console.error(`[Accessi Catalog] Non conforme: ${entry.script} -> ${violation}`);\n }\n if (report.failed.length) {\n for (const failure of report.failed) console.error(`[Accessi Catalog] Fallito: ${failure.script} -> ${failure.error}`);\n }\n if (report.failed.length || report.invalid.length) process.exitCode = 1;\n}\n\nmain()\n .then(() => Orm.closePools())\n .then(() => process.exit(process.exitCode ?? 0))\n .catch(async (error) => {\n console.error(\"[Accessi Catalog] Errore durante l'esecuzione:\", error);\n await Orm.closePools().catch(() => undefined);\n process.exit(1);\n });\n"]}