emilsoftware-utilities 2.0.0-dev.39 → 2.0.0-dev.40

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 (26) hide show
  1. package/dist/accessi-module/Console/console.js +10 -2
  2. package/dist/accessi-module/Console/console.js.map +1 -1
  3. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.d.ts +6 -0
  4. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js.map +1 -1
  5. package/dist/accessi-module/Console/generated/model/registerRequest.d.ts +6 -0
  6. package/dist/accessi-module/Console/generated/model/registerRequest.js.map +1 -1
  7. package/dist/accessi-module/Console/generated/model/userDto.d.ts +6 -0
  8. package/dist/accessi-module/Console/generated/model/userDto.js.map +1 -1
  9. package/dist/accessi-module/Console/help.js +7 -0
  10. package/dist/accessi-module/Console/help.js.map +1 -1
  11. package/dist/accessi-module/Console/wiki.js +1 -1
  12. package/dist/accessi-module/Console/wiki.js.map +1 -1
  13. package/dist/accessi-module/Dtos/RegisterRequest.d.ts +1 -0
  14. package/dist/accessi-module/Dtos/RegisterRequest.js +13 -0
  15. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  16. package/dist/accessi-module/Dtos/UserDto.d.ts +1 -0
  17. package/dist/accessi-module/Dtos/UserDto.js +13 -0
  18. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  19. package/dist/accessi-module/Services/UserService/UserService.js +11 -0
  20. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  21. package/dist/accessi-module/database-updates/accessiSchema.d.ts +1 -1
  22. package/dist/accessi-module/database-updates/accessiSchema.js +3 -3
  23. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -1
  24. package/dist/emilsoftware-utilities-2.0.0-dev.40.tgz +0 -0
  25. package/package.json +1 -1
  26. package/dist/emilsoftware-utilities-2.0.0-dev.39.tgz +0 -0
@@ -57,6 +57,19 @@ __decorate([
57
57
  (0, class_validator_1.Length)(1, 50, { message: "Il cellulare deve essere compreso tra 1 e 50 caratteri." }),
58
58
  __metadata("design:type", Object)
59
59
  ], RegisterRequest.prototype, "cellulare", void 0);
60
+ __decorate([
61
+ (0, swagger_1.ApiPropertyOptional)({
62
+ description: "Pagina di default mostrata all'utente dopo il login (percorso o codice pagina).",
63
+ type: String,
64
+ example: "/dashboard",
65
+ maxLength: 50,
66
+ nullable: true,
67
+ }),
68
+ (0, class_validator_1.IsOptional)(),
69
+ (0, class_validator_1.IsString)({ message: "La pagina di default deve essere una stringa." }),
70
+ (0, class_validator_1.Length)(1, 50, { message: "La pagina di default non puo superare 50 caratteri." }),
71
+ __metadata("design:type", Object)
72
+ ], RegisterRequest.prototype, "paginaDefault", void 0);
60
73
  __decorate([
61
74
  (0, swagger_1.ApiPropertyOptional)({ description: "Flag superutente.", example: false }),
62
75
  (0, class_validator_1.IsOptional)(),
@@ -1 +1 @@
1
- {"version":3,"file":"RegisterRequest.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/RegisterRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiProperty, ApiPropertyOptional, OmitType } from \"@nestjs/swagger\";\nimport { Transform, Type } from \"class-transformer\";\nimport {\n ArrayUnique,\n IsArray,\n IsBoolean,\n IsInt,\n IsOptional,\n IsString,\n Length,\n ValidateNested,\n} from \"class-validator\";\nimport { Permission } from \"./Permission\";\nimport { TipoAbilitazione } from \"./TipoAbilitazione\";\nimport { FiltriUtente } from \"./FiltriUtente\";\n\nexport class RegisterRequest extends OmitType(FiltriUtente, ['codUte'] as const) {\n @ApiProperty({\n description: \"Email dell'utente.\",\n example: \"mario.rossi@dev.it\",\n })\n @IsString({ message: \"L'email deve essere una stringa.\" })\n @Length(3, 254, { message: \"L'email deve essere compresa tra 3 e 254 caratteri.\" })\n email!: string;\n\n @ApiPropertyOptional({\n description: \"Cognome dell'utente.\",\n example: \"Rossi\",\n })\n @IsOptional()\n @IsString({ message: \"Il cognome deve essere una stringa.\" })\n @Length(1, 255, { message: \"Il cognome deve essere compreso tra 1 e 255 caratteri.\" })\n cognome?: string;\n\n @ApiPropertyOptional({ description: \"Nome dell'utente.\", example: \"Mario\" })\n @IsOptional()\n @IsString({ message: \"Il nome deve essere una stringa.\" })\n @Length(1, 255, { message: \"Il nome deve essere compreso tra 1 e 255 caratteri.\" })\n nome?: string;\n\n @ApiPropertyOptional({\n description: \"Numero di cellulare.\",\n type: String,\n example: \"+393401234567\",\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: \"Il cellulare deve essere una stringa.\" })\n @Length(1, 50, { message: \"Il cellulare deve essere compreso tra 1 e 50 caratteri.\" })\n cellulare?: string | null;\n\n @ApiPropertyOptional({ description: \"Flag superutente.\", example: false })\n @IsOptional()\n @IsBoolean({ message: \"Il flag superutente deve essere booleano.\" })\n flagSuper?: boolean;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'utente è configuratore\",\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: \"Il flag configuratore deve essere booleano.\" })\n flagAdmin?: boolean;\n\n @ApiPropertyOptional({\n description: \"Ruoli assegnati all'utente.\",\n example: [1, 2],\n })\n @IsOptional()\n @IsArray({ message: \"I ruoli devono essere un array.\" })\n @ArrayUnique({ message: \"I ruoli non possono contenere duplicati.\" })\n @Type(() => Number)\n @IsInt({ each: true, message: \"Ogni ruolo deve essere un intero.\" })\n roles?: number[];\n\n @ApiPropertyOptional({\n description: \"Permessi assegnati all'utente.\",\n type: [Permission],\n example: [\n {\n codiceMenu: \"MNUOFFICINA\",\n tipoAbilitazione: TipoAbilitazione.SCRITTURA,\n },\n ],\n })\n @IsOptional()\n @IsArray({ message: \"I permessi devono essere un array.\" })\n @ValidateNested({ each: true })\n @Type(() => Permission)\n permissions?: Permission[];\n\n @ApiPropertyOptional({\n description: \"Avatar dell'utente.\",\n example: \"user.svg\",\n })\n @IsOptional()\n @IsString({ message: \"L'avatar deve essere una stringa.\" })\n avatar?: string;\n\n @ApiPropertyOptional({\n description: \"Flag autenticazione a due fattori.\",\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: \"Il flag due fattori deve essere booleano.\" })\n @Transform(({ obj, key }) => obj[key])\n flagDueFattori?: boolean;\n\n @ApiPropertyOptional({\n description: \"HTML mail personalizzato\",\n example: \"<html></html>\",\n })\n @IsOptional()\n @IsString({ message: \"L'HTML della mail deve essere una stringa.\" })\n htmlMail?: string;\n}\n"]}
1
+ {"version":3,"file":"RegisterRequest.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/RegisterRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiProperty, ApiPropertyOptional, OmitType } from \"@nestjs/swagger\";\nimport { Transform, Type } from \"class-transformer\";\nimport {\n ArrayUnique,\n IsArray,\n IsBoolean,\n IsInt,\n IsOptional,\n IsString,\n Length,\n ValidateNested,\n} from \"class-validator\";\nimport { Permission } from \"./Permission\";\nimport { TipoAbilitazione } from \"./TipoAbilitazione\";\nimport { FiltriUtente } from \"./FiltriUtente\";\n\nexport class RegisterRequest extends OmitType(FiltriUtente, ['codUte'] as const) {\n @ApiProperty({\n description: \"Email dell'utente.\",\n example: \"mario.rossi@dev.it\",\n })\n @IsString({ message: \"L'email deve essere una stringa.\" })\n @Length(3, 254, { message: \"L'email deve essere compresa tra 3 e 254 caratteri.\" })\n email!: string;\n\n @ApiPropertyOptional({\n description: \"Cognome dell'utente.\",\n example: \"Rossi\",\n })\n @IsOptional()\n @IsString({ message: \"Il cognome deve essere una stringa.\" })\n @Length(1, 255, { message: \"Il cognome deve essere compreso tra 1 e 255 caratteri.\" })\n cognome?: string;\n\n @ApiPropertyOptional({ description: \"Nome dell'utente.\", example: \"Mario\" })\n @IsOptional()\n @IsString({ message: \"Il nome deve essere una stringa.\" })\n @Length(1, 255, { message: \"Il nome deve essere compreso tra 1 e 255 caratteri.\" })\n nome?: string;\n\n @ApiPropertyOptional({\n description: \"Numero di cellulare.\",\n type: String,\n example: \"+393401234567\",\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: \"Il cellulare deve essere una stringa.\" })\n @Length(1, 50, { message: \"Il cellulare deve essere compreso tra 1 e 50 caratteri.\" })\n cellulare?: string | null;\n\n @ApiPropertyOptional({\n description: \"Pagina di default mostrata all'utente dopo il login (percorso o codice pagina).\",\n type: String,\n example: \"/dashboard\",\n maxLength: 50,\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: \"La pagina di default deve essere una stringa.\" })\n @Length(1, 50, { message: \"La pagina di default non puo superare 50 caratteri.\" })\n paginaDefault?: string | null;\n\n @ApiPropertyOptional({ description: \"Flag superutente.\", example: false })\n @IsOptional()\n @IsBoolean({ message: \"Il flag superutente deve essere booleano.\" })\n flagSuper?: boolean;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'utente è configuratore\",\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: \"Il flag configuratore deve essere booleano.\" })\n flagAdmin?: boolean;\n\n @ApiPropertyOptional({\n description: \"Ruoli assegnati all'utente.\",\n example: [1, 2],\n })\n @IsOptional()\n @IsArray({ message: \"I ruoli devono essere un array.\" })\n @ArrayUnique({ message: \"I ruoli non possono contenere duplicati.\" })\n @Type(() => Number)\n @IsInt({ each: true, message: \"Ogni ruolo deve essere un intero.\" })\n roles?: number[];\n\n @ApiPropertyOptional({\n description: \"Permessi assegnati all'utente.\",\n type: [Permission],\n example: [\n {\n codiceMenu: \"MNUOFFICINA\",\n tipoAbilitazione: TipoAbilitazione.SCRITTURA,\n },\n ],\n })\n @IsOptional()\n @IsArray({ message: \"I permessi devono essere un array.\" })\n @ValidateNested({ each: true })\n @Type(() => Permission)\n permissions?: Permission[];\n\n @ApiPropertyOptional({\n description: \"Avatar dell'utente.\",\n example: \"user.svg\",\n })\n @IsOptional()\n @IsString({ message: \"L'avatar deve essere una stringa.\" })\n avatar?: string;\n\n @ApiPropertyOptional({\n description: \"Flag autenticazione a due fattori.\",\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: \"Il flag due fattori deve essere booleano.\" })\n @Transform(({ obj, key }) => obj[key])\n flagDueFattori?: boolean;\n\n @ApiPropertyOptional({\n description: \"HTML mail personalizzato\",\n example: \"<html></html>\",\n })\n @IsOptional()\n @IsString({ message: \"L'HTML della mail deve essere una stringa.\" })\n htmlMail?: string;\n}\n"]}
@@ -24,6 +24,7 @@ export declare class UserDto extends UserDto_base {
24
24
  passwordlessLoginEnabled?: boolean;
25
25
  codiceLingua?: string;
26
26
  cellulare?: string | null;
27
+ paginaDefault?: string | null;
27
28
  flagSuper?: boolean;
28
29
  flagAdmin?: boolean;
29
30
  passwordLoginEnabled?: boolean;
@@ -166,6 +166,19 @@ __decorate([
166
166
  (0, class_validator_1.Length)(1, 50, { message: 'Il cellulare deve essere compreso tra 1 e 50 caratteri.' }),
167
167
  __metadata("design:type", Object)
168
168
  ], UserDto.prototype, "cellulare", void 0);
169
+ __decorate([
170
+ (0, swagger_1.ApiPropertyOptional)({
171
+ description: "Pagina di default mostrata all'utente dopo il login (percorso o codice pagina).",
172
+ type: String,
173
+ example: '/dashboard',
174
+ maxLength: 50,
175
+ nullable: true,
176
+ }),
177
+ (0, class_validator_1.IsOptional)(),
178
+ (0, class_validator_1.IsString)({ message: 'La pagina di default deve essere una stringa.' }),
179
+ (0, class_validator_1.Length)(1, 50, { message: 'La pagina di default non puo superare 50 caratteri.' }),
180
+ __metadata("design:type", Object)
181
+ ], UserDto.prototype, "paginaDefault", void 0);
169
182
  __decorate([
170
183
  (0, swagger_1.ApiPropertyOptional)({ description: 'Flag superutente.', example: false }),
171
184
  (0, class_validator_1.IsOptional)(),
@@ -1 +1 @@
1
- {"version":3,"file":"UserDto.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/UserDto.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';\nimport { Transform, Type } from 'class-transformer';\nimport {\n ArrayUnique,\n IsArray,\n IsBoolean,\n IsEnum,\n IsInt,\n IsOptional,\n IsString,\n Length,\n Min,\n ValidateNested,\n} from 'class-validator';\nimport { StatoRegistrazione } from './StatoRegistrazione';\nimport { Permission } from './Permission';\nimport { TipoAbilitazione } from './TipoAbilitazione';\nimport { FiltriUtente } from './FiltriUtente';\n\n/**\n * Profilo Accessi con dati anagrafici, policy di accesso e filtri legacy.\n * I campi amministrativi (`flagSuper`, `flagAdmin`, ruoli, grant e policy password) devono essere\n * accettati soltanto da endpoint e flussi backend esplicitamente privilegiati.\n */\nexport class UserDto extends OmitType(FiltriUtente, ['codUte'] as const) {\n @ApiProperty({ description: \"Codice identificativo univoco dell'utente.\", example: 123 })\n @IsOptional()\n @Type(() => Number)\n @IsInt({ message: 'Il codice utente deve essere un intero.' })\n @Min(1, { message: 'Il codice utente deve essere maggiore di zero.' })\n codiceUtente!: number;\n\n @ApiProperty({ description: \"Email dell'utente.\", example: 'mario.rossi@dev.it' })\n @IsOptional()\n @IsString({ message: \"L'email deve essere una stringa.\" })\n @Length(3, 254, { message: \"L'email deve essere compresa tra 3 e 254 caratteri.\" })\n email!: string;\n\n @ApiPropertyOptional({ description: \"Flag per l'accettazione del GDPR.\", example: true })\n @IsOptional()\n @IsBoolean({ message: 'Il flag GDPR deve essere booleano.' })\n flagGdpr?: boolean;\n\n @ApiPropertyOptional({\n description: 'Data di accettazione del GDPR.',\n format: 'date-time',\n example: '2024-03-18T12:34:56Z',\n })\n @IsOptional()\n @IsString({ message: 'La data GDPR deve essere una stringa.' })\n dataGdpr?: string;\n\n @ApiPropertyOptional({\n description: \"Data di inserimento dell'utente nel sistema.\",\n format: 'date-time',\n example: '2023-01-01T08:30:00Z',\n })\n @IsOptional()\n @IsString({ message: 'La data di inserimento deve essere una stringa.' })\n dataInserimento?: string;\n\n @ApiPropertyOptional({\n description: 'Data scadenza password.',\n format: 'date-time',\n example: '2025-06-01',\n })\n @IsOptional()\n @IsString({ message: 'La data scadenza password deve essere una stringa.' })\n dataScadenzaPassword?: string;\n\n @ApiPropertyOptional({\n description: \"Ultima data di accesso dell'utente.\",\n format: 'date-time',\n example: '2024-03-15T14:45:00Z',\n })\n @IsOptional()\n @IsString({ message: 'La data ultimo accesso deve essere una stringa.' })\n dataLastLogin?: string;\n\n @ApiPropertyOptional({\n description: \"Stato della registrazione dell'utente.\",\n enum: StatoRegistrazione,\n example: StatoRegistrazione.CONF,\n })\n @IsOptional()\n @IsEnum(StatoRegistrazione, { message: 'Lo stato di registrazione non e valido.' })\n statoRegistrazione?: StatoRegistrazione;\n\n @ApiPropertyOptional({\n description: \"Chiave di registrazione dell'utente.\",\n example: 'abc123xyz',\n })\n @IsOptional()\n @IsString({ message: 'La chiave registrazione deve essere una stringa.' })\n keyRegistrazione?: string;\n\n @ApiPropertyOptional({ description: \"Cognome dell'utente.\", example: 'Rossi' })\n @IsOptional()\n @IsString({ message: 'Il cognome deve essere una stringa.' })\n @Length(1, 255, { message: 'Il cognome deve essere compreso tra 1 e 255 caratteri.' })\n cognome?: string;\n\n @ApiPropertyOptional({ description: \"Nome dell'utente.\", example: 'Mario' })\n @IsOptional()\n @IsString({ message: 'Il nome deve essere una stringa.' })\n @Length(1, 255, { message: 'Il nome deve essere compreso tra 1 e 255 caratteri.' })\n nome?: string;\n\n @ApiPropertyOptional({\n description: 'Avatar (URL o base64).',\n type: String,\n example: 'https://example.com/avatar.jpg',\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: \"L'avatar deve essere una stringa.\" })\n avatar?: string | null;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'autenticazione a due fattori è attivata.\",\n example: true,\n })\n @IsOptional()\n @IsBoolean({ message: 'Il flag due fattori deve essere booleano.' })\n @Transform(({ obj, key }) => obj[key])\n flagDueFattori?: boolean;\n\n @ApiPropertyOptional({ description: 'Consente accesso con il solo codice email. Richiede flagDueFattori e viene gestito dagli amministratori.', default: false })\n @IsOptional()\n @IsBoolean()\n @Transform(({ obj, key }) => obj[key])\n passwordlessLoginEnabled?: boolean;\n\n @ApiPropertyOptional({ description: 'Codice lingua preferito.', example: 'it' })\n @IsOptional()\n @IsString({ message: 'Il codice lingua deve essere una stringa.' })\n @Length(1, 20, { message: 'Il codice lingua deve essere compreso tra 1 e 20 caratteri.' })\n codiceLingua?: string;\n\n @ApiPropertyOptional({\n description: 'Numero di cellulare.',\n type: String,\n example: '+393401234567',\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: 'Il cellulare deve essere una stringa.' })\n @Length(1, 50, { message: 'Il cellulare deve essere compreso tra 1 e 50 caratteri.' })\n cellulare?: string | null;\n\n @ApiPropertyOptional({ description: 'Flag superutente.', example: false })\n @IsOptional()\n @IsBoolean({ message: 'Il flag superutente deve essere booleano.' })\n flagSuper?: boolean;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'utente è configuratore\",\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: 'Il flag configuratore deve essere booleano.' })\n flagAdmin?: boolean;\n\n @ApiPropertyOptional({\n description: 'Abilita il login locale con password. Se false, l utente puo autenticarsi solo tramite identita SSO attive.',\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: 'Il flag login password deve essere booleano.' })\n passwordLoginEnabled?: boolean;\n\n @ApiPropertyOptional({\n description: 'Metadata JSON personalizzato.',\n example: '{\"theme\": \"dark\"}',\n })\n @IsOptional()\n @IsString({ message: 'I metadata JSON devono essere una stringa.' })\n jsonMetadata?: string;\n\n @ApiPropertyOptional({ description: \"Ruoli assegnati all'utente.\", example: [1, 2] })\n @IsOptional()\n @IsArray({ message: 'I ruoli devono essere un array.' })\n @ArrayUnique({ message: 'I ruoli non possono contenere duplicati.' })\n @Type(() => Number)\n @IsInt({ each: true, message: 'Ogni ruolo deve essere un intero.' })\n roles?: number[];\n\n @ApiPropertyOptional({\n description: \"Permessi assegnati all'utente.\",\n type: [Permission],\n example: [{ codiceMenu: 'MNUOFFICINA', tipoAbilitazione: TipoAbilitazione.SCRITTURA }],\n })\n @IsOptional()\n @IsArray({ message: 'I permessi devono essere un array.' })\n @ValidateNested({ each: true })\n @Type(() => Permission)\n permissions?: Permission[];\n}\n"]}
1
+ {"version":3,"file":"UserDto.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/UserDto.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';\nimport { Transform, Type } from 'class-transformer';\nimport {\n ArrayUnique,\n IsArray,\n IsBoolean,\n IsEnum,\n IsInt,\n IsOptional,\n IsString,\n Length,\n Min,\n ValidateNested,\n} from 'class-validator';\nimport { StatoRegistrazione } from './StatoRegistrazione';\nimport { Permission } from './Permission';\nimport { TipoAbilitazione } from './TipoAbilitazione';\nimport { FiltriUtente } from './FiltriUtente';\n\n/**\n * Profilo Accessi con dati anagrafici, policy di accesso e filtri legacy.\n * I campi amministrativi (`flagSuper`, `flagAdmin`, ruoli, grant e policy password) devono essere\n * accettati soltanto da endpoint e flussi backend esplicitamente privilegiati.\n */\nexport class UserDto extends OmitType(FiltriUtente, ['codUte'] as const) {\n @ApiProperty({ description: \"Codice identificativo univoco dell'utente.\", example: 123 })\n @IsOptional()\n @Type(() => Number)\n @IsInt({ message: 'Il codice utente deve essere un intero.' })\n @Min(1, { message: 'Il codice utente deve essere maggiore di zero.' })\n codiceUtente!: number;\n\n @ApiProperty({ description: \"Email dell'utente.\", example: 'mario.rossi@dev.it' })\n @IsOptional()\n @IsString({ message: \"L'email deve essere una stringa.\" })\n @Length(3, 254, { message: \"L'email deve essere compresa tra 3 e 254 caratteri.\" })\n email!: string;\n\n @ApiPropertyOptional({ description: \"Flag per l'accettazione del GDPR.\", example: true })\n @IsOptional()\n @IsBoolean({ message: 'Il flag GDPR deve essere booleano.' })\n flagGdpr?: boolean;\n\n @ApiPropertyOptional({\n description: 'Data di accettazione del GDPR.',\n format: 'date-time',\n example: '2024-03-18T12:34:56Z',\n })\n @IsOptional()\n @IsString({ message: 'La data GDPR deve essere una stringa.' })\n dataGdpr?: string;\n\n @ApiPropertyOptional({\n description: \"Data di inserimento dell'utente nel sistema.\",\n format: 'date-time',\n example: '2023-01-01T08:30:00Z',\n })\n @IsOptional()\n @IsString({ message: 'La data di inserimento deve essere una stringa.' })\n dataInserimento?: string;\n\n @ApiPropertyOptional({\n description: 'Data scadenza password.',\n format: 'date-time',\n example: '2025-06-01',\n })\n @IsOptional()\n @IsString({ message: 'La data scadenza password deve essere una stringa.' })\n dataScadenzaPassword?: string;\n\n @ApiPropertyOptional({\n description: \"Ultima data di accesso dell'utente.\",\n format: 'date-time',\n example: '2024-03-15T14:45:00Z',\n })\n @IsOptional()\n @IsString({ message: 'La data ultimo accesso deve essere una stringa.' })\n dataLastLogin?: string;\n\n @ApiPropertyOptional({\n description: \"Stato della registrazione dell'utente.\",\n enum: StatoRegistrazione,\n example: StatoRegistrazione.CONF,\n })\n @IsOptional()\n @IsEnum(StatoRegistrazione, { message: 'Lo stato di registrazione non e valido.' })\n statoRegistrazione?: StatoRegistrazione;\n\n @ApiPropertyOptional({\n description: \"Chiave di registrazione dell'utente.\",\n example: 'abc123xyz',\n })\n @IsOptional()\n @IsString({ message: 'La chiave registrazione deve essere una stringa.' })\n keyRegistrazione?: string;\n\n @ApiPropertyOptional({ description: \"Cognome dell'utente.\", example: 'Rossi' })\n @IsOptional()\n @IsString({ message: 'Il cognome deve essere una stringa.' })\n @Length(1, 255, { message: 'Il cognome deve essere compreso tra 1 e 255 caratteri.' })\n cognome?: string;\n\n @ApiPropertyOptional({ description: \"Nome dell'utente.\", example: 'Mario' })\n @IsOptional()\n @IsString({ message: 'Il nome deve essere una stringa.' })\n @Length(1, 255, { message: 'Il nome deve essere compreso tra 1 e 255 caratteri.' })\n nome?: string;\n\n @ApiPropertyOptional({\n description: 'Avatar (URL o base64).',\n type: String,\n example: 'https://example.com/avatar.jpg',\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: \"L'avatar deve essere una stringa.\" })\n avatar?: string | null;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'autenticazione a due fattori è attivata.\",\n example: true,\n })\n @IsOptional()\n @IsBoolean({ message: 'Il flag due fattori deve essere booleano.' })\n @Transform(({ obj, key }) => obj[key])\n flagDueFattori?: boolean;\n\n @ApiPropertyOptional({ description: 'Consente accesso con il solo codice email. Richiede flagDueFattori e viene gestito dagli amministratori.', default: false })\n @IsOptional()\n @IsBoolean()\n @Transform(({ obj, key }) => obj[key])\n passwordlessLoginEnabled?: boolean;\n\n @ApiPropertyOptional({ description: 'Codice lingua preferito.', example: 'it' })\n @IsOptional()\n @IsString({ message: 'Il codice lingua deve essere una stringa.' })\n @Length(1, 20, { message: 'Il codice lingua deve essere compreso tra 1 e 20 caratteri.' })\n codiceLingua?: string;\n\n @ApiPropertyOptional({\n description: 'Numero di cellulare.',\n type: String,\n example: '+393401234567',\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: 'Il cellulare deve essere una stringa.' })\n @Length(1, 50, { message: 'Il cellulare deve essere compreso tra 1 e 50 caratteri.' })\n cellulare?: string | null;\n\n @ApiPropertyOptional({\n description: \"Pagina di default mostrata all'utente dopo il login (percorso o codice pagina).\",\n type: String,\n example: '/dashboard',\n maxLength: 50,\n nullable: true,\n })\n @IsOptional()\n @IsString({ message: 'La pagina di default deve essere una stringa.' })\n @Length(1, 50, { message: 'La pagina di default non puo superare 50 caratteri.' })\n paginaDefault?: string | null;\n\n @ApiPropertyOptional({ description: 'Flag superutente.', example: false })\n @IsOptional()\n @IsBoolean({ message: 'Il flag superutente deve essere booleano.' })\n flagSuper?: boolean;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'utente è configuratore\",\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: 'Il flag configuratore deve essere booleano.' })\n flagAdmin?: boolean;\n\n @ApiPropertyOptional({\n description: 'Abilita il login locale con password. Se false, l utente puo autenticarsi solo tramite identita SSO attive.',\n example: false,\n })\n @IsOptional()\n @IsBoolean({ message: 'Il flag login password deve essere booleano.' })\n passwordLoginEnabled?: boolean;\n\n @ApiPropertyOptional({\n description: 'Metadata JSON personalizzato.',\n example: '{\"theme\": \"dark\"}',\n })\n @IsOptional()\n @IsString({ message: 'I metadata JSON devono essere una stringa.' })\n jsonMetadata?: string;\n\n @ApiPropertyOptional({ description: \"Ruoli assegnati all'utente.\", example: [1, 2] })\n @IsOptional()\n @IsArray({ message: 'I ruoli devono essere un array.' })\n @ArrayUnique({ message: 'I ruoli non possono contenere duplicati.' })\n @Type(() => Number)\n @IsInt({ each: true, message: 'Ogni ruolo deve essere un intero.' })\n roles?: number[];\n\n @ApiPropertyOptional({\n description: \"Permessi assegnati all'utente.\",\n type: [Permission],\n example: [{ codiceMenu: 'MNUOFFICINA', tipoAbilitazione: TipoAbilitazione.SCRITTURA }],\n })\n @IsOptional()\n @IsArray({ message: 'I permessi devono essere un array.' })\n @ValidateNested({ each: true })\n @Type(() => Permission)\n permissions?: Permission[];\n}\n"]}
@@ -147,6 +147,7 @@ let UserService = class UserService {
147
147
  G.FLGPWDLESS as passwordless_login_enabled,
148
148
  G.CODLINGUA as codice_lingua,
149
149
  G.CELLULARE as cellulare,
150
+ G.PAGDEF as pagina_default,
150
151
  G.FLGSUPER as flag_super,
151
152
  G.FLGADMIN as flag_admin,
152
153
  COALESCE(G.FLGPASSWORD, 1) as password_login_enabled,
@@ -336,6 +337,7 @@ let UserService = class UserService {
336
337
  C.FLGPWDLESS AS passwordless_login_enabled,
337
338
  C.CODLINGUA AS codice_lingua,
338
339
  C.CELLULARE AS cellulare,
340
+ C.PAGDEF AS pagina_default,
339
341
  C.FLGSUPER AS flag_super,
340
342
  C.FLGADMIN AS flag_admin,
341
343
  COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled
@@ -417,6 +419,11 @@ let UserService = class UserService {
417
419
  dbField: 'AVATAR',
418
420
  transform: (v) => String(v),
419
421
  },
422
+ {
423
+ key: 'paginaDefault',
424
+ dbField: 'PAGDEF',
425
+ transform: (v) => String(v),
426
+ },
420
427
  {
421
428
  key: 'flagDueFattori',
422
429
  dbField: 'FLG2FATT',
@@ -551,6 +558,10 @@ let UserService = class UserService {
551
558
  utentiConfigUpdates.push('cellulare = ?');
552
559
  utentiConfigParams.push(user.cellulare);
553
560
  }
561
+ if (user.paginaDefault !== undefined) {
562
+ utentiConfigUpdates.push('PAGDEF = ?');
563
+ utentiConfigParams.push(user.paginaDefault);
564
+ }
554
565
  if (allowPrivilegedChanges && user.flagSuper !== undefined) {
555
566
  utentiConfigUpdates.push('flgsuper = ?');
556
567
  utentiConfigParams.push(user.flagSuper);
@@ -1 +1 @@
1
- {"version":3,"file":"UserService.js","sourceRoot":"","sources":["../../../../src/accessi-module/Services/UserService/UserService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, ConflictException, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { getTableColumns, optionalColumn } from '../../database-updates/optionalColumns';\nimport { autobind } from '../../../autobind';\nimport { Orm } from '../../../Orm';\nimport { RestUtilities } from '../../../Utilities';\nimport type { AccessiOptions } from '../../AccessiModule';\nimport { FILTRI_UTENTE_DB_MAPPING, FiltriUtente } from '../../Dtos/FiltriUtente';\nimport { GetUsersResult } from '../../Dtos/GetUsersResponse';\nimport { RegisterRequest } from '../../Dtos/RegisterRequest';\nimport { StatoRegistrazione } from '../../Dtos/StatoRegistrazione';\nimport { UserDto } from '../../Dtos/UserDto';\nimport { UserGrantsDto } from '../../Dtos/UserGrantsDto';\nimport { AccessiAuthenticatedUserSnapshot } from '../../security/authenticatedToken';\nimport { assertEmailConfigured } from '../../security/emailConfiguration';\nimport { EmailService } from '../EmailService/EmailService';\nimport { FiltriService } from '../FiltriService/FiltriService';\nimport { PermissionService } from '../PermissionService/PermissionService';\n\ninterface OptionalField<T> {\n key: string;\n dbField: string;\n transform?: (value: unknown) => T;\n}\n\n@autobind\n@Injectable()\nexport class UserService {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly emailService: EmailService,\n private readonly permissionService: PermissionService,\n private readonly filtriService: FiltriService,\n ) {}\n\n private normalizeDatabaseBoolean(value: unknown): boolean {\n return value === true || value === 1 || value === '1';\n }\n\n private normalizeUserFlags(user: UserDto): UserDto {\n const normalized: UserDto = { ...user,\n flagSuper: this.normalizeDatabaseBoolean(user.flagSuper),\n flagAdmin: this.normalizeDatabaseBoolean(user.flagAdmin),\n flagDueFattori: this.normalizeDatabaseBoolean(user.flagDueFattori),\n passwordlessLoginEnabled: this.normalizeDatabaseBoolean(user.passwordlessLoginEnabled),\n passwordLoginEnabled: user.passwordLoginEnabled == null || this.normalizeDatabaseBoolean(user.passwordLoginEnabled),\n };\n\n return normalized;\n }\n\n private normalizeEmail(email: string): string {\n if (typeof email !== 'string' || email.trim() === '') {\n throw new BadRequestException({ code: 'ACCESSI_EMAIL_REQUIRED', message: \"L'email è obbligatoria.\" });\n }\n\n return email.trim().toLowerCase();\n }\n\n private async ensureEmailIsAvailable(email: string, currentUserCode?: number): Promise<void> {\n const result = await Orm.query(\n this.accessiOptions.databaseOptions,\n 'SELECT FIRST 1 CODUTE as codice_utente FROM UTENTI WHERE LOWER(USRNAME) = ?',\n [email],\n );\n\n const existingUser = result.map(RestUtilities.convertKeysToCamelCase)[0] as\n | { codiceUtente?: number }\n | undefined;\n\n if (\n existingUser?.codiceUtente &&\n (!currentUserCode || existingUser.codiceUtente !== currentUserCode)\n ) {\n throw new ConflictException({ code: 'ACCESSI_EMAIL_ALREADY_EXISTS', message: \"L'email è già associata a un utente Accessi.\" });\n }\n }\n\n /**\n * Legge il minimo profilo autorevole usato da JWT e middleware. Restituisce `null` per utenti inesistenti.\n * Non usare `UserDto` dal token per decisioni di sicurezza: i flag vengono sempre riletti qui.\n */\n async getAuthenticatedUserSnapshot(\n codiceUtente: number,\n ): Promise<AccessiAuthenticatedUserSnapshot | null> {\n if (!codiceUtente || codiceUtente <= 0) {\n return null;\n }\n\n const result = await Orm.query(\n this.accessiOptions.databaseOptions,\n `\n SELECT\n U.CODUTE AS codice_utente,\n U.USRNAME AS email,\n U.STAREG AS stato_registrazione,\n C.FLGSUPER AS flag_super,\n C.FLGADMIN AS flag_admin\n , C.FLG2FATT AS flag_due_fattori\n , C.FLGPWDLESS AS passwordless_login_enabled\n , COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI U\n LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE\n WHERE U.CODUTE = ?\n `,\n [codiceUtente],\n );\n\n const user = result.map(RestUtilities.convertKeysToCamelCase)[0] as\n | {\n codiceUtente?: number;\n email?: string;\n statoRegistrazione?: StatoRegistrazione | number;\n flagSuper?: unknown;\n flagAdmin?: unknown;\n flagDueFattori?: unknown;\n passwordlessLoginEnabled?: unknown;\n passwordLoginEnabled?: unknown;\n }\n | undefined;\n\n if (!user?.codiceUtente) {\n return null;\n }\n\n return {\n codiceUtente: Number(user.codiceUtente),\n email: typeof user.email === 'string' ? user.email : undefined,\n statoRegistrazione: Number(user.statoRegistrazione) as StatoRegistrazione,\n flagSuper: this.normalizeDatabaseBoolean(user.flagSuper),\n flagAdmin: this.normalizeDatabaseBoolean(user.flagAdmin),\n flagDueFattori: this.normalizeDatabaseBoolean(user.flagDueFattori),\n passwordlessLoginEnabled: this.normalizeDatabaseBoolean(user.passwordlessLoginEnabled),\n passwordLoginEnabled: this.normalizeDatabaseBoolean(user.passwordLoginEnabled),\n };\n }\n\n /**\n * Elenca gli utenti con filtri opzionali. Grant e campi estesi sono costosi e vengono caricati soltanto\n * quando richiesti esplicitamente nelle opzioni; usare filtri puntuali nei flussi di autenticazione.\n */\n async getUsers(\n filters?: {\n email?: string;\n codiceUtente?: number | number[];\n numRep?: number | number[];\n codDipendente?: number;\n cellulare?: string;\n tipFil?: number;\n flagSuper?: boolean;\n limit?: number;\n offset?: number;\n },\n options?: { includeExtensionFields: boolean; includeGrants: boolean },\n ): Promise<GetUsersResult[]> {\n try {\n const filterColumns = await getTableColumns(this.accessiOptions, 'FILTRI');\n\n // Paginazione opzionale con limiti sani: il default resta \"tutti gli utenti\".\n const limit = Number.isInteger(filters?.limit) && (filters?.limit ?? 0) > 0\n ? Math.min(filters?.limit as number, 1000)\n : undefined;\n const offset = Number.isInteger(filters?.offset) && (filters?.offset ?? 0) > 0\n ? Math.trunc(filters?.offset as number)\n : 0;\n const pagination = `${limit !== undefined ? ` FIRST ${limit}` : ''}${offset > 0 ? ` SKIP ${offset}` : ''}`;\n\n let query = ` \n SELECT${pagination} \n U.CODUTE as codice_utente, \n U.USRNAME as email, \n U.FLGGDPR as flag_gdpr, \n U.DATGDPR as data_gdpr, \n U.DATINS as data_inserimento, \n U.DATSCAPWD as data_scadenza_password, \n U.DATLASTLOGIN as data_last_login, \n U.STAREG as stato_registrazione, \n G.COGNOME as cognome, \n G.NOME as nome, \n G.AVATAR as avatar, \n G.FLG2FATT as flag_due_fattori,\n G.FLGPWDLESS as passwordless_login_enabled,\n G.CODLINGUA as codice_lingua,\n G.CELLULARE as cellulare,\n G.FLGSUPER as flag_super, \n G.FLGADMIN as flag_admin,\n COALESCE(G.FLGPASSWORD, 1) as password_login_enabled,\n G.JSON_METADATA as json_metadata,\n ${optionalColumn(filterColumns, 'CODDIP', 'F', 'cod_dipendente')},\n ${optionalColumn(filterColumns, 'NUMREP', 'F', 'num_rep', true)},\n ${optionalColumn(filterColumns, 'IDXPERS', 'F', 'idx_pers', true)},\n ${optionalColumn(filterColumns, 'CODCLISUPER', 'F', 'cod_cli_super', true)},\n ${optionalColumn(filterColumns, 'CODAGE', 'F', 'cod_age', true)},\n ${optionalColumn(filterColumns, 'CODCLICOL', 'F', 'cod_cli_col', true)},\n ${optionalColumn(filterColumns, 'CODCLIENTI', 'F', 'cod_clienti', false)},\n F.TIPFIL AS tip_fil,\n ${optionalColumn(filterColumns, 'IDXPOS', 'F', 'idx_postazione', true)}\n FROM UTENTI U \n INNER JOIN UTENTI_CONFIG G ON U.CODUTE = G.CODUTE\n LEFT JOIN FILTRI F ON F.CODUTE = U.CODUTE\n WHERE 1=1\n `;\n\n const queryParams: unknown[] = [];\n\n if (filters?.email) {\n query += ` AND LOWER(U.USRNAME) = ? `;\n queryParams.push(filters.email.trim().toLowerCase());\n }\n\n if (filters?.codiceUtente !== undefined) {\n const codes = (Array.isArray(filters.codiceUtente) ? filters.codiceUtente : [filters.codiceUtente])\n .map((value) => Number(value))\n .filter((value) => Number.isFinite(value) && value > 0);\n if (codes.length === 0) {\n return [];\n }\n query += ` AND U.CODUTE IN (${codes.map(() => '?').join(', ')}) `;\n queryParams.push(...codes);\n }\n\n if (filters?.numRep !== undefined) {\n const reparti = (Array.isArray(filters.numRep) ? filters.numRep : [filters.numRep])\n .map((value) => Number(value))\n .filter((value) => Number.isFinite(value));\n if (reparti.length === 0) {\n return [];\n }\n query += ` AND F.NUMREP IN (${reparti.map(() => '?').join(', ')}) `;\n queryParams.push(...reparti);\n }\n\n if (filters?.codDipendente !== undefined) {\n query += ` AND F.CODDIP = ? `;\n queryParams.push(Number(filters.codDipendente));\n }\n\n if (filters?.tipFil !== undefined) {\n query += ` AND F.TIPFIL = ? `;\n queryParams.push(Number(filters.tipFil));\n }\n\n if (filters?.cellulare) {\n query += ` AND TRIM(G.CELLULARE) = ? `;\n queryParams.push(String(filters.cellulare).trim());\n }\n\n if (filters?.flagSuper !== undefined) {\n query += filters.flagSuper ? ` AND COALESCE(G.FLGSUPER, 0) <> 0 ` : ` AND COALESCE(G.FLGSUPER, 0) = 0 `;\n }\n\n query += ` ORDER BY U.CODUTE DESC `;\n\n let users = (await Orm.query(\n this.accessiOptions.databaseOptions,\n query,\n queryParams,\n )) as UserDto[];\n users = users.map(RestUtilities.convertKeysToCamelCase).map(user => this.normalizeUserFlags(user as unknown as UserDto));\n\n const usersResponse: GetUsersResult[] = [];\n\n // I campi estensione sono caricati una volta per tabella (non una per utente) in query IN\n // suddivise in blocchi per non superare i limiti di parametri del driver.\n const extensionFieldsByUser = options?.includeExtensionFields\n ? await this.loadExtensionFieldsForUsers(users.map((user) => user.codiceUtente))\n : undefined;\n\n // I grant sono caricati in batch (query IN) invece che utente per utente.\n const grantsByUser = options?.includeGrants\n ? await this.permissionService.getUsersRolesAndGrants(users.map((user) => user.codiceUtente))\n : undefined;\n\n for (const user of users) {\n let userGrants: UserGrantsDto | undefined;\n\n if (options?.includeGrants) {\n userGrants = grantsByUser?.get(user.codiceUtente);\n }\n\n let extensionFields: Record<string, unknown[]> | undefined;\n\n if (options?.includeExtensionFields) {\n extensionFields = {};\n for (const ext of this.accessiOptions.extensionFieldsOptions ?? []) {\n extensionFields[ext.objectKey] = extensionFieldsByUser?.get(ext.objectKey)?.get(user.codiceUtente) ?? [];\n }\n }\n\n usersResponse.push({\n utente: user,\n userGrants,\n extensionFields,\n });\n }\n\n return usersResponse;\n } catch (error) {\n throw error;\n }\n }\n\n /** Conteggio utenti con gli stessi filtri di `getUsers`, per la paginazione (header X-Total-Count). */\n async countUsers(filters?: { email?: string; codiceUtente?: number }): Promise<number> {\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (filters?.email) {\n conditions.push('LOWER(U.USRNAME) = ?');\n params.push(filters.email.trim().toLowerCase());\n }\n if (filters?.codiceUtente) {\n conditions.push('U.CODUTE = ?');\n params.push(filters.codiceUtente);\n }\n\n const query = `SELECT COUNT(*) AS TOTAL FROM UTENTI U INNER JOIN UTENTI_CONFIG G ON U.CODUTE = G.CODUTE WHERE 1=1 ${conditions.map((condition) => `AND ${condition}`).join(' ')}`;\n const rows = (await Orm.query(this.accessiOptions.databaseOptions, query, params, false)) as Array<Record<string, unknown>>;\n const row = rows[0];\n return Number(row?.TOTAL ?? row?.total ?? 0) || 0;\n }\n\n private async loadExtensionFieldsForUsers(\n codiceUtenti: number[],\n ): Promise<Map<string, Map<number, Record<string, unknown>[]>>> {\n const byObjectKey = new Map<string, Map<number, Record<string, unknown>[]>>();\n const extensions = this.accessiOptions.extensionFieldsOptions ?? [];\n const uniqueCodes = Array.from(new Set(codiceUtenti));\n\n for (const ext of extensions) {\n const grouped = new Map<number, Record<string, unknown>[]>();\n\n for (const chunk of this.chunkArray(uniqueCodes, 500)) {\n if (chunk.length === 0) {\n continue;\n }\n\n const placeholders = chunk.map(() => '?').join(', ');\n const rows = (await Orm.query(\n ext.databaseOptions,\n `SELECT ${ext.tableJoinFieldName} AS __joinkey, ${ext.tableFields.join(', ')} FROM ${ext.tableName} WHERE ${ext.tableJoinFieldName} IN (${placeholders})`,\n chunk,\n )).map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n\n for (const row of rows) {\n const { __joinkey, ...rest } = row;\n const key = Number(__joinkey);\n if (!Number.isFinite(key)) {\n continue;\n }\n\n const bucket = grouped.get(key);\n if (bucket) {\n bucket.push(rest);\n } else {\n grouped.set(key, [rest]);\n }\n }\n }\n\n byObjectKey.set(ext.objectKey, grouped);\n }\n\n return byObjectKey;\n }\n\n private chunkArray<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n return chunks;\n }\n\n /** Cerca il codice interno per email normalizzata. Il chiamante deve gestire il caso senza righe. */\n async getCodiceUtenteByEmail(email: string): Promise<{ codiceUtente: number }> {\n try {\n const query = `SELECT CODUTE as codice_utente FROM UTENTI WHERE LOWER(USRNAME) = ?`;\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, [\n email.trim().toLowerCase(),\n ]);\n return result.map(RestUtilities.convertKeysToCamelCase)[0] as { codiceUtente: number };\n } catch (error) {\n throw error;\n }\n }\n\n /** Recupera il profilo locale usato dal login, compresi filtri Accessi eventualmente presenti. */\n async getUserByEmail(email: string): Promise<UserDto | null> {\n const query = `\n SELECT \n U.CODUTE AS codice_utente, \n U.USRNAME AS email, \n U.FLGGDPR AS flag_gdpr,\n U.DATSCAPWD as data_scadenza_password,\n U.STAREG AS stato_registrazione, \n C.COGNOME AS cognome, \n C.NOME AS nome, \n C.AVATAR AS avatar, \n C.FLG2FATT AS flag_due_fattori,\n C.FLGPWDLESS AS passwordless_login_enabled,\n C.CODLINGUA AS codice_lingua, \n C.CELLULARE AS cellulare, \n C.FLGSUPER AS flag_super,\n C.FLGADMIN AS flag_admin,\n COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI U\n INNER JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE\n WHERE LOWER(U.USRNAME) = ?\n `;\n\n const utenti = (await Orm.query(this.accessiOptions.databaseOptions, query, [email]).then(\n (results) => results.map(RestUtilities.convertKeysToCamelCase),\n )) as UserDto[];\n\n const user = utenti[0];\n if (!user) return null;\n\n const filtro = (await this.filtriService.getFiltriUser(user.codiceUtente))[0];\n if (filtro) {\n const filterValues: Record<string, unknown> = {};\n\n Object.entries(FILTRI_UTENTE_DB_MAPPING).forEach(([key]) => {\n if (key in filtro) {\n filterValues[key] = filtro[key as keyof FiltriUtente];\n }\n });\n\n Object.assign(user, filterValues);\n }\n\n return this.normalizeUserFlags(user);\n }\n\n async insertUserFilters(codiceUtente: number, filterData: RegisterRequest): Promise<void> {\n await this.filtriService.upsertFiltriUtente(codiceUtente, filterData);\n }\n\n /**\n * Crea utente, configurazione e filtri. La registrazione pubblica resta in stato `INVIO` e non puo\n * impostare privilegi, ruoli o grant; soltanto flussi backend fidati possono usare `allowPrivilegedFields`.\n */\n async register(\n registrationData: RegisterRequest,\n options?: { allowPrivilegedFields?: boolean; initialState?: StatoRegistrazione },\n ): Promise<number> {\n try {\n const allowPrivilegedFields = options?.allowPrivilegedFields === true;\n const normalizedEmail = this.normalizeEmail(registrationData.email);\n\n if (registrationData.flagDueFattori !== undefined && typeof registrationData.flagDueFattori !== 'boolean') {\n throw new BadRequestException('Il flag due fattori deve essere booleano.');\n }\n if (registrationData.flagDueFattori && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalizedEmail)) {\n throw new BadRequestException('Per attivare i codici di accesso serve un indirizzo email valido.');\n }\n\n if (\n !allowPrivilegedFields &&\n (registrationData.flagSuper !== undefined ||\n registrationData.flagAdmin !== undefined ||\n registrationData.flagDueFattori !== undefined ||\n registrationData.roles !== undefined ||\n registrationData.permissions !== undefined)\n ) {\n throw new Error('I campi privilegiati non sono consentiti nella registrazione pubblica.');\n }\n\n await this.ensureEmailIsAvailable(normalizedEmail);\n\n const queryUtenti = `INSERT INTO UTENTI (USRNAME, STAREG) VALUES (?,?) RETURNING CODUTE`;\n // Public/local registrations keep the historic INVIO state; trusted master or SSO flows may opt into CONF.\n const paramsUtenti = [normalizedEmail, options?.initialState ?? StatoRegistrazione.INVIO];\n\n // Utente e configurazione sono creati in un'unica transazione; filtri e assegnazioni restano\n // fuori perché delegati a servizi dedicati.\n const codiceUtente = await Orm.withTransaction(\n this.accessiOptions.databaseOptions,\n async (transaction) => {\n const insertedUsers = await Orm.transactionQuery<unknown>(\n transaction,\n queryUtenti,\n paramsUtenti,\n );\n\n const insertedUser = (Array.isArray(insertedUsers) ? insertedUsers[0] : insertedUsers) as Record<string, unknown> | undefined;\n const newCodiceUtente = Number(\n insertedUser?.CODUTE ?? insertedUser?.codute,\n );\n if (!newCodiceUtente) {\n throw new Error('Creazione utente non riuscita: impossibile recuperare CODUTE.');\n }\n\n const utentiConfigFields = ['CODUTE', 'COGNOME', 'NOME'];\n const utentiConfigPlaceholders = ['?', '?', '?'];\n const utentiConfigParams: unknown[] = [newCodiceUtente, registrationData.cognome, registrationData.nome];\n\n const optionalFields: OptionalField<unknown>[] = [\n {\n key: 'cellulare',\n dbField: 'CELLULARE',\n transform: (v) => String(v),\n },\n {\n key: 'avatar',\n dbField: 'AVATAR',\n transform: (v) => String(v),\n },\n {\n key: 'flagDueFattori',\n dbField: 'FLG2FATT',\n transform: (v) => (v ? 1 : 0),\n },\n ];\n\n if (allowPrivilegedFields) {\n optionalFields.push(\n {\n key: 'flagSuper',\n dbField: 'FLGSUPER',\n transform: (v) => (v ? 1 : 0),\n },\n {\n key: 'flagAdmin',\n dbField: 'FLGADMIN',\n transform: (v) => (v ? 1 : 0),\n },\n );\n }\n\n for (const field of optionalFields) {\n const value = (registrationData as unknown as Record<string, unknown>)[field.key];\n if (value !== undefined && value !== null) {\n utentiConfigFields.push(field.dbField);\n utentiConfigPlaceholders.push('?');\n utentiConfigParams.push(field.transform ? field.transform(value) : value);\n }\n }\n\n const queryUtentiConfig = `INSERT INTO UTENTI_CONFIG (${utentiConfigFields.join(\n ', ',\n )}) VALUES (${utentiConfigPlaceholders.join(', ')})`;\n await Orm.transactionQuery(transaction, queryUtentiConfig, utentiConfigParams);\n\n return newCodiceUtente;\n },\n );\n\n await this.filtriService.upsertFiltriUtente(codiceUtente, registrationData);\n\n if (allowPrivilegedFields && !!registrationData.roles && registrationData.roles.length > 0) {\n await this.permissionService.assignRolesToUser(codiceUtente, registrationData.roles);\n }\n\n if (\n allowPrivilegedFields &&\n !!registrationData.permissions &&\n registrationData.permissions.length > 0\n ) {\n await this.permissionService.assignPermissionsToUser(\n codiceUtente,\n registrationData.permissions,\n );\n }\n\n return codiceUtente;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Aggiorna il profilo utente e i filtri. Le modifiche a stato, ruoli, grant e flag amministrativi richiedono\n * `allowPrivilegedChanges`; gli array ruolo/grant passati in un flusso fidato sostituiscono le assegnazioni.\n */\n async updateUser(\n codiceUtente: number,\n user: UserDto,\n options?: { allowPrivilegedChanges?: boolean },\n ): Promise<void> {\n try {\n if (!codiceUtente) throw new Error('Impossibile aggiornare senza codice utente.');\n const allowPrivilegedChanges = options?.allowPrivilegedChanges === true;\n\n for (const value of [user.flagDueFattori, user.passwordlessLoginEnabled]) {\n if (value !== undefined && typeof value !== 'boolean') throw new BadRequestException('Le policy di autenticazione devono essere booleane.');\n }\n\n if (\n !allowPrivilegedChanges &&\n (user.statoRegistrazione !== undefined ||\n user.flagSuper !== undefined ||\n user.flagAdmin !== undefined ||\n user.passwordLoginEnabled !== undefined ||\n user.passwordlessLoginEnabled !== undefined ||\n user.flagDueFattori !== undefined ||\n user.roles !== undefined ||\n user.permissions !== undefined)\n ) {\n throw new Error('Non e consentito modificare campi privilegiati.');\n }\n\n if (user.flagDueFattori !== undefined || user.passwordlessLoginEnabled !== undefined || user.email !== undefined) {\n const current = await this.getAuthenticatedUserSnapshot(codiceUtente);\n if (!current) throw new BadRequestException('Utente non trovato.');\n const twoFactor = user.flagDueFattori ?? current.flagDueFattori;\n const passwordless = user.passwordlessLoginEnabled ?? current.passwordlessLoginEnabled;\n if (passwordless && !twoFactor) throw new BadRequestException('Il login senza password richiede il codice di accesso attivo.');\n if (twoFactor && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((user.email ?? current.email ?? '').trim())) {\n throw new BadRequestException('Per attivare i codici di accesso serve un indirizzo email valido.');\n }\n }\n\n const utentiUpdates = [];\n const utentiParams = [];\n\n if (user.email !== undefined) {\n const normalizedEmail = this.normalizeEmail(user.email);\n await this.ensureEmailIsAvailable(normalizedEmail, codiceUtente);\n utentiUpdates.push('usrname = ?');\n utentiParams.push(normalizedEmail);\n }\n if (user.flagGdpr !== undefined) {\n utentiUpdates.push('flggdpr = ?');\n utentiParams.push(user.flagGdpr);\n }\n if (allowPrivilegedChanges && user.statoRegistrazione !== undefined) {\n utentiUpdates.push('stareg = ?');\n utentiParams.push(user.statoRegistrazione);\n }\n\n if (utentiUpdates.length > 0) {\n const queryUtenti = `UPDATE UTENTI SET ${utentiUpdates.join(', ')} WHERE CODUTE = ?`;\n utentiParams.push(codiceUtente);\n await Orm.execute(this.accessiOptions.databaseOptions, queryUtenti, utentiParams);\n }\n\n const utentiConfigUpdates = [];\n const utentiConfigParams = [];\n\n if (user.cognome !== undefined) {\n utentiConfigUpdates.push('cognome = ?');\n utentiConfigParams.push(user.cognome);\n }\n if (user.nome !== undefined) {\n utentiConfigUpdates.push('nome = ?');\n utentiConfigParams.push(user.nome);\n }\n if (user.avatar !== undefined) {\n utentiConfigUpdates.push('avatar = ?');\n utentiConfigParams.push(user.avatar);\n }\n if (user.flagDueFattori !== undefined) {\n utentiConfigUpdates.push('flg2fatt = ?');\n utentiConfigParams.push(user.flagDueFattori ? 1 : 0);\n }\n if (user.passwordlessLoginEnabled !== undefined) {\n utentiConfigUpdates.push('flgpwdless = ?');\n utentiConfigParams.push(user.passwordlessLoginEnabled ? 1 : 0);\n }\n if (user.codiceLingua !== undefined) {\n utentiConfigUpdates.push('codlingua = ?');\n utentiConfigParams.push(user.codiceLingua);\n }\n if (user.cellulare !== undefined) {\n utentiConfigUpdates.push('cellulare = ?');\n utentiConfigParams.push(user.cellulare);\n }\n if (allowPrivilegedChanges && user.flagSuper !== undefined) {\n utentiConfigUpdates.push('flgsuper = ?');\n utentiConfigParams.push(user.flagSuper);\n }\n if (allowPrivilegedChanges && user.flagAdmin !== undefined) {\n utentiConfigUpdates.push('FLGADMIN = ?');\n utentiConfigParams.push(user.flagAdmin);\n }\n if (allowPrivilegedChanges && user.passwordLoginEnabled !== undefined) {\n utentiConfigUpdates.push('flgpassword = ?');\n utentiConfigParams.push(user.passwordLoginEnabled ? 1 : 0);\n }\n if (user.jsonMetadata !== undefined) {\n utentiConfigUpdates.push('json_metadata = ?');\n utentiConfigParams.push(user.jsonMetadata);\n }\n\n if (utentiConfigUpdates.length > 0) {\n const queryUtentiConfig = `UPDATE UTENTI_CONFIG SET ${utentiConfigUpdates.join(\n ', ',\n )} WHERE CODUTE = ?`;\n utentiConfigParams.push(codiceUtente);\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n queryUtentiConfig,\n utentiConfigParams,\n );\n }\n\n if (allowPrivilegedChanges && Array.isArray(user.roles)) {\n await this.permissionService.assignRolesToUser(codiceUtente, user.roles);\n }\n\n if (allowPrivilegedChanges && Array.isArray(user.permissions)) {\n await this.permissionService.assignPermissionsToUser(codiceUtente, user.permissions);\n }\n\n await this.filtriService.upsertFiltriUtente(codiceUtente, user);\n } catch (error) {\n throw error;\n }\n }\n\n async updateUserFilters(codiceUtente: number, user: UserDto): Promise<void> {\n await this.filtriService.upsertFiltriUtente(codiceUtente, user);\n }\n\n /** Eliminazione logica: imposta lo stato `DELETE` senza cancellare lo storico o i collegamenti SSO. */\n async deleteUser(codiceCliente: number): Promise<void> {\n try {\n const query = `UPDATE UTENTI SET STAREG = ? WHERE CODUTE = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, query, [\n StatoRegistrazione.DELETE,\n codiceCliente,\n ]);\n } catch (error) {\n throw error;\n }\n }\n\n /** Cambia esplicitamente lo stato di registrazione; usare questa API per blocco, conferma o eliminazione logica. */\n async setStato(codiceCliente: number, statoRegistrazione: StatoRegistrazione) {\n try {\n const query = `UPDATE UTENTI SET STAREG = ? WHERE CODUTE = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, query, [\n statoRegistrazione,\n codiceCliente,\n ]);\n } catch (error) {\n throw error;\n }\n }\n\n public async setGdpr(codiceUtente: number) {\n try {\n return await Orm.executeMultiple(this.accessiOptions.databaseOptions, [\n { query: 'INSERT INTO UTENTI_GDPR (CODUTE, GDPR) VALUES (?, ?)', params: [codiceUtente, 'true'] },\n { query: 'UPDATE UTENTI SET FLGGDPR = 1, DATGDPR = CURRENT_DATE WHERE CODUTE = ?', params: [codiceUtente] },\n ]);\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Forza l'invio dell'email di reset password per un utente. Operazione amministrativa.\n * Richiede un servizio email configurato: altrimenti solleva ACCESSI_EMAIL_NOT_CONFIGURED.\n */\n public async forcePasswordReset(codiceUtente: number): Promise<void> {\n assertEmailConfigured(this.accessiOptions);\n const rows = await this.getUsers({ codiceUtente });\n const email = rows[0]?.utente?.email;\n if (typeof email !== 'string' || email.trim() === '') {\n throw new NotFoundException(`Nessun utente con email per il codice ${codiceUtente}.`);\n }\n await this.emailService.sendPasswordResetEmail(email);\n }\n\n /**\n * Forza l'invio dell'email di reset a tutti gli utenti la cui password non e ancora nel formato\n * moderno (`scrypt$...`), cioe' legacy grezza o `scrypt-legacy` non piu verificabile. Utile quando\n * la `encryptionKey` storica e perduta. Richiede email configurata. Ritorna quanti utenti hanno\n * ricevuto l'email.\n */\n public async forcePasswordResetForLegacyPasswords(): Promise<number> {\n assertEmailConfigured(this.accessiOptions);\n const rows = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT U.CODUTE AS codice_utente, U.USRNAME AS email\n FROM UTENTI U\n JOIN UTENTI_PWD P ON P.CODUTE = U.CODUTE\n WHERE P.PWD IS NOT NULL AND P.PWD NOT STARTING WITH 'scrypt$'`,\n [],\n false,\n );\n\n let sent = 0;\n for (const row of rows as Array<Record<string, unknown>>) {\n const raw = RestUtilities.convertKeysToCamelCase(row) as Record<string, unknown>;\n const email = typeof raw.email === 'string' ? raw.email.trim() : '';\n if (email === '') continue;\n await this.emailService.sendPasswordResetEmail(email);\n sent += 1;\n }\n return sent;\n }\n}\n"]}
1
+ {"version":3,"file":"UserService.js","sourceRoot":"","sources":["../../../../src/accessi-module/Services/UserService/UserService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, ConflictException, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { getTableColumns, optionalColumn } from '../../database-updates/optionalColumns';\nimport { autobind } from '../../../autobind';\nimport { Orm } from '../../../Orm';\nimport { RestUtilities } from '../../../Utilities';\nimport type { AccessiOptions } from '../../AccessiModule';\nimport { FILTRI_UTENTE_DB_MAPPING, FiltriUtente } from '../../Dtos/FiltriUtente';\nimport { GetUsersResult } from '../../Dtos/GetUsersResponse';\nimport { RegisterRequest } from '../../Dtos/RegisterRequest';\nimport { StatoRegistrazione } from '../../Dtos/StatoRegistrazione';\nimport { UserDto } from '../../Dtos/UserDto';\nimport { UserGrantsDto } from '../../Dtos/UserGrantsDto';\nimport { AccessiAuthenticatedUserSnapshot } from '../../security/authenticatedToken';\nimport { assertEmailConfigured } from '../../security/emailConfiguration';\nimport { EmailService } from '../EmailService/EmailService';\nimport { FiltriService } from '../FiltriService/FiltriService';\nimport { PermissionService } from '../PermissionService/PermissionService';\n\ninterface OptionalField<T> {\n key: string;\n dbField: string;\n transform?: (value: unknown) => T;\n}\n\n@autobind\n@Injectable()\nexport class UserService {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly emailService: EmailService,\n private readonly permissionService: PermissionService,\n private readonly filtriService: FiltriService,\n ) {}\n\n private normalizeDatabaseBoolean(value: unknown): boolean {\n return value === true || value === 1 || value === '1';\n }\n\n private normalizeUserFlags(user: UserDto): UserDto {\n const normalized: UserDto = { ...user,\n flagSuper: this.normalizeDatabaseBoolean(user.flagSuper),\n flagAdmin: this.normalizeDatabaseBoolean(user.flagAdmin),\n flagDueFattori: this.normalizeDatabaseBoolean(user.flagDueFattori),\n passwordlessLoginEnabled: this.normalizeDatabaseBoolean(user.passwordlessLoginEnabled),\n passwordLoginEnabled: user.passwordLoginEnabled == null || this.normalizeDatabaseBoolean(user.passwordLoginEnabled),\n };\n\n return normalized;\n }\n\n private normalizeEmail(email: string): string {\n if (typeof email !== 'string' || email.trim() === '') {\n throw new BadRequestException({ code: 'ACCESSI_EMAIL_REQUIRED', message: \"L'email è obbligatoria.\" });\n }\n\n return email.trim().toLowerCase();\n }\n\n private async ensureEmailIsAvailable(email: string, currentUserCode?: number): Promise<void> {\n const result = await Orm.query(\n this.accessiOptions.databaseOptions,\n 'SELECT FIRST 1 CODUTE as codice_utente FROM UTENTI WHERE LOWER(USRNAME) = ?',\n [email],\n );\n\n const existingUser = result.map(RestUtilities.convertKeysToCamelCase)[0] as\n | { codiceUtente?: number }\n | undefined;\n\n if (\n existingUser?.codiceUtente &&\n (!currentUserCode || existingUser.codiceUtente !== currentUserCode)\n ) {\n throw new ConflictException({ code: 'ACCESSI_EMAIL_ALREADY_EXISTS', message: \"L'email è già associata a un utente Accessi.\" });\n }\n }\n\n /**\n * Legge il minimo profilo autorevole usato da JWT e middleware. Restituisce `null` per utenti inesistenti.\n * Non usare `UserDto` dal token per decisioni di sicurezza: i flag vengono sempre riletti qui.\n */\n async getAuthenticatedUserSnapshot(\n codiceUtente: number,\n ): Promise<AccessiAuthenticatedUserSnapshot | null> {\n if (!codiceUtente || codiceUtente <= 0) {\n return null;\n }\n\n const result = await Orm.query(\n this.accessiOptions.databaseOptions,\n `\n SELECT\n U.CODUTE AS codice_utente,\n U.USRNAME AS email,\n U.STAREG AS stato_registrazione,\n C.FLGSUPER AS flag_super,\n C.FLGADMIN AS flag_admin\n , C.FLG2FATT AS flag_due_fattori\n , C.FLGPWDLESS AS passwordless_login_enabled\n , COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI U\n LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE\n WHERE U.CODUTE = ?\n `,\n [codiceUtente],\n );\n\n const user = result.map(RestUtilities.convertKeysToCamelCase)[0] as\n | {\n codiceUtente?: number;\n email?: string;\n statoRegistrazione?: StatoRegistrazione | number;\n flagSuper?: unknown;\n flagAdmin?: unknown;\n flagDueFattori?: unknown;\n passwordlessLoginEnabled?: unknown;\n passwordLoginEnabled?: unknown;\n }\n | undefined;\n\n if (!user?.codiceUtente) {\n return null;\n }\n\n return {\n codiceUtente: Number(user.codiceUtente),\n email: typeof user.email === 'string' ? user.email : undefined,\n statoRegistrazione: Number(user.statoRegistrazione) as StatoRegistrazione,\n flagSuper: this.normalizeDatabaseBoolean(user.flagSuper),\n flagAdmin: this.normalizeDatabaseBoolean(user.flagAdmin),\n flagDueFattori: this.normalizeDatabaseBoolean(user.flagDueFattori),\n passwordlessLoginEnabled: this.normalizeDatabaseBoolean(user.passwordlessLoginEnabled),\n passwordLoginEnabled: this.normalizeDatabaseBoolean(user.passwordLoginEnabled),\n };\n }\n\n /**\n * Elenca gli utenti con filtri opzionali. Grant e campi estesi sono costosi e vengono caricati soltanto\n * quando richiesti esplicitamente nelle opzioni; usare filtri puntuali nei flussi di autenticazione.\n */\n async getUsers(\n filters?: {\n email?: string;\n codiceUtente?: number | number[];\n numRep?: number | number[];\n codDipendente?: number;\n cellulare?: string;\n tipFil?: number;\n flagSuper?: boolean;\n limit?: number;\n offset?: number;\n },\n options?: { includeExtensionFields: boolean; includeGrants: boolean },\n ): Promise<GetUsersResult[]> {\n try {\n const filterColumns = await getTableColumns(this.accessiOptions, 'FILTRI');\n\n // Paginazione opzionale con limiti sani: il default resta \"tutti gli utenti\".\n const limit = Number.isInteger(filters?.limit) && (filters?.limit ?? 0) > 0\n ? Math.min(filters?.limit as number, 1000)\n : undefined;\n const offset = Number.isInteger(filters?.offset) && (filters?.offset ?? 0) > 0\n ? Math.trunc(filters?.offset as number)\n : 0;\n const pagination = `${limit !== undefined ? ` FIRST ${limit}` : ''}${offset > 0 ? ` SKIP ${offset}` : ''}`;\n\n let query = ` \n SELECT${pagination} \n U.CODUTE as codice_utente, \n U.USRNAME as email, \n U.FLGGDPR as flag_gdpr, \n U.DATGDPR as data_gdpr, \n U.DATINS as data_inserimento, \n U.DATSCAPWD as data_scadenza_password, \n U.DATLASTLOGIN as data_last_login, \n U.STAREG as stato_registrazione, \n G.COGNOME as cognome, \n G.NOME as nome, \n G.AVATAR as avatar, \n G.FLG2FATT as flag_due_fattori,\n G.FLGPWDLESS as passwordless_login_enabled,\n G.CODLINGUA as codice_lingua,\n G.CELLULARE as cellulare,\n G.PAGDEF as pagina_default,\n G.FLGSUPER as flag_super, \n G.FLGADMIN as flag_admin,\n COALESCE(G.FLGPASSWORD, 1) as password_login_enabled,\n G.JSON_METADATA as json_metadata,\n ${optionalColumn(filterColumns, 'CODDIP', 'F', 'cod_dipendente')},\n ${optionalColumn(filterColumns, 'NUMREP', 'F', 'num_rep', true)},\n ${optionalColumn(filterColumns, 'IDXPERS', 'F', 'idx_pers', true)},\n ${optionalColumn(filterColumns, 'CODCLISUPER', 'F', 'cod_cli_super', true)},\n ${optionalColumn(filterColumns, 'CODAGE', 'F', 'cod_age', true)},\n ${optionalColumn(filterColumns, 'CODCLICOL', 'F', 'cod_cli_col', true)},\n ${optionalColumn(filterColumns, 'CODCLIENTI', 'F', 'cod_clienti', false)},\n F.TIPFIL AS tip_fil,\n ${optionalColumn(filterColumns, 'IDXPOS', 'F', 'idx_postazione', true)}\n FROM UTENTI U \n INNER JOIN UTENTI_CONFIG G ON U.CODUTE = G.CODUTE\n LEFT JOIN FILTRI F ON F.CODUTE = U.CODUTE\n WHERE 1=1\n `;\n\n const queryParams: unknown[] = [];\n\n if (filters?.email) {\n query += ` AND LOWER(U.USRNAME) = ? `;\n queryParams.push(filters.email.trim().toLowerCase());\n }\n\n if (filters?.codiceUtente !== undefined) {\n const codes = (Array.isArray(filters.codiceUtente) ? filters.codiceUtente : [filters.codiceUtente])\n .map((value) => Number(value))\n .filter((value) => Number.isFinite(value) && value > 0);\n if (codes.length === 0) {\n return [];\n }\n query += ` AND U.CODUTE IN (${codes.map(() => '?').join(', ')}) `;\n queryParams.push(...codes);\n }\n\n if (filters?.numRep !== undefined) {\n const reparti = (Array.isArray(filters.numRep) ? filters.numRep : [filters.numRep])\n .map((value) => Number(value))\n .filter((value) => Number.isFinite(value));\n if (reparti.length === 0) {\n return [];\n }\n query += ` AND F.NUMREP IN (${reparti.map(() => '?').join(', ')}) `;\n queryParams.push(...reparti);\n }\n\n if (filters?.codDipendente !== undefined) {\n query += ` AND F.CODDIP = ? `;\n queryParams.push(Number(filters.codDipendente));\n }\n\n if (filters?.tipFil !== undefined) {\n query += ` AND F.TIPFIL = ? `;\n queryParams.push(Number(filters.tipFil));\n }\n\n if (filters?.cellulare) {\n query += ` AND TRIM(G.CELLULARE) = ? `;\n queryParams.push(String(filters.cellulare).trim());\n }\n\n if (filters?.flagSuper !== undefined) {\n query += filters.flagSuper ? ` AND COALESCE(G.FLGSUPER, 0) <> 0 ` : ` AND COALESCE(G.FLGSUPER, 0) = 0 `;\n }\n\n query += ` ORDER BY U.CODUTE DESC `;\n\n let users = (await Orm.query(\n this.accessiOptions.databaseOptions,\n query,\n queryParams,\n )) as UserDto[];\n users = users.map(RestUtilities.convertKeysToCamelCase).map(user => this.normalizeUserFlags(user as unknown as UserDto));\n\n const usersResponse: GetUsersResult[] = [];\n\n // I campi estensione sono caricati una volta per tabella (non una per utente) in query IN\n // suddivise in blocchi per non superare i limiti di parametri del driver.\n const extensionFieldsByUser = options?.includeExtensionFields\n ? await this.loadExtensionFieldsForUsers(users.map((user) => user.codiceUtente))\n : undefined;\n\n // I grant sono caricati in batch (query IN) invece che utente per utente.\n const grantsByUser = options?.includeGrants\n ? await this.permissionService.getUsersRolesAndGrants(users.map((user) => user.codiceUtente))\n : undefined;\n\n for (const user of users) {\n let userGrants: UserGrantsDto | undefined;\n\n if (options?.includeGrants) {\n userGrants = grantsByUser?.get(user.codiceUtente);\n }\n\n let extensionFields: Record<string, unknown[]> | undefined;\n\n if (options?.includeExtensionFields) {\n extensionFields = {};\n for (const ext of this.accessiOptions.extensionFieldsOptions ?? []) {\n extensionFields[ext.objectKey] = extensionFieldsByUser?.get(ext.objectKey)?.get(user.codiceUtente) ?? [];\n }\n }\n\n usersResponse.push({\n utente: user,\n userGrants,\n extensionFields,\n });\n }\n\n return usersResponse;\n } catch (error) {\n throw error;\n }\n }\n\n /** Conteggio utenti con gli stessi filtri di `getUsers`, per la paginazione (header X-Total-Count). */\n async countUsers(filters?: { email?: string; codiceUtente?: number }): Promise<number> {\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (filters?.email) {\n conditions.push('LOWER(U.USRNAME) = ?');\n params.push(filters.email.trim().toLowerCase());\n }\n if (filters?.codiceUtente) {\n conditions.push('U.CODUTE = ?');\n params.push(filters.codiceUtente);\n }\n\n const query = `SELECT COUNT(*) AS TOTAL FROM UTENTI U INNER JOIN UTENTI_CONFIG G ON U.CODUTE = G.CODUTE WHERE 1=1 ${conditions.map((condition) => `AND ${condition}`).join(' ')}`;\n const rows = (await Orm.query(this.accessiOptions.databaseOptions, query, params, false)) as Array<Record<string, unknown>>;\n const row = rows[0];\n return Number(row?.TOTAL ?? row?.total ?? 0) || 0;\n }\n\n private async loadExtensionFieldsForUsers(\n codiceUtenti: number[],\n ): Promise<Map<string, Map<number, Record<string, unknown>[]>>> {\n const byObjectKey = new Map<string, Map<number, Record<string, unknown>[]>>();\n const extensions = this.accessiOptions.extensionFieldsOptions ?? [];\n const uniqueCodes = Array.from(new Set(codiceUtenti));\n\n for (const ext of extensions) {\n const grouped = new Map<number, Record<string, unknown>[]>();\n\n for (const chunk of this.chunkArray(uniqueCodes, 500)) {\n if (chunk.length === 0) {\n continue;\n }\n\n const placeholders = chunk.map(() => '?').join(', ');\n const rows = (await Orm.query(\n ext.databaseOptions,\n `SELECT ${ext.tableJoinFieldName} AS __joinkey, ${ext.tableFields.join(', ')} FROM ${ext.tableName} WHERE ${ext.tableJoinFieldName} IN (${placeholders})`,\n chunk,\n )).map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n\n for (const row of rows) {\n const { __joinkey, ...rest } = row;\n const key = Number(__joinkey);\n if (!Number.isFinite(key)) {\n continue;\n }\n\n const bucket = grouped.get(key);\n if (bucket) {\n bucket.push(rest);\n } else {\n grouped.set(key, [rest]);\n }\n }\n }\n\n byObjectKey.set(ext.objectKey, grouped);\n }\n\n return byObjectKey;\n }\n\n private chunkArray<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n return chunks;\n }\n\n /** Cerca il codice interno per email normalizzata. Il chiamante deve gestire il caso senza righe. */\n async getCodiceUtenteByEmail(email: string): Promise<{ codiceUtente: number }> {\n try {\n const query = `SELECT CODUTE as codice_utente FROM UTENTI WHERE LOWER(USRNAME) = ?`;\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, [\n email.trim().toLowerCase(),\n ]);\n return result.map(RestUtilities.convertKeysToCamelCase)[0] as { codiceUtente: number };\n } catch (error) {\n throw error;\n }\n }\n\n /** Recupera il profilo locale usato dal login, compresi filtri Accessi eventualmente presenti. */\n async getUserByEmail(email: string): Promise<UserDto | null> {\n const query = `\n SELECT \n U.CODUTE AS codice_utente, \n U.USRNAME AS email, \n U.FLGGDPR AS flag_gdpr,\n U.DATSCAPWD as data_scadenza_password,\n U.STAREG AS stato_registrazione, \n C.COGNOME AS cognome, \n C.NOME AS nome, \n C.AVATAR AS avatar, \n C.FLG2FATT AS flag_due_fattori,\n C.FLGPWDLESS AS passwordless_login_enabled,\n C.CODLINGUA AS codice_lingua, \n C.CELLULARE AS cellulare, \n C.PAGDEF AS pagina_default,\n C.FLGSUPER AS flag_super,\n C.FLGADMIN AS flag_admin,\n COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI U\n INNER JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE\n WHERE LOWER(U.USRNAME) = ?\n `;\n\n const utenti = (await Orm.query(this.accessiOptions.databaseOptions, query, [email]).then(\n (results) => results.map(RestUtilities.convertKeysToCamelCase),\n )) as UserDto[];\n\n const user = utenti[0];\n if (!user) return null;\n\n const filtro = (await this.filtriService.getFiltriUser(user.codiceUtente))[0];\n if (filtro) {\n const filterValues: Record<string, unknown> = {};\n\n Object.entries(FILTRI_UTENTE_DB_MAPPING).forEach(([key]) => {\n if (key in filtro) {\n filterValues[key] = filtro[key as keyof FiltriUtente];\n }\n });\n\n Object.assign(user, filterValues);\n }\n\n return this.normalizeUserFlags(user);\n }\n\n async insertUserFilters(codiceUtente: number, filterData: RegisterRequest): Promise<void> {\n await this.filtriService.upsertFiltriUtente(codiceUtente, filterData);\n }\n\n /**\n * Crea utente, configurazione e filtri. La registrazione pubblica resta in stato `INVIO` e non puo\n * impostare privilegi, ruoli o grant; soltanto flussi backend fidati possono usare `allowPrivilegedFields`.\n */\n async register(\n registrationData: RegisterRequest,\n options?: { allowPrivilegedFields?: boolean; initialState?: StatoRegistrazione },\n ): Promise<number> {\n try {\n const allowPrivilegedFields = options?.allowPrivilegedFields === true;\n const normalizedEmail = this.normalizeEmail(registrationData.email);\n\n if (registrationData.flagDueFattori !== undefined && typeof registrationData.flagDueFattori !== 'boolean') {\n throw new BadRequestException('Il flag due fattori deve essere booleano.');\n }\n if (registrationData.flagDueFattori && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalizedEmail)) {\n throw new BadRequestException('Per attivare i codici di accesso serve un indirizzo email valido.');\n }\n\n if (\n !allowPrivilegedFields &&\n (registrationData.flagSuper !== undefined ||\n registrationData.flagAdmin !== undefined ||\n registrationData.flagDueFattori !== undefined ||\n registrationData.roles !== undefined ||\n registrationData.permissions !== undefined)\n ) {\n throw new Error('I campi privilegiati non sono consentiti nella registrazione pubblica.');\n }\n\n await this.ensureEmailIsAvailable(normalizedEmail);\n\n const queryUtenti = `INSERT INTO UTENTI (USRNAME, STAREG) VALUES (?,?) RETURNING CODUTE`;\n // Public/local registrations keep the historic INVIO state; trusted master or SSO flows may opt into CONF.\n const paramsUtenti = [normalizedEmail, options?.initialState ?? StatoRegistrazione.INVIO];\n\n // Utente e configurazione sono creati in un'unica transazione; filtri e assegnazioni restano\n // fuori perché delegati a servizi dedicati.\n const codiceUtente = await Orm.withTransaction(\n this.accessiOptions.databaseOptions,\n async (transaction) => {\n const insertedUsers = await Orm.transactionQuery<unknown>(\n transaction,\n queryUtenti,\n paramsUtenti,\n );\n\n const insertedUser = (Array.isArray(insertedUsers) ? insertedUsers[0] : insertedUsers) as Record<string, unknown> | undefined;\n const newCodiceUtente = Number(\n insertedUser?.CODUTE ?? insertedUser?.codute,\n );\n if (!newCodiceUtente) {\n throw new Error('Creazione utente non riuscita: impossibile recuperare CODUTE.');\n }\n\n const utentiConfigFields = ['CODUTE', 'COGNOME', 'NOME'];\n const utentiConfigPlaceholders = ['?', '?', '?'];\n const utentiConfigParams: unknown[] = [newCodiceUtente, registrationData.cognome, registrationData.nome];\n\n const optionalFields: OptionalField<unknown>[] = [\n {\n key: 'cellulare',\n dbField: 'CELLULARE',\n transform: (v) => String(v),\n },\n {\n key: 'avatar',\n dbField: 'AVATAR',\n transform: (v) => String(v),\n },\n {\n key: 'paginaDefault',\n dbField: 'PAGDEF',\n transform: (v) => String(v),\n },\n {\n key: 'flagDueFattori',\n dbField: 'FLG2FATT',\n transform: (v) => (v ? 1 : 0),\n },\n ];\n\n if (allowPrivilegedFields) {\n optionalFields.push(\n {\n key: 'flagSuper',\n dbField: 'FLGSUPER',\n transform: (v) => (v ? 1 : 0),\n },\n {\n key: 'flagAdmin',\n dbField: 'FLGADMIN',\n transform: (v) => (v ? 1 : 0),\n },\n );\n }\n\n for (const field of optionalFields) {\n const value = (registrationData as unknown as Record<string, unknown>)[field.key];\n if (value !== undefined && value !== null) {\n utentiConfigFields.push(field.dbField);\n utentiConfigPlaceholders.push('?');\n utentiConfigParams.push(field.transform ? field.transform(value) : value);\n }\n }\n\n const queryUtentiConfig = `INSERT INTO UTENTI_CONFIG (${utentiConfigFields.join(\n ', ',\n )}) VALUES (${utentiConfigPlaceholders.join(', ')})`;\n await Orm.transactionQuery(transaction, queryUtentiConfig, utentiConfigParams);\n\n return newCodiceUtente;\n },\n );\n\n await this.filtriService.upsertFiltriUtente(codiceUtente, registrationData);\n\n if (allowPrivilegedFields && !!registrationData.roles && registrationData.roles.length > 0) {\n await this.permissionService.assignRolesToUser(codiceUtente, registrationData.roles);\n }\n\n if (\n allowPrivilegedFields &&\n !!registrationData.permissions &&\n registrationData.permissions.length > 0\n ) {\n await this.permissionService.assignPermissionsToUser(\n codiceUtente,\n registrationData.permissions,\n );\n }\n\n return codiceUtente;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Aggiorna il profilo utente e i filtri. Le modifiche a stato, ruoli, grant e flag amministrativi richiedono\n * `allowPrivilegedChanges`; gli array ruolo/grant passati in un flusso fidato sostituiscono le assegnazioni.\n */\n async updateUser(\n codiceUtente: number,\n user: UserDto,\n options?: { allowPrivilegedChanges?: boolean },\n ): Promise<void> {\n try {\n if (!codiceUtente) throw new Error('Impossibile aggiornare senza codice utente.');\n const allowPrivilegedChanges = options?.allowPrivilegedChanges === true;\n\n for (const value of [user.flagDueFattori, user.passwordlessLoginEnabled]) {\n if (value !== undefined && typeof value !== 'boolean') throw new BadRequestException('Le policy di autenticazione devono essere booleane.');\n }\n\n if (\n !allowPrivilegedChanges &&\n (user.statoRegistrazione !== undefined ||\n user.flagSuper !== undefined ||\n user.flagAdmin !== undefined ||\n user.passwordLoginEnabled !== undefined ||\n user.passwordlessLoginEnabled !== undefined ||\n user.flagDueFattori !== undefined ||\n user.roles !== undefined ||\n user.permissions !== undefined)\n ) {\n throw new Error('Non e consentito modificare campi privilegiati.');\n }\n\n if (user.flagDueFattori !== undefined || user.passwordlessLoginEnabled !== undefined || user.email !== undefined) {\n const current = await this.getAuthenticatedUserSnapshot(codiceUtente);\n if (!current) throw new BadRequestException('Utente non trovato.');\n const twoFactor = user.flagDueFattori ?? current.flagDueFattori;\n const passwordless = user.passwordlessLoginEnabled ?? current.passwordlessLoginEnabled;\n if (passwordless && !twoFactor) throw new BadRequestException('Il login senza password richiede il codice di accesso attivo.');\n if (twoFactor && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((user.email ?? current.email ?? '').trim())) {\n throw new BadRequestException('Per attivare i codici di accesso serve un indirizzo email valido.');\n }\n }\n\n const utentiUpdates = [];\n const utentiParams = [];\n\n if (user.email !== undefined) {\n const normalizedEmail = this.normalizeEmail(user.email);\n await this.ensureEmailIsAvailable(normalizedEmail, codiceUtente);\n utentiUpdates.push('usrname = ?');\n utentiParams.push(normalizedEmail);\n }\n if (user.flagGdpr !== undefined) {\n utentiUpdates.push('flggdpr = ?');\n utentiParams.push(user.flagGdpr);\n }\n if (allowPrivilegedChanges && user.statoRegistrazione !== undefined) {\n utentiUpdates.push('stareg = ?');\n utentiParams.push(user.statoRegistrazione);\n }\n\n if (utentiUpdates.length > 0) {\n const queryUtenti = `UPDATE UTENTI SET ${utentiUpdates.join(', ')} WHERE CODUTE = ?`;\n utentiParams.push(codiceUtente);\n await Orm.execute(this.accessiOptions.databaseOptions, queryUtenti, utentiParams);\n }\n\n const utentiConfigUpdates = [];\n const utentiConfigParams = [];\n\n if (user.cognome !== undefined) {\n utentiConfigUpdates.push('cognome = ?');\n utentiConfigParams.push(user.cognome);\n }\n if (user.nome !== undefined) {\n utentiConfigUpdates.push('nome = ?');\n utentiConfigParams.push(user.nome);\n }\n if (user.avatar !== undefined) {\n utentiConfigUpdates.push('avatar = ?');\n utentiConfigParams.push(user.avatar);\n }\n if (user.flagDueFattori !== undefined) {\n utentiConfigUpdates.push('flg2fatt = ?');\n utentiConfigParams.push(user.flagDueFattori ? 1 : 0);\n }\n if (user.passwordlessLoginEnabled !== undefined) {\n utentiConfigUpdates.push('flgpwdless = ?');\n utentiConfigParams.push(user.passwordlessLoginEnabled ? 1 : 0);\n }\n if (user.codiceLingua !== undefined) {\n utentiConfigUpdates.push('codlingua = ?');\n utentiConfigParams.push(user.codiceLingua);\n }\n if (user.cellulare !== undefined) {\n utentiConfigUpdates.push('cellulare = ?');\n utentiConfigParams.push(user.cellulare);\n }\n if (user.paginaDefault !== undefined) {\n utentiConfigUpdates.push('PAGDEF = ?');\n utentiConfigParams.push(user.paginaDefault);\n }\n if (allowPrivilegedChanges && user.flagSuper !== undefined) {\n utentiConfigUpdates.push('flgsuper = ?');\n utentiConfigParams.push(user.flagSuper);\n }\n if (allowPrivilegedChanges && user.flagAdmin !== undefined) {\n utentiConfigUpdates.push('FLGADMIN = ?');\n utentiConfigParams.push(user.flagAdmin);\n }\n if (allowPrivilegedChanges && user.passwordLoginEnabled !== undefined) {\n utentiConfigUpdates.push('flgpassword = ?');\n utentiConfigParams.push(user.passwordLoginEnabled ? 1 : 0);\n }\n if (user.jsonMetadata !== undefined) {\n utentiConfigUpdates.push('json_metadata = ?');\n utentiConfigParams.push(user.jsonMetadata);\n }\n\n if (utentiConfigUpdates.length > 0) {\n const queryUtentiConfig = `UPDATE UTENTI_CONFIG SET ${utentiConfigUpdates.join(\n ', ',\n )} WHERE CODUTE = ?`;\n utentiConfigParams.push(codiceUtente);\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n queryUtentiConfig,\n utentiConfigParams,\n );\n }\n\n if (allowPrivilegedChanges && Array.isArray(user.roles)) {\n await this.permissionService.assignRolesToUser(codiceUtente, user.roles);\n }\n\n if (allowPrivilegedChanges && Array.isArray(user.permissions)) {\n await this.permissionService.assignPermissionsToUser(codiceUtente, user.permissions);\n }\n\n await this.filtriService.upsertFiltriUtente(codiceUtente, user);\n } catch (error) {\n throw error;\n }\n }\n\n async updateUserFilters(codiceUtente: number, user: UserDto): Promise<void> {\n await this.filtriService.upsertFiltriUtente(codiceUtente, user);\n }\n\n /** Eliminazione logica: imposta lo stato `DELETE` senza cancellare lo storico o i collegamenti SSO. */\n async deleteUser(codiceCliente: number): Promise<void> {\n try {\n const query = `UPDATE UTENTI SET STAREG = ? WHERE CODUTE = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, query, [\n StatoRegistrazione.DELETE,\n codiceCliente,\n ]);\n } catch (error) {\n throw error;\n }\n }\n\n /** Cambia esplicitamente lo stato di registrazione; usare questa API per blocco, conferma o eliminazione logica. */\n async setStato(codiceCliente: number, statoRegistrazione: StatoRegistrazione) {\n try {\n const query = `UPDATE UTENTI SET STAREG = ? WHERE CODUTE = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, query, [\n statoRegistrazione,\n codiceCliente,\n ]);\n } catch (error) {\n throw error;\n }\n }\n\n public async setGdpr(codiceUtente: number) {\n try {\n return await Orm.executeMultiple(this.accessiOptions.databaseOptions, [\n { query: 'INSERT INTO UTENTI_GDPR (CODUTE, GDPR) VALUES (?, ?)', params: [codiceUtente, 'true'] },\n { query: 'UPDATE UTENTI SET FLGGDPR = 1, DATGDPR = CURRENT_DATE WHERE CODUTE = ?', params: [codiceUtente] },\n ]);\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Forza l'invio dell'email di reset password per un utente. Operazione amministrativa.\n * Richiede un servizio email configurato: altrimenti solleva ACCESSI_EMAIL_NOT_CONFIGURED.\n */\n public async forcePasswordReset(codiceUtente: number): Promise<void> {\n assertEmailConfigured(this.accessiOptions);\n const rows = await this.getUsers({ codiceUtente });\n const email = rows[0]?.utente?.email;\n if (typeof email !== 'string' || email.trim() === '') {\n throw new NotFoundException(`Nessun utente con email per il codice ${codiceUtente}.`);\n }\n await this.emailService.sendPasswordResetEmail(email);\n }\n\n /**\n * Forza l'invio dell'email di reset a tutti gli utenti la cui password non e ancora nel formato\n * moderno (`scrypt$...`), cioe' legacy grezza o `scrypt-legacy` non piu verificabile. Utile quando\n * la `encryptionKey` storica e perduta. Richiede email configurata. Ritorna quanti utenti hanno\n * ricevuto l'email.\n */\n public async forcePasswordResetForLegacyPasswords(): Promise<number> {\n assertEmailConfigured(this.accessiOptions);\n const rows = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT U.CODUTE AS codice_utente, U.USRNAME AS email\n FROM UTENTI U\n JOIN UTENTI_PWD P ON P.CODUTE = U.CODUTE\n WHERE P.PWD IS NOT NULL AND P.PWD NOT STARTING WITH 'scrypt$'`,\n [],\n false,\n );\n\n let sent = 0;\n for (const row of rows as Array<Record<string, unknown>>) {\n const raw = RestUtilities.convertKeysToCamelCase(row) as Record<string, unknown>;\n const email = typeof raw.email === 'string' ? raw.email.trim() : '';\n if (email === '') continue;\n await this.emailService.sendPasswordResetEmail(email);\n sent += 1;\n }\n return sent;\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.11.0";
6
+ export declare const ACCESSI_SCHEMA_VERSION = "1.11.1";
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.11.0';
4
+ exports.ACCESSI_SCHEMA_VERSION = '1.11.1';
5
5
  exports.ACCESSI_VERSION_KEY = 'AccessiVersion';
6
6
  /**
7
7
  * Colonne storiche/applicative non piu di dominio Accessi. La riconciliazione le copia (se
@@ -23,7 +23,7 @@ exports.accessiObsoleteColumns = {
23
23
  UTENTI_CONFIG: [
24
24
  'FLGMOP', 'FLGPIANA', 'FLGADDETTI', 'FLGOSPITI', 'FLGPIANARFID',
25
25
  'FLGCONTA', 'FLGCUBI', 'FLGCICLPASS', 'FLGDIPENDENTI', 'FLGINVENTARI',
26
- 'CAUMOV', 'NUMMAC', 'RAGSOCCLI', 'PAGDEF',
26
+ 'CAUMOV', 'NUMMAC', 'RAGSOCCLI',
27
27
  ],
28
28
  MENU_GRP: ['NOMECAMPO'],
29
29
  };
@@ -37,7 +37,7 @@ exports.accessiTables = {
37
37
  CODUTE: 'INTEGER NOT NULL', COGNOME: 'VARCHAR(50)', NOME: 'VARCHAR(50)', AVATAR: 'VARCHAR(30)',
38
38
  FLG2FATT: 'SMALLINT DEFAULT 0', FLGPWDLESS: 'SMALLINT DEFAULT 0 NOT NULL', FLGPASSWORD: 'SMALLINT DEFAULT 1 NOT NULL',
39
39
  CODLINGUA: "VARCHAR(2) DEFAULT 'IT'", FLGSUPER: 'SMALLINT DEFAULT 0', FLGADMIN: 'SMALLINT DEFAULT 0',
40
- CELLULARE: 'VARCHAR(30)', JSON_METADATA: 'BLOB SUB_TYPE 1',
40
+ CELLULARE: 'VARCHAR(30)', PAGDEF: 'VARCHAR(50)', JSON_METADATA: 'BLOB SUB_TYPE 1',
41
41
  }, primaryKey: ['CODUTE'] },
42
42
  UTENTI_PWD: { columns: { CODUTE: 'INTEGER NOT NULL', PWD: 'VARCHAR(255)' }, primaryKey: ['CODUTE'] },
43
43
  UTENTI_OLDPWD: { columns: { CODUTE: 'INTEGER NOT NULL', OLDPWD: 'VARCHAR(255)' }, primaryKey: ['CODUTE'] },
@@ -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.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"]}
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.1';\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',\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)', PAGDEF: 'VARCHAR(50)', 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"]}