emilsoftware-utilities 2.0.0-dev.41 → 2.0.0-dev.43

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 (86) hide show
  1. package/dist/accessi-module/AccessiModule.d.ts +1 -0
  2. package/dist/accessi-module/AccessiModule.js +2 -0
  3. package/dist/accessi-module/AccessiModule.js.map +1 -1
  4. package/dist/accessi-module/Console/console.js +407 -30
  5. package/dist/accessi-module/Console/console.js.map +1 -1
  6. package/dist/accessi-module/Console/generated/accessiApi.d.ts +41 -1
  7. package/dist/accessi-module/Console/generated/accessiApi.js +34 -2
  8. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
  9. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.d.ts +1 -1
  10. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +1 -1
  11. package/dist/accessi-module/Console/generated/model/consoleEntryExchangeRequest.d.ts +10 -0
  12. package/dist/accessi-module/Console/generated/model/consoleEntryExchangeRequest.js +9 -0
  13. package/dist/accessi-module/Console/generated/model/consoleEntryExchangeRequest.js.map +1 -0
  14. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResponse.d.ts +14 -0
  15. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResponse.js +3 -0
  16. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResponse.js.map +1 -0
  17. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResult.d.ts +10 -0
  18. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResult.js +3 -0
  19. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResult.js.map +1 -0
  20. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResponse.d.ts +14 -0
  21. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResponse.js +3 -0
  22. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResponse.js.map +1 -0
  23. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResult.d.ts +12 -0
  24. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResult.js +9 -0
  25. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResult.js.map +1 -0
  26. package/dist/accessi-module/Console/generated/model/consoleEntryTokenResult.d.ts +12 -0
  27. package/dist/accessi-module/Console/generated/model/consoleEntryTokenResult.js +9 -0
  28. package/dist/accessi-module/Console/generated/model/consoleEntryTokenResult.js.map +1 -0
  29. package/dist/accessi-module/Console/generated/model/index.d.ts +7 -0
  30. package/dist/accessi-module/Console/generated/model/index.js +7 -0
  31. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  32. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.d.ts +14 -0
  33. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js +9 -0
  34. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js.map +1 -0
  35. package/dist/accessi-module/Console/help.js +116 -0
  36. package/dist/accessi-module/Console/help.js.map +1 -1
  37. package/dist/accessi-module/Console/wiki.js +14 -3
  38. package/dist/accessi-module/Console/wiki.js.map +1 -1
  39. package/dist/accessi-module/Controllers/ConsoleEntryController.d.ts +14 -0
  40. package/dist/accessi-module/Controllers/ConsoleEntryController.js +128 -0
  41. package/dist/accessi-module/Controllers/ConsoleEntryController.js.map +1 -0
  42. package/dist/accessi-module/Controllers/FiltriController.d.ts +8 -1
  43. package/dist/accessi-module/Controllers/FiltriController.js +21 -2
  44. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  45. package/dist/accessi-module/Controllers/PermissionController.d.ts +8 -1
  46. package/dist/accessi-module/Controllers/PermissionController.js +24 -4
  47. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  48. package/dist/accessi-module/Controllers/UserController.d.ts +12 -1
  49. package/dist/accessi-module/Controllers/UserController.js +175 -9
  50. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  51. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js +1 -1
  52. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
  53. package/dist/accessi-module/Dtos/ConsoleEntryDtos.d.ts +24 -0
  54. package/dist/accessi-module/Dtos/ConsoleEntryDtos.js +77 -0
  55. package/dist/accessi-module/Dtos/ConsoleEntryDtos.js.map +1 -0
  56. package/dist/accessi-module/Dtos/SetUserPasswordRequest.d.ts +4 -0
  57. package/dist/accessi-module/Dtos/SetUserPasswordRequest.js +32 -0
  58. package/dist/accessi-module/Dtos/SetUserPasswordRequest.js.map +1 -0
  59. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -2
  60. package/dist/accessi-module/Services/AuthService/AuthService.js +13 -9
  61. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  62. package/dist/accessi-module/Services/UserService/UserService.d.ts +15 -0
  63. package/dist/accessi-module/Services/UserService/UserService.js +126 -55
  64. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  65. package/dist/accessi-module/Views/reset-password.html +23 -7
  66. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +10 -1
  67. package/dist/accessi-module/federated-auth/FederatedAuthController.js +50 -10
  68. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +1 -1
  69. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +2 -0
  70. package/dist/accessi-module/federated-auth/FederatedAuthService.js +10 -0
  71. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -1
  72. package/dist/accessi-module/security/accessControl.d.ts +26 -0
  73. package/dist/accessi-module/security/accessControl.js +37 -0
  74. package/dist/accessi-module/security/accessControl.js.map +1 -1
  75. package/dist/accessi-module/security/consoleEntry.d.ts +16 -0
  76. package/dist/accessi-module/security/consoleEntry.js +50 -0
  77. package/dist/accessi-module/security/consoleEntry.js.map +1 -0
  78. package/dist/accessi-module/security/passwordPolicy.d.ts +21 -0
  79. package/dist/accessi-module/security/passwordPolicy.js +71 -0
  80. package/dist/accessi-module/security/passwordPolicy.js.map +1 -0
  81. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +1 -1
  82. package/dist/accessi-module/security/publicAuthRateLimit.js +1 -0
  83. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  84. package/dist/emilsoftware-utilities-2.0.0-dev.43.tgz +0 -0
  85. package/package.json +1 -1
  86. package/dist/emilsoftware-utilities-2.0.0-dev.41.tgz +0 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generated by orval v6.31.0 🍺
3
+ * Do not edit manually.
4
+ * Accessi API
5
+ * OpenAPI spec version: 1.0
6
+ */
7
+ export interface ConsoleEntryTicketResult {
8
+ /** Validita del ticket in secondi. */
9
+ expiresInSeconds: number;
10
+ /** Ticket monouso da usare in /api/accessi/console#entry=<ticket>. */
11
+ ticket: string;
12
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Generated by orval v6.31.0 🍺
4
+ * Do not edit manually.
5
+ * Accessi API
6
+ * OpenAPI spec version: 1.0
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=consoleEntryTicketResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consoleEntryTicketResult.js","sourceRoot":"","sources":["../../../../../src/accessi-module/Console/generated/model/consoleEntryTicketResult.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Generated by orval v6.31.0 🍺\n * Do not edit manually.\n * Accessi API\n * OpenAPI spec version: 1.0\n */\n\nexport interface ConsoleEntryTicketResult {\n /** Validita del ticket in secondi. */\n expiresInSeconds: number;\n /** Ticket monouso da usare in /api/accessi/console#entry=<ticket>. */\n ticket: string;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generated by orval v6.31.0 🍺
3
+ * Do not edit manually.
4
+ * Accessi API
5
+ * OpenAPI spec version: 1.0
6
+ */
7
+ export interface ConsoleEntryTokenResult {
8
+ /** Schema di autorizzazione. */
9
+ type: string;
10
+ /** JWT Accessi. */
11
+ value: string;
12
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Generated by orval v6.31.0 🍺
4
+ * Do not edit manually.
5
+ * Accessi API
6
+ * OpenAPI spec version: 1.0
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=consoleEntryTokenResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consoleEntryTokenResult.js","sourceRoot":"","sources":["../../../../../src/accessi-module/Console/generated/model/consoleEntryTokenResult.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Generated by orval v6.31.0 🍺\n * Do not edit manually.\n * Accessi API\n * OpenAPI spec version: 1.0\n */\n\nexport interface ConsoleEntryTokenResult {\n /** Schema di autorizzazione. */\n type: string;\n /** JWT Accessi. */\n value: string;\n}\n"]}
@@ -15,6 +15,12 @@ export * from './bootstrapAdminRequest';
15
15
  export * from './bootstrapAdminResponse';
16
16
  export * from './bootstrapAdminResultDto';
17
17
  export * from './confirmResetPasswordRequest';
18
+ export * from './consoleEntryExchangeRequest';
19
+ export * from './consoleEntrySessionResponse';
20
+ export * from './consoleEntrySessionResult';
21
+ export * from './consoleEntryTicketResponse';
22
+ export * from './consoleEntryTicketResult';
23
+ export * from './consoleEntryTokenResult';
18
24
  export * from './createFederatedIdentityRequest';
19
25
  export * from './createFederatedProviderRequest';
20
26
  export * from './createFederatedUserRequest';
@@ -76,6 +82,7 @@ export * from './serviceTokenDto';
76
82
  export * from './setPasswordLoginPolicyRequest';
77
83
  export * from './setStatoRegistrazioneDto';
78
84
  export * from './setStatoRegistrazioneDtoStatoRegistrazione';
85
+ export * from './setUserPasswordRequest';
79
86
  export * from './status';
80
87
  export * from './tipoFiltro';
81
88
  export * from './tipoFiltroFlgEnabled';
@@ -31,6 +31,12 @@ __exportStar(require("./bootstrapAdminRequest"), exports);
31
31
  __exportStar(require("./bootstrapAdminResponse"), exports);
32
32
  __exportStar(require("./bootstrapAdminResultDto"), exports);
33
33
  __exportStar(require("./confirmResetPasswordRequest"), exports);
34
+ __exportStar(require("./consoleEntryExchangeRequest"), exports);
35
+ __exportStar(require("./consoleEntrySessionResponse"), exports);
36
+ __exportStar(require("./consoleEntrySessionResult"), exports);
37
+ __exportStar(require("./consoleEntryTicketResponse"), exports);
38
+ __exportStar(require("./consoleEntryTicketResult"), exports);
39
+ __exportStar(require("./consoleEntryTokenResult"), exports);
34
40
  __exportStar(require("./createFederatedIdentityRequest"), exports);
35
41
  __exportStar(require("./createFederatedProviderRequest"), exports);
36
42
  __exportStar(require("./createFederatedUserRequest"), exports);
@@ -92,6 +98,7 @@ __exportStar(require("./serviceTokenDto"), exports);
92
98
  __exportStar(require("./setPasswordLoginPolicyRequest"), exports);
93
99
  __exportStar(require("./setStatoRegistrazioneDto"), exports);
94
100
  __exportStar(require("./setStatoRegistrazioneDtoStatoRegistrazione"), exports);
101
+ __exportStar(require("./setUserPasswordRequest"), exports);
95
102
  __exportStar(require("./status"), exports);
96
103
  __exportStar(require("./tipoFiltro"), exports);
97
104
  __exportStar(require("./tipoFiltroFlgEnabled"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/accessi-module/Console/generated/model/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,qDAAmC;AACnC,qEAAmD;AACnD,mDAAiC;AACjC,mEAAiD;AACjD,6DAA2C;AAC3C,iEAA+C;AAC/C,gEAA8C;AAC9C,0DAAwC;AACxC,2DAAyC;AACzC,4DAA0C;AAC1C,gEAA8C;AAC9C,mEAAiD;AACjD,mEAAiD;AACjD,+DAA6C;AAC7C,4DAA0C;AAC1C,sEAAoD;AACpD,2DAAyC;AACzC,sDAAoC;AACpC,0DAAwC;AACxC,8DAA4C;AAC5C,+DAA6C;AAC7C,kDAAgC;AAChC,kEAAgD;AAChD,8DAA4C;AAC5C,iEAA+C;AAC/C,kEAAgD;AAChD,8DAA4C;AAC5C,iEAA+C;AAC/C,iDAA+B;AAC/B,sDAAoC;AACpC,0DAAwC;AACxC,4DAA0C;AAC1C,6DAA2C;AAC3C,+DAA6C;AAC7C,yDAAuC;AACvC,qDAAmC;AACnC,qDAAmC;AACnC,sDAAoC;AACpC,2DAAyC;AACzC,6DAA2C;AAC3C,0DAAwC;AACxC,2DAAyC;AACzC,mDAAiC;AACjC,qDAAmC;AACnC,mDAAiC;AACjC,kEAAgD;AAChD,yDAAuC;AACvC,0DAAwC;AACxC,iDAA+B;AAC/B,kDAAgC;AAChC,gDAA8B;AAC9B,+DAA6C;AAC7C,gEAA8C;AAC9C,+CAA6B;AAC7B,mDAAiC;AACjC,4DAA0C;AAC1C,+CAA6B;AAC7B,0DAAwC;AACxC,oDAAkC;AAClC,qDAAmC;AACnC,2DAAyC;AACzC,yCAAuB;AACvB,8CAA4B;AAC5B,8DAA4C;AAC5C,oDAAkC;AAClC,qDAAmC;AACnC,kEAAgD;AAChD,iEAA+C;AAC/C,oDAAkC;AAClC,kEAAgD;AAChD,6DAA2C;AAC3C,+EAA6D;AAC7D,2CAAyB;AACzB,+CAA6B;AAC7B,yDAAuC;AACvC,gDAA8B;AAC9B,oDAAkC;AAClC,0DAAwC;AACxC,gEAA8C;AAC9C,2EAAyD;AACzD,+DAA6C;AAC7C,mEAAiD;AACjD,mEAAiD;AACjD,4DAA0C;AAC1C,sEAAoD;AACpD,2DAAyC;AACzC,sDAAoC;AACpC,0DAAwC;AACxC,4CAA0B;AAC1B,8DAA4C;AAC5C,kDAAgC;AAChC,uDAAqC;AACrC,2DAAyC","sourcesContent":["/**\n * Generated by orval v6.31.0 🍺\n * Do not edit manually.\n * Accessi API\n * OpenAPI spec version: 1.0\n */\n\nexport * from './abilitazioneMenu';\nexport * from './abilitazioneMenuTipoAbilitazione';\nexport * from './actionResponse';\nexport * from './assignPermissionsToUserRequest';\nexport * from './assignRolesToUserRequest';\nexport * from './authenticatedTokenPayloadDto';\nexport * from './authenticatedUserPayloadDto';\nexport * from './bootstrapAdminRequest';\nexport * from './bootstrapAdminResponse';\nexport * from './bootstrapAdminResultDto';\nexport * from './confirmResetPasswordRequest';\nexport * from './createFederatedIdentityRequest';\nexport * from './createFederatedProviderRequest';\nexport * from './createFederatedUserRequest';\nexport * from './createFilterTypeRequest';\nexport * from './createFilterTypeRequestFlgEnabled';\nexport * from './createMenuGroupRequest';\nexport * from './createMenuRequest';\nexport * from './createMenuTypeRequest';\nexport * from './createServiceTokenRequest';\nexport * from './createServiceTokenResponse';\nexport * from './errorResponse';\nexport * from './federatedIdentityListResponse';\nexport * from './federatedIdentityResponse';\nexport * from './federatedIdentityResponseDto';\nexport * from './federatedProviderListResponse';\nexport * from './federatedProviderResponse';\nexport * from './federatedProviderResponseDto';\nexport * from './filtriUtente';\nexport * from './getFiltriResponse';\nexport * from './getFiltriUtenteParams';\nexport * from './getFiltriUtenteResponse';\nexport * from './getGroupsWithMenusParams';\nexport * from './getGroupsWithMenusResponse';\nexport * from './getMenuTypesResponse';\nexport * from './getMenusResponse';\nexport * from './getRolesResponse';\nexport * from './getSchemaResponse';\nexport * from './getServiceTokensParams';\nexport * from './getServiceTokensResponse';\nexport * from './getUserByTokenRequest';\nexport * from './getUserByTokenResponse';\nexport * from './getUsersParams';\nexport * from './getUsersResponse';\nexport * from './getUsersResult';\nexport * from './getUsersResultExtensionFields';\nexport * from './groupWithMenusEntity';\nexport * from './issuedServiceTokenDto';\nexport * from './loginRequest';\nexport * from './loginResponse';\nexport * from './loginResult';\nexport * from './loginResultExtensionFields';\nexport * from './loginResultPasswordRequired';\nexport * from './menuEntity';\nexport * from './menuTypeEntity';\nexport * from './passwordExpiredResponse';\nexport * from './permission';\nexport * from './publicRegisterRequest';\nexport * from './registerRequest';\nexport * from './registerResponse';\nexport * from './resendTwoFactorRequest';\nexport * from './role';\nexport * from './ruoliMenu';\nexport * from './ruoliMenuTipoAbilitazione';\nexport * from './schemaDdlResult';\nexport * from './schemaDdlSection';\nexport * from './sendResetPasswordEmailRequest';\nexport * from './serveResetPasswordPageParams';\nexport * from './serviceTokenDto';\nexport * from './setPasswordLoginPolicyRequest';\nexport * from './setStatoRegistrazioneDto';\nexport * from './setStatoRegistrazioneDtoStatoRegistrazione';\nexport * from './status';\nexport * from './tipoFiltro';\nexport * from './tipoFiltroFlgEnabled';\nexport * from './tokenResult';\nexport * from './tokenResultType';\nexport * from './twoFactorChallengeDto';\nexport * from './twoFactorChallengeDtoMethod';\nexport * from './twoFactorChallengeDtoTwoFactorRequired';\nexport * from './updateEnabledStatusRequest';\nexport * from './updateFederatedIdentityRequest';\nexport * from './updateFederatedProviderRequest';\nexport * from './updateFilterTypeRequest';\nexport * from './updateFilterTypeRequestFlgEnabled';\nexport * from './updateMenuGroupRequest';\nexport * from './updateMenuRequest';\nexport * from './updateMenuTypeRequest';\nexport * from './userDto';\nexport * from './userDtoStatoRegistrazione';\nexport * from './userGrantsDto';\nexport * from './userGrantsResponse';\nexport * from './verifyTwoFactorRequest';"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/accessi-module/Console/generated/model/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,qDAAmC;AACnC,qEAAmD;AACnD,mDAAiC;AACjC,mEAAiD;AACjD,6DAA2C;AAC3C,iEAA+C;AAC/C,gEAA8C;AAC9C,0DAAwC;AACxC,2DAAyC;AACzC,4DAA0C;AAC1C,gEAA8C;AAC9C,gEAA8C;AAC9C,gEAA8C;AAC9C,8DAA4C;AAC5C,+DAA6C;AAC7C,6DAA2C;AAC3C,4DAA0C;AAC1C,mEAAiD;AACjD,mEAAiD;AACjD,+DAA6C;AAC7C,4DAA0C;AAC1C,sEAAoD;AACpD,2DAAyC;AACzC,sDAAoC;AACpC,0DAAwC;AACxC,8DAA4C;AAC5C,+DAA6C;AAC7C,kDAAgC;AAChC,kEAAgD;AAChD,8DAA4C;AAC5C,iEAA+C;AAC/C,kEAAgD;AAChD,8DAA4C;AAC5C,iEAA+C;AAC/C,iDAA+B;AAC/B,sDAAoC;AACpC,0DAAwC;AACxC,4DAA0C;AAC1C,6DAA2C;AAC3C,+DAA6C;AAC7C,yDAAuC;AACvC,qDAAmC;AACnC,qDAAmC;AACnC,sDAAoC;AACpC,2DAAyC;AACzC,6DAA2C;AAC3C,0DAAwC;AACxC,2DAAyC;AACzC,mDAAiC;AACjC,qDAAmC;AACnC,mDAAiC;AACjC,kEAAgD;AAChD,yDAAuC;AACvC,0DAAwC;AACxC,iDAA+B;AAC/B,kDAAgC;AAChC,gDAA8B;AAC9B,+DAA6C;AAC7C,gEAA8C;AAC9C,+CAA6B;AAC7B,mDAAiC;AACjC,4DAA0C;AAC1C,+CAA6B;AAC7B,0DAAwC;AACxC,oDAAkC;AAClC,qDAAmC;AACnC,2DAAyC;AACzC,yCAAuB;AACvB,8CAA4B;AAC5B,8DAA4C;AAC5C,oDAAkC;AAClC,qDAAmC;AACnC,kEAAgD;AAChD,iEAA+C;AAC/C,oDAAkC;AAClC,kEAAgD;AAChD,6DAA2C;AAC3C,+EAA6D;AAC7D,2DAAyC;AACzC,2CAAyB;AACzB,+CAA6B;AAC7B,yDAAuC;AACvC,gDAA8B;AAC9B,oDAAkC;AAClC,0DAAwC;AACxC,gEAA8C;AAC9C,2EAAyD;AACzD,+DAA6C;AAC7C,mEAAiD;AACjD,mEAAiD;AACjD,4DAA0C;AAC1C,sEAAoD;AACpD,2DAAyC;AACzC,sDAAoC;AACpC,0DAAwC;AACxC,4CAA0B;AAC1B,8DAA4C;AAC5C,kDAAgC;AAChC,uDAAqC;AACrC,2DAAyC","sourcesContent":["/**\n * Generated by orval v6.31.0 🍺\n * Do not edit manually.\n * Accessi API\n * OpenAPI spec version: 1.0\n */\n\nexport * from './abilitazioneMenu';\nexport * from './abilitazioneMenuTipoAbilitazione';\nexport * from './actionResponse';\nexport * from './assignPermissionsToUserRequest';\nexport * from './assignRolesToUserRequest';\nexport * from './authenticatedTokenPayloadDto';\nexport * from './authenticatedUserPayloadDto';\nexport * from './bootstrapAdminRequest';\nexport * from './bootstrapAdminResponse';\nexport * from './bootstrapAdminResultDto';\nexport * from './confirmResetPasswordRequest';\nexport * from './consoleEntryExchangeRequest';\nexport * from './consoleEntrySessionResponse';\nexport * from './consoleEntrySessionResult';\nexport * from './consoleEntryTicketResponse';\nexport * from './consoleEntryTicketResult';\nexport * from './consoleEntryTokenResult';\nexport * from './createFederatedIdentityRequest';\nexport * from './createFederatedProviderRequest';\nexport * from './createFederatedUserRequest';\nexport * from './createFilterTypeRequest';\nexport * from './createFilterTypeRequestFlgEnabled';\nexport * from './createMenuGroupRequest';\nexport * from './createMenuRequest';\nexport * from './createMenuTypeRequest';\nexport * from './createServiceTokenRequest';\nexport * from './createServiceTokenResponse';\nexport * from './errorResponse';\nexport * from './federatedIdentityListResponse';\nexport * from './federatedIdentityResponse';\nexport * from './federatedIdentityResponseDto';\nexport * from './federatedProviderListResponse';\nexport * from './federatedProviderResponse';\nexport * from './federatedProviderResponseDto';\nexport * from './filtriUtente';\nexport * from './getFiltriResponse';\nexport * from './getFiltriUtenteParams';\nexport * from './getFiltriUtenteResponse';\nexport * from './getGroupsWithMenusParams';\nexport * from './getGroupsWithMenusResponse';\nexport * from './getMenuTypesResponse';\nexport * from './getMenusResponse';\nexport * from './getRolesResponse';\nexport * from './getSchemaResponse';\nexport * from './getServiceTokensParams';\nexport * from './getServiceTokensResponse';\nexport * from './getUserByTokenRequest';\nexport * from './getUserByTokenResponse';\nexport * from './getUsersParams';\nexport * from './getUsersResponse';\nexport * from './getUsersResult';\nexport * from './getUsersResultExtensionFields';\nexport * from './groupWithMenusEntity';\nexport * from './issuedServiceTokenDto';\nexport * from './loginRequest';\nexport * from './loginResponse';\nexport * from './loginResult';\nexport * from './loginResultExtensionFields';\nexport * from './loginResultPasswordRequired';\nexport * from './menuEntity';\nexport * from './menuTypeEntity';\nexport * from './passwordExpiredResponse';\nexport * from './permission';\nexport * from './publicRegisterRequest';\nexport * from './registerRequest';\nexport * from './registerResponse';\nexport * from './resendTwoFactorRequest';\nexport * from './role';\nexport * from './ruoliMenu';\nexport * from './ruoliMenuTipoAbilitazione';\nexport * from './schemaDdlResult';\nexport * from './schemaDdlSection';\nexport * from './sendResetPasswordEmailRequest';\nexport * from './serveResetPasswordPageParams';\nexport * from './serviceTokenDto';\nexport * from './setPasswordLoginPolicyRequest';\nexport * from './setStatoRegistrazioneDto';\nexport * from './setStatoRegistrazioneDtoStatoRegistrazione';\nexport * from './setUserPasswordRequest';\nexport * from './status';\nexport * from './tipoFiltro';\nexport * from './tipoFiltroFlgEnabled';\nexport * from './tokenResult';\nexport * from './tokenResultType';\nexport * from './twoFactorChallengeDto';\nexport * from './twoFactorChallengeDtoMethod';\nexport * from './twoFactorChallengeDtoTwoFactorRequired';\nexport * from './updateEnabledStatusRequest';\nexport * from './updateFederatedIdentityRequest';\nexport * from './updateFederatedProviderRequest';\nexport * from './updateFilterTypeRequest';\nexport * from './updateFilterTypeRequestFlgEnabled';\nexport * from './updateMenuGroupRequest';\nexport * from './updateMenuRequest';\nexport * from './updateMenuTypeRequest';\nexport * from './userDto';\nexport * from './userDtoStatoRegistrazione';\nexport * from './userGrantsDto';\nexport * from './userGrantsResponse';\nexport * from './verifyTwoFactorRequest';"]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Generated by orval v6.31.0 🍺
3
+ * Do not edit manually.
4
+ * Accessi API
5
+ * OpenAPI spec version: 1.0
6
+ */
7
+ export interface SetUserPasswordRequest {
8
+ /**
9
+ * Nuova password in chiaro: almeno 8 caratteri con maiuscola, minuscola, cifra e carattere speciale, senza spazi e non comune. Viene hashata e non restituita; se non conforme l API risponde 400 con codice ACCESSI_WEAK_PASSWORD.
10
+ * @minLength 8
11
+ * @maxLength 100
12
+ */
13
+ newPassword: string;
14
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Generated by orval v6.31.0 🍺
4
+ * Do not edit manually.
5
+ * Accessi API
6
+ * OpenAPI spec version: 1.0
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=setUserPasswordRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setUserPasswordRequest.js","sourceRoot":"","sources":["../../../../../src/accessi-module/Console/generated/model/setUserPasswordRequest.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Generated by orval v6.31.0 🍺\n * Do not edit manually.\n * Accessi API\n * OpenAPI spec version: 1.0\n */\n\nexport interface SetUserPasswordRequest {\n /**\n * Nuova password in chiaro: almeno 8 caratteri con maiuscola, minuscola, cifra e carattere speciale, senza spazi e non comune. Viene hashata e non restituita; se non conforme l API risponde 400 con codice ACCESSI_WEAK_PASSWORD.\n * @minLength 8\n * @maxLength 100\n */\n newPassword: string;\n}\n"]}
@@ -153,6 +153,113 @@ exports.HELP = {
153
153
  p(`E una stringa libera (massimo 50 caratteri): la libreria la conserva e la restituisce nel profilo; l'instradamento effettivo lo decide il frontend.`),
154
154
  ],
155
155
  },
156
+ 'user-cellulare': {
157
+ title: 'Cellulare',
158
+ blocks: [
159
+ p(`Numero di cellulare dell'utente (UTENTI_CONFIG.CELLULARE). È il recapito canonico per SMS o notifiche applicative; Accessi non lo invia da solo.`),
160
+ ],
161
+ },
162
+ 'user-lingua': {
163
+ title: 'Codice lingua',
164
+ blocks: [
165
+ p(`Lingua preferita dell'utente (UTENTI_CONFIG.CODLINGUA). Stringa breve come it, en, sl; viene restituita nel profilo e il frontend decide come usarla.`),
166
+ ],
167
+ },
168
+ 'user-avatar': {
169
+ title: 'Avatar',
170
+ blocks: [
171
+ p(`Riferimento all'avatar (UTENTI_CONFIG.AVATAR, massimo 30 caratteri): tipicamente un nome file o una chiave, non un base64.`),
172
+ ],
173
+ },
174
+ 'user-scadenza-password': {
175
+ title: 'Scadenza password',
176
+ blocks: [
177
+ p(`Data di scadenza della password (UTENTI.DATSCAPWD). Lascia vuoto per non forzare una scadenza; usa una data passata per richiedere il cambio al prossimo login, se la policy è attiva.`),
178
+ ],
179
+ },
180
+ 'user-gdpr': {
181
+ title: 'Consenso GDPR',
182
+ blocks: [
183
+ p(`Lo stato mostra se il consenso è registrato. Il pulsante "Registra consenso GDPR" (endpoint set-gdpr) imposta FLGGDPR e DATGDPR e scrive la riga storica in UTENTI_GDPR.`),
184
+ note('info', 'Completo e tracciato', `A differenza del flag impostato a mano, il flusso dedicato registra anche la data e lo storico dell'accettazione.`),
185
+ ],
186
+ },
187
+ 'user-json': {
188
+ title: 'Metadata JSON',
189
+ blocks: [
190
+ p(`Campo libero JSON (UTENTI_CONFIG.JSON_METADATA) per dati applicativi del backend. Deve essere JSON valido se il backend lo interpreta.`),
191
+ ],
192
+ },
193
+ 'user-set-password': {
194
+ title: 'Imposta password',
195
+ blocks: [
196
+ p(`Imposta direttamente una nuova password locale: viene hashata dal backend e la scadenza segue la policy. Nessuna email viene inviata.`),
197
+ p(`Requisiti di sicurezza:`),
198
+ list([
199
+ `Almeno 8 caratteri (massimo 100).`,
200
+ `Almeno una lettera maiuscola e una minuscola.`,
201
+ `Almeno una cifra e un carattere speciale (es. ! ? @ # $ %).`,
202
+ `Nessuno spazio e non deve essere una password comune.`,
203
+ ]),
204
+ note('danger', 'Password non conforme', `Se non rispetta i requisiti l API risponde 400 con codice ACCESSI_WEAK_PASSWORD e l elenco dei requisiti mancanti; la password non viene salvata.`),
205
+ note('warn', 'Sostituisce la password attuale', `L'utente dovrà usare subito la nuova password. Per fargliela scegliere, usa "Invia reset password".`),
206
+ ],
207
+ },
208
+ 'user-filter-numrep': {
209
+ title: 'Numero reparto (NUMREP)',
210
+ blocks: [p(`Reparto associato all'utente nella tabella FILTRI. Vuoto rimuove il valore.`)],
211
+ },
212
+ 'user-filter-idxpers': {
213
+ title: 'Indice personale (IDXPERS)',
214
+ blocks: [p(`Indice del personale nella tabella FILTRI. Vuoto rimuove il valore.`)],
215
+ },
216
+ 'user-filter-codclisuper': {
217
+ title: 'Cliente padre (CODCLISUPER)',
218
+ blocks: [p(`Codice del cliente padre. Vuoto rimuove il valore.`)],
219
+ },
220
+ 'user-filter-codage': {
221
+ title: 'Agente (CODAGE)',
222
+ blocks: [p(`Codice dell'agente associato. Vuoto rimuove il valore.`)],
223
+ },
224
+ 'user-filter-codclicol': {
225
+ title: 'Cliente collegato (CODCLICOL)',
226
+ blocks: [p(`Codice del cliente collegato. Vuoto rimuove il valore.`)],
227
+ },
228
+ 'user-filter-codclienti': {
229
+ title: 'Clienti (CODCLIENTI)',
230
+ blocks: [p(`Elenco di codici cliente separati da virgola (testo libero). Vuoto rimuove il valore.`)],
231
+ },
232
+ 'user-filter-tipfil': {
233
+ title: 'Tipo filtro (TIPFIL)',
234
+ blocks: [p(`Tipo di filtro applicato. Vuoto rimuove il valore.`)],
235
+ },
236
+ 'user-filter-idxpos': {
237
+ title: 'Postazione (IDXPOS)',
238
+ blocks: [p(`Indice della postazione nella tabella ANTENNE_POS. Vuoto rimuove il valore.`)],
239
+ },
240
+ 'user-filter-coddip': {
241
+ title: 'Dipendente (CODDIP)',
242
+ blocks: [p(`Codice del dipendente collegato. Vuoto rimuove il valore.`)],
243
+ },
244
+ 'user-filter-codvet': {
245
+ title: 'Vettore (CODVET)',
246
+ blocks: [p(`Codice del vettore collegato. Vuoto rimuove il valore.`)],
247
+ },
248
+ 'user-super': {
249
+ title: 'Superutente (FLGSUPER)',
250
+ blocks: [
251
+ p(`Assegna il flag superutente. Un superutente riceve TUTTE le abilitazioni al livello massimo (30) dopo il login e in console vede solo la sezione Utenti, dove gestisce utenti, ruoli e grant.`),
252
+ note('warn', 'Non è un ruolo', `Il flag non sostituisce i ruoli o i grant: li amplia assegnando ogni menu attivo al livello massimo. Usalo solo per gli amministratori di Accessi.`),
253
+ note('info', 'Chi lo modifica', `Un admin può assegnare o togliere sia Admin sia Superutente; un superutente senza Admin può gestire solo il flag Superutente. La verifica è ripetuta dal backend.`),
254
+ ],
255
+ },
256
+ 'user-admin': {
257
+ title: 'Admin (FLGADMIN)',
258
+ blocks: [
259
+ p(`Assegna il flag admin. Un admin accede a tutta la console (catalogo, token di servizio, SSO e utenti) ma NON conferisce abilitazioni: i menu restano quelli assegnati via ABILITAZIONI e RUOLI_MNU.`),
260
+ note('info', 'Può gestire i flag', `Un admin può assegnare o togliere sia il flag Admin sia il flag Superutente. Un superutente senza Admin non può modificare il flag Admin.`),
261
+ ],
262
+ },
156
263
  'user-state': {
157
264
  title: 'Stato di registrazione',
158
265
  blocks: [
@@ -323,6 +430,15 @@ exports.HELP = {
323
430
  blocks: [
324
431
  p(`Esegue un soft delete: imposta lo stato di registrazione a "Eliminato" (50). L'utente non può più accedere, ma i dati restano nel database.`),
325
432
  note('info', 'Reversibile', `Non è una cancellazione fisica: puoi ripristinare l'utente cambiando lo stato di registrazione.`),
433
+ note('info', 'Chi può farlo', `Sia admin sia superutente possono eseguire il soft delete.`),
434
+ ],
435
+ },
436
+ 'user-delete-permanent': {
437
+ title: 'Elimina definitivamente',
438
+ blocks: [
439
+ p(`Cancella l'utente e tutti i record collegati (configurazione, password, ruoli, abilitazioni, filtri, identità SSO, challenge 2FA e GDPR). Operazione irreversibile.`),
440
+ note('danger', 'Non reversibile', `I dati vengono rimossi fisicamente dal database; non è possibile ripristinare l'utente.`),
441
+ note('info', 'Solo admin', `Il pulsante è mostrato e accettato solo per il flag Admin. Un superutente senza Admin può solo flaggare l'utente come eliminato.`),
326
442
  ],
327
443
  },
328
444
  // ----------------------------------------------------- selezioni di menu
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/help.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Contenuti di aiuto contestuale della console Accessi.\n *\n * Ogni voce spiega, in italiano corretto, che cosa inserire in un campo\n * tecnico e da dove prendere il valore. Sono mostrati come miniguida nel\n * tooltip aperto dall'icona \"i\" accanto al campo.\n */\nimport type { WikiBlock } from './wiki';\n\nexport interface HelpEntry {\n title: string;\n blocks: WikiBlock[];\n}\n\nconst p = (text: string): WikiBlock => ({ kind: 'p', text });\nconst list = (items: string[]): WikiBlock => ({ kind: 'list', items });\nconst code = (language: string, codeText: string, title?: string): WikiBlock => ({ kind: 'code', language, title, code: codeText });\nconst note = (tone: 'info' | 'ok' | 'warn' | 'danger', title: string, text: string): WikiBlock => ({ kind: 'callout', tone, title, text });\nconst table = (head: string[], rows: string[][]): WikiBlock => ({ kind: 'table', head, rows });\n\nexport const HELP: Record<string, HelpEntry> = {\n // ------------------------------------------------------------------ SSO\n 'sso-provider': {\n title: 'Provider SSO',\n blocks: [\n p(`La chiave del provider censito in Accessi. Deve coincidere esattamente con quella usata dal backend quando valida il login SSO e chiama FederatedAuthService.authenticate({ provider, subject }).`),\n p(`Se il backend usa la chiave azure-ad-acme-prod, qui va la stessa stringa: una differenza, anche di un carattere, fa fallire il collegamento.`),\n note('info', 'Chi crea il provider', `Prima si censisce il provider in \"SSO → Provider\" (superutente), poi lo si sceglie qui. Se l'elenco è vuoto, non ci sono provider attivi.`),\n ],\n },\n 'sso-subject': {\n title: 'ID utente del provider (subject)',\n blocks: [\n p(`È l'identificatore STABILE della persona nel provider, non l'email. Il backend lo ottiene dopo aver validato il token del provider e lo passa ad Accessi; Accessi non vede mai il token esterno.`),\n p(`Ecco il claim corretto per i provider più comuni:`),\n table(\n ['Provider', 'Claim da usare', 'Note'],\n [\n ['Azure AD / Entra ID', 'oid', 'Object ID. Non usare preferred_username né email.'],\n ['Google', 'sub', 'ID numerico di 21 cifre. Non l indirizzo email.'],\n ['Apple', 'sub', 'Identificatore stabile per la tua app; disponibile solo al primo login, va salvato subito.'],\n ['Okta', 'sub', 'Claim standard OIDC.'],\n ['Auth0', 'sub', 'Formato auth0|... oppure google-oauth2|... .'],\n ['Keycloak', 'sub', 'Claim standard OIDC.'],\n ['Microsoft personale (MSA)', 'sub', 'Account outlook/live.'],\n ['SAML 2.0', 'NameID', 'Identificatore persistente dell utente.'],\n ['OIDC generico', 'sub', 'Claim standard OIDC.'],\n ],\n ),\n note('danger', 'Mai usare l email', `L'email può cambiare e non è un identificatore stabile: usarla come subject crea duplicati e collegamenti errati.`),\n code('ts', [\n '// Nel backend, dopo aver validato il token del provider:',\n '// Azure AD / Entra ID',\n \"const subject = claims.oid;\",\n '// Google / Okta / Keycloak / OIDC generico',\n \"const subject = claims.sub;\",\n '// Apple (disponibile al primo login, salvalo subito)',\n \"const subject = claims.sub;\",\n '// SAML',\n \"const subject = assertion.nameId;\",\n ].join('\\n'), 'Come ricavare il subject'),\n ],\n },\n 'sso-note': {\n title: 'Nota',\n blocks: [\n p(`Nota interna per gli amministratori, utile a ricordare perché il collegamento esiste (per esempio \"migrato da AD il 2026-01-10\"). Non viene inviata al provider.`),\n ],\n },\n 'provider-key': {\n title: 'Chiave provider',\n blocks: [\n p(`Identificativo tecnico del provider, usato dal backend nel payload SSO. Scegli una chiave descrittiva e stabile, per esempio azure-ad-acme-prod o google-workspace-acme.`),\n note('warn', 'Immutabile', `Dopo il censimento la chiave non si modifica: identità e configurazione del backend la referenziano. Se serve cambiarla, disabilita il provider e creane uno nuovo.`),\n ],\n },\n 'provider-description': {\n title: 'Descrizione',\n blocks: [\n p(`Nome leggibile mostrato agli amministratori (per esempio \"Azure AD – Acme produzione\"). Non è la chiave tecnica: può contenere spazi.`),\n ],\n },\n 'provider-note': {\n title: 'Nota',\n blocks: [\n p(`Nota interna del catalogo. Non inserire segreti, issuer, client id o dati personali: quei valori restano nel backend.`),\n ],\n },\n 'provider-active': {\n title: 'Provider attivo',\n blocks: [\n p(`Se disattivato, il provider non accetta nuovi login e nuovi collegamenti; le identità e lo storico restano. Riattivalo quando il backend è pronto.`),\n ],\n },\n\n // --------------------------------------------------------- service token\n 'token-label': {\n title: 'Descrizione del token',\n blocks: [\n p(`Nome del token, mostrato agli amministratori (per esempio \"Integrazione IA – produzione\"). Non è un segreto.`),\n ],\n },\n 'token-scopes': {\n title: 'Scope',\n blocks: [\n p(`Etichette che il backend controlla per autorizzare le chiamate tecniche. Un token non è un superutente: abilita solo le rotte protette con ServiceTokenGuard e @RequireServiceTokenScopes.`),\n list([\n `Formato: lettere, numeri, ':', '_' o '-', massimo 40 caratteri.`,\n `Esempi: ia, chat, tools, report:read.`,\n `Separa gli scope con una virgola.`,\n ]),\n code('ts', [\n '@UseGuards(ServiceTokenGuard)',\n \"@RequireServiceTokenScopes('ia')\",\n '@Post(\"internal/ask\")',\n 'ask() { /* il token deve avere lo scope ia */ }',\n ].join('\\n'), 'Come li usa il backend'),\n note('warn', 'Scope vuoto', `Senza scope il token non soddisfa nessun @RequireServiceTokenScopes, ma passa comunque le rotte protette senza scope richiesto.`),\n ],\n },\n 'token-ttl': {\n title: 'Durata (giorni)',\n blocks: [\n p(`Giorni di validità del token. Alla scadenza il token smette di funzionare.`),\n note('danger', 'Nessuna scadenza', `Se lasci vuoto questo campo e non imposti una data, il token non scade mai: sconsigliato in produzione.`),\n ],\n },\n\n // ----------------------------------------------------------------- utenti\n 'user-email': {\n title: 'Email',\n blocks: [\n p(`Identificativo di accesso dell'utente e recapito per le email di reset o codici. Deve essere univoca.`),\n ],\n },\n 'user-name': {\n title: 'Nome e cognome',\n blocks: [\n p(`Dati anagrafici mostrati in console e restituiti nel profilo. Non incidono sull'autenticazione.`),\n ],\n },\n 'user-password-login': {\n title: 'Login con password',\n blocks: [\n p(`Se disattivato, il login con email e password viene rifiutato (PASSWORD_LOGIN_DISABLED). Restano validi i login con identità SSO attive.`),\n note('info', 'Utente solo SSO', `È l'opzione tipica per gli utenti federati: nessuna password locale, accesso solo dal provider.`),\n ],\n },\n 'user-2fa': {\n title: 'Codice via email (2FA)',\n blocks: [\n p(`Richiede un codice monouso inviato per email dopo la password o dopo il provider SSO. È per-utente e disattivata per impostazione predefinita.`),\n list([\n `Codice a 6 cifre, valido 10 minuti, 5 tentativi, massimo 3 invii.`,\n `Non sono token: fino alla verifica non esiste alcun JWT.`,\n ]),\n ],\n },\n 'user-passwordless': {\n title: 'Accesso con il solo codice email',\n blocks: [\n p(`Abilita il login senza password: si inserisce solo l'email e si usa il codice ricevuto. Richiede il codice email (2FA) attivo.`),\n note('warn', 'Non sono due fattori', `L'accesso con il solo codice è autenticazione tramite possesso della casella email: un solo fattore.`),\n ],\n },\n 'user-default-page': {\n title: 'Pagina di default',\n blocks: [\n p(`Percorso o codice della pagina verso cui indirizzare l'utente dopo il login. Esempio: /dashboard oppure la chiave di una pagina gestita dal frontend.`),\n p(`E una stringa libera (massimo 50 caratteri): la libreria la conserva e la restituisce nel profilo; l'instradamento effettivo lo decide il frontend.`),\n ],\n },\n 'user-state': {\n title: 'Stato di registrazione',\n blocks: [\n table(\n ['Stato', 'Significato'],\n [\n ['Non definito / Inserito', 'Utente non confermato.'],\n ['Invitato (10)', 'Richiede il rinnovo della password.'],\n ['Confermato (20)', 'Utente valido, può accedere.'],\n ['Eliminato (50)', 'Soft delete: login bloccato.'],\n ['Bloccato (99)', 'Login bloccato.'],\n ],\n ),\n ],\n },\n\n // ------------------------------------------------------------------ ruoli\n 'role-description': {\n title: 'Descrizione del ruolo',\n blocks: [\n p(`Nome del ruolo (per esempio \"Gestore ordini\"). Deve avere almeno un menu selezionato: il salvataggio sostituisce integralmente i menu del ruolo.`),\n ],\n },\n 'role-level': {\n title: 'Livello di abilitazione',\n blocks: [\n table(\n ['Livello', 'Valore', 'Uso tipico'],\n [\n ['Lettura', '10', 'Sola consultazione.'],\n ['Scrittura', '20', 'Modifica dei dati.'],\n ['Legacy (30)', '30', 'Valore storico, mantenuto senza perdita.'],\n ],\n ),\n p(`Il controllo confronta tipoAbilitazione >= soglia: un livello 20 soddisfa anche una richiesta di livello 10.`),\n ],\n },\n\n // --------------------------------------------------------- catalogo menu\n 'menu-code': {\n title: 'Codice menu',\n blocks: [\n p(`Chiave tecnica del menu, stabile e senza spazi (per esempio ORDINI o MNU001). È la chiave primaria: non si modifica dopo la creazione.`),\n note('warn', 'Immutabile', `Il codice è referenziato da ruoli e grant: per cambiarlo, elimina e ricrea il menu.`),\n ],\n },\n 'menu-group-code': {\n title: 'Codice gruppo',\n blocks: [\n p(`Un solo carattere (per esempio A). Raggruppa i menu nella navigazione. Immutabile dopo la creazione.`),\n ],\n },\n 'menu-type-code': {\n title: 'Codice tipo menu',\n blocks: [\n p(`Un solo carattere (per esempio X). Classifica i menu (amministrazione, operativo, ...). Immutabile dopo la creazione.`),\n ],\n },\n 'menu-group-order': {\n title: 'Ordine del gruppo',\n blocks: [\n p(`Numero che determina l'ordine dei gruppi nella navigazione: valori più bassi compaiono prima.`),\n ],\n },\n 'menu-order': {\n title: 'Ordine del menu',\n blocks: [\n p(`Numero che determina l'ordine dei menu all'interno del gruppo: valori più bassi compaiono prima.`),\n ],\n },\n 'menu-page': {\n title: 'Pagina',\n blocks: [\n p(`Percorso o nome della pagina del frontend associata al menu (per esempio /ordini). È informativo: lo usano la UI host e i client.`),\n ],\n },\n 'menu-icon': {\n title: 'Icona',\n blocks: [\n p(`Identificatore dell'icona usato dalla UI host (per esempio fa-box o un nome concordato). Accessi non impone un set di icone.`),\n ],\n },\n 'menu-rifmenu': {\n title: 'Menu di riferimento',\n blocks: [\n p(`Codice di un altro menu che fa da padre, per costruire gerarchie di menu. Lascia vuoto per un menu di primo livello.`),\n ],\n },\n 'menu-note': {\n title: 'Nota',\n blocks: [\n p(`Nota descrittiva mostrata agli amministratori. Non incide sui permessi.`),\n ],\n },\n 'menu-enabled': {\n title: 'Menu abilitato',\n blocks: [\n p(`Se disattivato, il menu non compare nel catalogo attivo e non viene considerato nel calcolo dei grant. I collegamenti a ruoli e utenti restano.`),\n ],\n },\n 'menu-group-enabled': {\n title: 'Gruppo abilitato',\n blocks: [\n p(`Disattiva l'intero gruppo: i menu al suo interno non sono considerati attivi, ma restano configurabili per una riattivazione futura.`),\n ],\n },\n\n // ----------------------------------------------------------------- filtri\n 'filter-type-code': {\n title: 'Codice tipo filtro',\n blocks: [\n p(`Numero identificativo del tipo filtro. È la chiave primaria: non si modifica dopo la creazione.`),\n ],\n },\n 'filter-type-field': {\n title: 'Campo',\n blocks: [\n p(`Nome della colonna applicativa della tabella FILTRI a cui il tipo è associato (per esempio CODCLI). Deve esistere nello schema, altrimenti i filtri che lo usano vengono rifiutati.`),\n ],\n },\n 'filter-type-enabled': {\n title: 'Tipo filtro abilitato',\n blocks: [\n p(`Se disattivato, il tipo non è proposto ai client, ma i filtri già salvati restano nel database.`),\n ],\n },\n 'filters-json': {\n title: 'Filtro JSON',\n blocks: [\n p(`Rappresentazione JSON dei filtri applicativi dell'utente. Usa \"Carica\" per partire dalla struttura esistente, modifica i valori e poi \"Salva\".`),\n note('info', 'Campi ammessi', `Sono accettati solo i campi mappati nello schema (FILTRI_UTENTE_DB_MAPPING). Un campo non configurato viene rifiutato con un errore esplicito.`),\n ],\n },\n 'filters-user': {\n title: 'Utente',\n blocks: [\n p(`Utente a cui appartengono i filtri. Selezionalo prima di caricare o salvare: i filtri sono sempre per singolo utente.`),\n ],\n },\n\n // ------------------------------------------------------------ assegnazioni\n 'role-assignment': {\n title: 'Assegnazione dei ruoli',\n blocks: [\n p(`Il salvataggio SOSTITUISCE integralmente i ruoli dell'utente: la lista selezionata diventa l'unico set di ruoli.`),\n list([\n `Per aggiungere un ruolo, selezionalo mantenendo quelli già presenti.`,\n `Per rimuovere un ruolo, deselezionalo.`,\n `Non modificare i grant diretti: quelli si gestiscono nella scheda \"Grant diretti\".`,\n ]),\n note('warn', 'Non è incrementale', `Inviare solo il nuovo ruolo rimuove gli altri. Invia sempre la lista completa desiderata.`),\n ],\n },\n 'grant-direct': {\n title: 'Grant diretti',\n blocks: [\n p(`Permessi assegnati direttamente all'utente, indipendenti dai ruoli. Hanno precedenza sui permessi ereditati dai ruoli per lo stesso menu.`),\n list([\n `Imposta il livello per concedere l'accesso.`,\n `Scegli \"nessuno\" per rimuovere il grant diretto.`,\n `Il salvataggio sostituisce l'intero set di grant diretti.`,\n ]),\n ],\n },\n 'grant-level': {\n title: 'Livello di grant',\n blocks: [\n table(\n ['Voce', 'Valore', 'Significato'],\n [\n ['nessuno', '—', 'Nessun grant diretto per quel menu (il permesso può arrivare dai ruoli).'],\n ['Lettura', '10', 'Sola consultazione.'],\n ['Scrittura', '20', 'Modifica dei dati.'],\n ],\n ),\n p(`Il confronto è tipoAbilitazione >= soglia richiesta dalla rotta.`),\n ],\n },\n 'user-delete': {\n title: 'Imposta stato eliminato',\n blocks: [\n p(`Esegue un soft delete: imposta lo stato di registrazione a \"Eliminato\" (50). L'utente non può più accedere, ma i dati restano nel database.`),\n note('info', 'Reversibile', `Non è una cancellazione fisica: puoi ripristinare l'utente cambiando lo stato di registrazione.`),\n ],\n },\n\n // ----------------------------------------------------- selezioni di menu\n 'menu-group-select': {\n title: 'Gruppo',\n blocks: [\n p(`Gruppo di appartenenza del menu. Se l'elenco è vuoto, crea prima un gruppo in \"Menu e gruppi → Gruppi\".`),\n ],\n },\n 'menu-type-select': {\n title: 'Tipo menu',\n blocks: [\n p(`Classificazione del menu (amministrazione, operativo, ...). È facoltativa: se non serve, lascia \"Nessun tipo\". I tipi si gestiscono in \"Menu e gruppi → Tipi menu\".`),\n ],\n },\n\n // ------------------------------------------------------------------ login\n 'login-email': {\n title: 'Email o utente',\n blocks: [\n p(`Indirizzo email dell'utente Accessi. Se l'account è abilitato al solo codice, dopo questo passo riceverai un codice via email invece di inserire la password.`),\n ],\n },\n 'login-password': {\n title: 'Password',\n blocks: [\n p(`Password locale dell'utente. Non serve per gli account passwordless, che accedono con il solo codice email.`),\n ],\n },\n};\n"]}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/help.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Contenuti di aiuto contestuale della console Accessi.\n *\n * Ogni voce spiega, in italiano corretto, che cosa inserire in un campo\n * tecnico e da dove prendere il valore. Sono mostrati come miniguida nel\n * tooltip aperto dall'icona \"i\" accanto al campo.\n */\nimport type { WikiBlock } from './wiki';\n\nexport interface HelpEntry {\n title: string;\n blocks: WikiBlock[];\n}\n\nconst p = (text: string): WikiBlock => ({ kind: 'p', text });\nconst list = (items: string[]): WikiBlock => ({ kind: 'list', items });\nconst code = (language: string, codeText: string, title?: string): WikiBlock => ({ kind: 'code', language, title, code: codeText });\nconst note = (tone: 'info' | 'ok' | 'warn' | 'danger', title: string, text: string): WikiBlock => ({ kind: 'callout', tone, title, text });\nconst table = (head: string[], rows: string[][]): WikiBlock => ({ kind: 'table', head, rows });\n\nexport const HELP: Record<string, HelpEntry> = {\n // ------------------------------------------------------------------ SSO\n 'sso-provider': {\n title: 'Provider SSO',\n blocks: [\n p(`La chiave del provider censito in Accessi. Deve coincidere esattamente con quella usata dal backend quando valida il login SSO e chiama FederatedAuthService.authenticate({ provider, subject }).`),\n p(`Se il backend usa la chiave azure-ad-acme-prod, qui va la stessa stringa: una differenza, anche di un carattere, fa fallire il collegamento.`),\n note('info', 'Chi crea il provider', `Prima si censisce il provider in \"SSO → Provider\" (superutente), poi lo si sceglie qui. Se l'elenco è vuoto, non ci sono provider attivi.`),\n ],\n },\n 'sso-subject': {\n title: 'ID utente del provider (subject)',\n blocks: [\n p(`È l'identificatore STABILE della persona nel provider, non l'email. Il backend lo ottiene dopo aver validato il token del provider e lo passa ad Accessi; Accessi non vede mai il token esterno.`),\n p(`Ecco il claim corretto per i provider più comuni:`),\n table(\n ['Provider', 'Claim da usare', 'Note'],\n [\n ['Azure AD / Entra ID', 'oid', 'Object ID. Non usare preferred_username né email.'],\n ['Google', 'sub', 'ID numerico di 21 cifre. Non l indirizzo email.'],\n ['Apple', 'sub', 'Identificatore stabile per la tua app; disponibile solo al primo login, va salvato subito.'],\n ['Okta', 'sub', 'Claim standard OIDC.'],\n ['Auth0', 'sub', 'Formato auth0|... oppure google-oauth2|... .'],\n ['Keycloak', 'sub', 'Claim standard OIDC.'],\n ['Microsoft personale (MSA)', 'sub', 'Account outlook/live.'],\n ['SAML 2.0', 'NameID', 'Identificatore persistente dell utente.'],\n ['OIDC generico', 'sub', 'Claim standard OIDC.'],\n ],\n ),\n note('danger', 'Mai usare l email', `L'email può cambiare e non è un identificatore stabile: usarla come subject crea duplicati e collegamenti errati.`),\n code('ts', [\n '// Nel backend, dopo aver validato il token del provider:',\n '// Azure AD / Entra ID',\n \"const subject = claims.oid;\",\n '// Google / Okta / Keycloak / OIDC generico',\n \"const subject = claims.sub;\",\n '// Apple (disponibile al primo login, salvalo subito)',\n \"const subject = claims.sub;\",\n '// SAML',\n \"const subject = assertion.nameId;\",\n ].join('\\n'), 'Come ricavare il subject'),\n ],\n },\n 'sso-note': {\n title: 'Nota',\n blocks: [\n p(`Nota interna per gli amministratori, utile a ricordare perché il collegamento esiste (per esempio \"migrato da AD il 2026-01-10\"). Non viene inviata al provider.`),\n ],\n },\n 'provider-key': {\n title: 'Chiave provider',\n blocks: [\n p(`Identificativo tecnico del provider, usato dal backend nel payload SSO. Scegli una chiave descrittiva e stabile, per esempio azure-ad-acme-prod o google-workspace-acme.`),\n note('warn', 'Immutabile', `Dopo il censimento la chiave non si modifica: identità e configurazione del backend la referenziano. Se serve cambiarla, disabilita il provider e creane uno nuovo.`),\n ],\n },\n 'provider-description': {\n title: 'Descrizione',\n blocks: [\n p(`Nome leggibile mostrato agli amministratori (per esempio \"Azure AD – Acme produzione\"). Non è la chiave tecnica: può contenere spazi.`),\n ],\n },\n 'provider-note': {\n title: 'Nota',\n blocks: [\n p(`Nota interna del catalogo. Non inserire segreti, issuer, client id o dati personali: quei valori restano nel backend.`),\n ],\n },\n 'provider-active': {\n title: 'Provider attivo',\n blocks: [\n p(`Se disattivato, il provider non accetta nuovi login e nuovi collegamenti; le identità e lo storico restano. Riattivalo quando il backend è pronto.`),\n ],\n },\n\n // --------------------------------------------------------- service token\n 'token-label': {\n title: 'Descrizione del token',\n blocks: [\n p(`Nome del token, mostrato agli amministratori (per esempio \"Integrazione IA – produzione\"). Non è un segreto.`),\n ],\n },\n 'token-scopes': {\n title: 'Scope',\n blocks: [\n p(`Etichette che il backend controlla per autorizzare le chiamate tecniche. Un token non è un superutente: abilita solo le rotte protette con ServiceTokenGuard e @RequireServiceTokenScopes.`),\n list([\n `Formato: lettere, numeri, ':', '_' o '-', massimo 40 caratteri.`,\n `Esempi: ia, chat, tools, report:read.`,\n `Separa gli scope con una virgola.`,\n ]),\n code('ts', [\n '@UseGuards(ServiceTokenGuard)',\n \"@RequireServiceTokenScopes('ia')\",\n '@Post(\"internal/ask\")',\n 'ask() { /* il token deve avere lo scope ia */ }',\n ].join('\\n'), 'Come li usa il backend'),\n note('warn', 'Scope vuoto', `Senza scope il token non soddisfa nessun @RequireServiceTokenScopes, ma passa comunque le rotte protette senza scope richiesto.`),\n ],\n },\n 'token-ttl': {\n title: 'Durata (giorni)',\n blocks: [\n p(`Giorni di validità del token. Alla scadenza il token smette di funzionare.`),\n note('danger', 'Nessuna scadenza', `Se lasci vuoto questo campo e non imposti una data, il token non scade mai: sconsigliato in produzione.`),\n ],\n },\n\n // ----------------------------------------------------------------- utenti\n 'user-email': {\n title: 'Email',\n blocks: [\n p(`Identificativo di accesso dell'utente e recapito per le email di reset o codici. Deve essere univoca.`),\n ],\n },\n 'user-name': {\n title: 'Nome e cognome',\n blocks: [\n p(`Dati anagrafici mostrati in console e restituiti nel profilo. Non incidono sull'autenticazione.`),\n ],\n },\n 'user-password-login': {\n title: 'Login con password',\n blocks: [\n p(`Se disattivato, il login con email e password viene rifiutato (PASSWORD_LOGIN_DISABLED). Restano validi i login con identità SSO attive.`),\n note('info', 'Utente solo SSO', `È l'opzione tipica per gli utenti federati: nessuna password locale, accesso solo dal provider.`),\n ],\n },\n 'user-2fa': {\n title: 'Codice via email (2FA)',\n blocks: [\n p(`Richiede un codice monouso inviato per email dopo la password o dopo il provider SSO. È per-utente e disattivata per impostazione predefinita.`),\n list([\n `Codice a 6 cifre, valido 10 minuti, 5 tentativi, massimo 3 invii.`,\n `Non sono token: fino alla verifica non esiste alcun JWT.`,\n ]),\n ],\n },\n 'user-passwordless': {\n title: 'Accesso con il solo codice email',\n blocks: [\n p(`Abilita il login senza password: si inserisce solo l'email e si usa il codice ricevuto. Richiede il codice email (2FA) attivo.`),\n note('warn', 'Non sono due fattori', `L'accesso con il solo codice è autenticazione tramite possesso della casella email: un solo fattore.`),\n ],\n },\n 'user-default-page': {\n title: 'Pagina di default',\n blocks: [\n p(`Percorso o codice della pagina verso cui indirizzare l'utente dopo il login. Esempio: /dashboard oppure la chiave di una pagina gestita dal frontend.`),\n p(`E una stringa libera (massimo 50 caratteri): la libreria la conserva e la restituisce nel profilo; l'instradamento effettivo lo decide il frontend.`),\n ],\n },\n 'user-cellulare': {\n title: 'Cellulare',\n blocks: [\n p(`Numero di cellulare dell'utente (UTENTI_CONFIG.CELLULARE). È il recapito canonico per SMS o notifiche applicative; Accessi non lo invia da solo.`),\n ],\n },\n 'user-lingua': {\n title: 'Codice lingua',\n blocks: [\n p(`Lingua preferita dell'utente (UTENTI_CONFIG.CODLINGUA). Stringa breve come it, en, sl; viene restituita nel profilo e il frontend decide come usarla.`),\n ],\n },\n 'user-avatar': {\n title: 'Avatar',\n blocks: [\n p(`Riferimento all'avatar (UTENTI_CONFIG.AVATAR, massimo 30 caratteri): tipicamente un nome file o una chiave, non un base64.`),\n ],\n },\n 'user-scadenza-password': {\n title: 'Scadenza password',\n blocks: [\n p(`Data di scadenza della password (UTENTI.DATSCAPWD). Lascia vuoto per non forzare una scadenza; usa una data passata per richiedere il cambio al prossimo login, se la policy è attiva.`),\n ],\n },\n 'user-gdpr': {\n title: 'Consenso GDPR',\n blocks: [\n p(`Lo stato mostra se il consenso è registrato. Il pulsante \"Registra consenso GDPR\" (endpoint set-gdpr) imposta FLGGDPR e DATGDPR e scrive la riga storica in UTENTI_GDPR.`),\n note('info', 'Completo e tracciato', `A differenza del flag impostato a mano, il flusso dedicato registra anche la data e lo storico dell'accettazione.`),\n ],\n },\n 'user-json': {\n title: 'Metadata JSON',\n blocks: [\n p(`Campo libero JSON (UTENTI_CONFIG.JSON_METADATA) per dati applicativi del backend. Deve essere JSON valido se il backend lo interpreta.`),\n ],\n },\n 'user-set-password': {\n title: 'Imposta password',\n blocks: [\n p(`Imposta direttamente una nuova password locale: viene hashata dal backend e la scadenza segue la policy. Nessuna email viene inviata.`),\n p(`Requisiti di sicurezza:`),\n list([\n `Almeno 8 caratteri (massimo 100).`,\n `Almeno una lettera maiuscola e una minuscola.`,\n `Almeno una cifra e un carattere speciale (es. ! ? @ # $ %).`,\n `Nessuno spazio e non deve essere una password comune.`,\n ]),\n note('danger', 'Password non conforme', `Se non rispetta i requisiti l API risponde 400 con codice ACCESSI_WEAK_PASSWORD e l elenco dei requisiti mancanti; la password non viene salvata.`),\n note('warn', 'Sostituisce la password attuale', `L'utente dovrà usare subito la nuova password. Per fargliela scegliere, usa \"Invia reset password\".`),\n ],\n },\n 'user-filter-numrep': {\n title: 'Numero reparto (NUMREP)',\n blocks: [ p(`Reparto associato all'utente nella tabella FILTRI. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-idxpers': {\n title: 'Indice personale (IDXPERS)',\n blocks: [ p(`Indice del personale nella tabella FILTRI. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-codclisuper': {\n title: 'Cliente padre (CODCLISUPER)',\n blocks: [ p(`Codice del cliente padre. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-codage': {\n title: 'Agente (CODAGE)',\n blocks: [ p(`Codice dell'agente associato. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-codclicol': {\n title: 'Cliente collegato (CODCLICOL)',\n blocks: [ p(`Codice del cliente collegato. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-codclienti': {\n title: 'Clienti (CODCLIENTI)',\n blocks: [ p(`Elenco di codici cliente separati da virgola (testo libero). Vuoto rimuove il valore.`) ],\n },\n 'user-filter-tipfil': {\n title: 'Tipo filtro (TIPFIL)',\n blocks: [ p(`Tipo di filtro applicato. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-idxpos': {\n title: 'Postazione (IDXPOS)',\n blocks: [ p(`Indice della postazione nella tabella ANTENNE_POS. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-coddip': {\n title: 'Dipendente (CODDIP)',\n blocks: [ p(`Codice del dipendente collegato. Vuoto rimuove il valore.`) ],\n },\n 'user-filter-codvet': {\n title: 'Vettore (CODVET)',\n blocks: [ p(`Codice del vettore collegato. Vuoto rimuove il valore.`) ],\n },\n 'user-super': {\n title: 'Superutente (FLGSUPER)',\n blocks: [\n p(`Assegna il flag superutente. Un superutente riceve TUTTE le abilitazioni al livello massimo (30) dopo il login e in console vede solo la sezione Utenti, dove gestisce utenti, ruoli e grant.`),\n note('warn', 'Non è un ruolo', `Il flag non sostituisce i ruoli o i grant: li amplia assegnando ogni menu attivo al livello massimo. Usalo solo per gli amministratori di Accessi.`),\n note('info', 'Chi lo modifica', `Un admin può assegnare o togliere sia Admin sia Superutente; un superutente senza Admin può gestire solo il flag Superutente. La verifica è ripetuta dal backend.`),\n ],\n },\n 'user-admin': {\n title: 'Admin (FLGADMIN)',\n blocks: [\n p(`Assegna il flag admin. Un admin accede a tutta la console (catalogo, token di servizio, SSO e utenti) ma NON conferisce abilitazioni: i menu restano quelli assegnati via ABILITAZIONI e RUOLI_MNU.`),\n note('info', 'Può gestire i flag', `Un admin può assegnare o togliere sia il flag Admin sia il flag Superutente. Un superutente senza Admin non può modificare il flag Admin.`),\n ],\n },\n 'user-state': {\n title: 'Stato di registrazione',\n blocks: [\n table(\n ['Stato', 'Significato'],\n [\n ['Non definito / Inserito', 'Utente non confermato.'],\n ['Invitato (10)', 'Richiede il rinnovo della password.'],\n ['Confermato (20)', 'Utente valido, può accedere.'],\n ['Eliminato (50)', 'Soft delete: login bloccato.'],\n ['Bloccato (99)', 'Login bloccato.'],\n ],\n ),\n ],\n },\n\n // ------------------------------------------------------------------ ruoli\n 'role-description': {\n title: 'Descrizione del ruolo',\n blocks: [\n p(`Nome del ruolo (per esempio \"Gestore ordini\"). Deve avere almeno un menu selezionato: il salvataggio sostituisce integralmente i menu del ruolo.`),\n ],\n },\n 'role-level': {\n title: 'Livello di abilitazione',\n blocks: [\n table(\n ['Livello', 'Valore', 'Uso tipico'],\n [\n ['Lettura', '10', 'Sola consultazione.'],\n ['Scrittura', '20', 'Modifica dei dati.'],\n ['Legacy (30)', '30', 'Valore storico, mantenuto senza perdita.'],\n ],\n ),\n p(`Il controllo confronta tipoAbilitazione >= soglia: un livello 20 soddisfa anche una richiesta di livello 10.`),\n ],\n },\n\n // --------------------------------------------------------- catalogo menu\n 'menu-code': {\n title: 'Codice menu',\n blocks: [\n p(`Chiave tecnica del menu, stabile e senza spazi (per esempio ORDINI o MNU001). È la chiave primaria: non si modifica dopo la creazione.`),\n note('warn', 'Immutabile', `Il codice è referenziato da ruoli e grant: per cambiarlo, elimina e ricrea il menu.`),\n ],\n },\n 'menu-group-code': {\n title: 'Codice gruppo',\n blocks: [\n p(`Un solo carattere (per esempio A). Raggruppa i menu nella navigazione. Immutabile dopo la creazione.`),\n ],\n },\n 'menu-type-code': {\n title: 'Codice tipo menu',\n blocks: [\n p(`Un solo carattere (per esempio X). Classifica i menu (amministrazione, operativo, ...). Immutabile dopo la creazione.`),\n ],\n },\n 'menu-group-order': {\n title: 'Ordine del gruppo',\n blocks: [\n p(`Numero che determina l'ordine dei gruppi nella navigazione: valori più bassi compaiono prima.`),\n ],\n },\n 'menu-order': {\n title: 'Ordine del menu',\n blocks: [\n p(`Numero che determina l'ordine dei menu all'interno del gruppo: valori più bassi compaiono prima.`),\n ],\n },\n 'menu-page': {\n title: 'Pagina',\n blocks: [\n p(`Percorso o nome della pagina del frontend associata al menu (per esempio /ordini). È informativo: lo usano la UI host e i client.`),\n ],\n },\n 'menu-icon': {\n title: 'Icona',\n blocks: [\n p(`Identificatore dell'icona usato dalla UI host (per esempio fa-box o un nome concordato). Accessi non impone un set di icone.`),\n ],\n },\n 'menu-rifmenu': {\n title: 'Menu di riferimento',\n blocks: [\n p(`Codice di un altro menu che fa da padre, per costruire gerarchie di menu. Lascia vuoto per un menu di primo livello.`),\n ],\n },\n 'menu-note': {\n title: 'Nota',\n blocks: [\n p(`Nota descrittiva mostrata agli amministratori. Non incide sui permessi.`),\n ],\n },\n 'menu-enabled': {\n title: 'Menu abilitato',\n blocks: [\n p(`Se disattivato, il menu non compare nel catalogo attivo e non viene considerato nel calcolo dei grant. I collegamenti a ruoli e utenti restano.`),\n ],\n },\n 'menu-group-enabled': {\n title: 'Gruppo abilitato',\n blocks: [\n p(`Disattiva l'intero gruppo: i menu al suo interno non sono considerati attivi, ma restano configurabili per una riattivazione futura.`),\n ],\n },\n\n // ----------------------------------------------------------------- filtri\n 'filter-type-code': {\n title: 'Codice tipo filtro',\n blocks: [\n p(`Numero identificativo del tipo filtro. È la chiave primaria: non si modifica dopo la creazione.`),\n ],\n },\n 'filter-type-field': {\n title: 'Campo',\n blocks: [\n p(`Nome della colonna applicativa della tabella FILTRI a cui il tipo è associato (per esempio CODCLI). Deve esistere nello schema, altrimenti i filtri che lo usano vengono rifiutati.`),\n ],\n },\n 'filter-type-enabled': {\n title: 'Tipo filtro abilitato',\n blocks: [\n p(`Se disattivato, il tipo non è proposto ai client, ma i filtri già salvati restano nel database.`),\n ],\n },\n 'filters-json': {\n title: 'Filtro JSON',\n blocks: [\n p(`Rappresentazione JSON dei filtri applicativi dell'utente. Usa \"Carica\" per partire dalla struttura esistente, modifica i valori e poi \"Salva\".`),\n note('info', 'Campi ammessi', `Sono accettati solo i campi mappati nello schema (FILTRI_UTENTE_DB_MAPPING). Un campo non configurato viene rifiutato con un errore esplicito.`),\n ],\n },\n 'filters-user': {\n title: 'Utente',\n blocks: [\n p(`Utente a cui appartengono i filtri. Selezionalo prima di caricare o salvare: i filtri sono sempre per singolo utente.`),\n ],\n },\n\n // ------------------------------------------------------------ assegnazioni\n 'role-assignment': {\n title: 'Assegnazione dei ruoli',\n blocks: [\n p(`Il salvataggio SOSTITUISCE integralmente i ruoli dell'utente: la lista selezionata diventa l'unico set di ruoli.`),\n list([\n `Per aggiungere un ruolo, selezionalo mantenendo quelli già presenti.`,\n `Per rimuovere un ruolo, deselezionalo.`,\n `Non modificare i grant diretti: quelli si gestiscono nella scheda \"Grant diretti\".`,\n ]),\n note('warn', 'Non è incrementale', `Inviare solo il nuovo ruolo rimuove gli altri. Invia sempre la lista completa desiderata.`),\n ],\n },\n 'grant-direct': {\n title: 'Grant diretti',\n blocks: [\n p(`Permessi assegnati direttamente all'utente, indipendenti dai ruoli. Hanno precedenza sui permessi ereditati dai ruoli per lo stesso menu.`),\n list([\n `Imposta il livello per concedere l'accesso.`,\n `Scegli \"nessuno\" per rimuovere il grant diretto.`,\n `Il salvataggio sostituisce l'intero set di grant diretti.`,\n ]),\n ],\n },\n 'grant-level': {\n title: 'Livello di grant',\n blocks: [\n table(\n ['Voce', 'Valore', 'Significato'],\n [\n ['nessuno', '—', 'Nessun grant diretto per quel menu (il permesso può arrivare dai ruoli).'],\n ['Lettura', '10', 'Sola consultazione.'],\n ['Scrittura', '20', 'Modifica dei dati.'],\n ],\n ),\n p(`Il confronto è tipoAbilitazione >= soglia richiesta dalla rotta.`),\n ],\n },\n 'user-delete': {\n title: 'Imposta stato eliminato',\n blocks: [\n p(`Esegue un soft delete: imposta lo stato di registrazione a \"Eliminato\" (50). L'utente non può più accedere, ma i dati restano nel database.`),\n note('info', 'Reversibile', `Non è una cancellazione fisica: puoi ripristinare l'utente cambiando lo stato di registrazione.`),\n note('info', 'Chi può farlo', `Sia admin sia superutente possono eseguire il soft delete.`),\n ],\n },\n 'user-delete-permanent': {\n title: 'Elimina definitivamente',\n blocks: [\n p(`Cancella l'utente e tutti i record collegati (configurazione, password, ruoli, abilitazioni, filtri, identità SSO, challenge 2FA e GDPR). Operazione irreversibile.`),\n note('danger', 'Non reversibile', `I dati vengono rimossi fisicamente dal database; non è possibile ripristinare l'utente.`),\n note('info', 'Solo admin', `Il pulsante è mostrato e accettato solo per il flag Admin. Un superutente senza Admin può solo flaggare l'utente come eliminato.`),\n ],\n },\n\n // ----------------------------------------------------- selezioni di menu\n 'menu-group-select': {\n title: 'Gruppo',\n blocks: [\n p(`Gruppo di appartenenza del menu. Se l'elenco è vuoto, crea prima un gruppo in \"Menu e gruppi → Gruppi\".`),\n ],\n },\n 'menu-type-select': {\n title: 'Tipo menu',\n blocks: [\n p(`Classificazione del menu (amministrazione, operativo, ...). È facoltativa: se non serve, lascia \"Nessun tipo\". I tipi si gestiscono in \"Menu e gruppi → Tipi menu\".`),\n ],\n },\n\n // ------------------------------------------------------------------ login\n 'login-email': {\n title: 'Email o utente',\n blocks: [\n p(`Indirizzo email dell'utente Accessi. Se l'account è abilitato al solo codice, dopo questo passo riceverai un codice via email invece di inserire la password.`),\n ],\n },\n 'login-password': {\n title: 'Password',\n blocks: [\n p(`Password locale dell'utente. Non serve per gli account passwordless, che accedono con il solo codice email.`),\n ],\n },\n};\n"]}
@@ -303,6 +303,7 @@ exports.WIKI_SECTIONS = [
303
303
  blocks: [
304
304
  code('http', `POST /api/accessi/email/send-reset-password-email\n{ "email": "utente@example.com" }\n\nPOST /api/accessi/auth/confirm-reset-password/{token}\n{ "newPassword": "NuovaSegreta123!" }`, 'Reset in due passi'),
305
305
  p(`L'invio non rivela se l'email esiste (anti-enumerazione). Il token di reset è monouso ed è firmato con una chiave dedicata.`),
306
+ note('warn', `Policy password (solo quando si imposta)`, `Reset, set-password admin e bootstrap richiedono almeno 8 caratteri con maiuscola, minuscola, cifra e carattere speciale, senza spazi e non comuni. Se non conforme l'API risponde 400 con code ACCESSI_WEAK_PASSWORD e l'elenco dei requisiti in details. La policy NON si applica al login: le password preesistenti eventualmente deboli continuano ad autenticare e vengono migrate senza blocco.`),
306
307
  note('info', `Pagina personalizzata`, `Imposta customResetPage per usare la tua pagina di reset invece di quella inclusa. confirmationEmailReturnUrl e confirmationEmailPrefix controllano il ritorno.`),
307
308
  ],
308
309
  },
@@ -394,11 +395,17 @@ exports.WIKI_SECTIONS = [
394
395
  ['GET', '/api/accessi/user/get-users', 'Elenco con paginazione (limit e offset, header X-Total-Count).'],
395
396
  ['POST', '/api/accessi/user/create-managed-user', 'Crea un utente locale e invia il reset password.'],
396
397
  ['PUT', '/api/accessi/user/update-user/:codiceUtente', 'Aggiorna profilo e policy (campi privilegiati solo superutente).'],
397
- ['DELETE', '/api/accessi/user/delete-user/:codiceUtente', 'Soft delete: STAREG=DELETE.'],
398
+ ['DELETE', '/api/accessi/user/delete-user/:codiceUtente', 'Soft delete: STAREG=DELETE. Admin o superutente.'],
399
+ ['DELETE', '/api/accessi/user/delete-user-permanent/:codiceUtente', 'Eliminazione definitiva: rimuove utente e record collegati. Solo admin.'],
400
+ ['POST', '/api/accessi/user/set-password/:codiceUtente', 'Imposta direttamente la password: hash lato backend e scadenza secondo policy, nessuna email.'],
398
401
  ['POST', '/api/accessi/user/set-stato', 'Imposta lo stato di registrazione.'],
399
402
  ['PATCH', '/api/accessi/user/set-gdpr/:codiceUtente', 'Registra il consenso GDPR.'],
400
403
  ['POST', '/api/accessi/user/register', 'Registrazione pubblica, solo se publicRegistration.enabled.'],
401
404
  ]),
405
+ note('warn', `Eliminazione: soft o definitiva`, `Il soft delete (STAREG=DELETE) è disponibile per admin e superutenti ed è reversibile. L'eliminazione definitiva rimuove utente e record collegati in transazione ed è riservata agli admin; il superutente senza flag Admin può solo flaggare l'utente come eliminato. Se l'utente ha dati collegati in altre tabelle (per esempio campi estesi del backend) l'eliminazione definitiva fallisce con code ACCESSI_USER_DELETE_HAS_REFERENCES e messaggio esplicito: usa allora il soft delete.`),
406
+ note('ok', `Creazione con invito atomica`, `La creazione utente con invio email è atomica: se SMTP non è configurato si fallisce prima di scrivere, e se l'invio fallisce l'utente creato viene annullato (codice ACCESSI_USER_INVITE_EMAIL_FAILED). Non restano utenti senza password. In alternativa un admin crea l'utente e imposta la password dal form dedicato.`),
407
+ note('ok', `Admin: controllo completo del profilo`, `Dalla scheda utente un admin modifica tutti i campi Accessi: anagrafica, cellulare, lingua, avatar, pagina di default, metadata JSON, 2FA/passwordless/login con password, flag, GDPR, stato registrazione, scadenza password e filtri (tabella FILTRI). La password si imposta direttamente con set-password. Le scritture sono idempotenti (UPDATE OR INSERT su UTENTI_CONFIG) e verificate dal backend; non serve accedere al database.`),
408
+ note('info', `Consenso GDPR`, `Il pulsante "Registra consenso GDPR" completa il processo: imposta FLGGDPR e DATGDPR e scrive la riga storica in UTENTI_GDPR (endpoint set-gdpr). Anche impostare flagGdpr via update-user completa il processo con la stessa riga storica.`),
402
409
  good('ts', [
403
410
  "await fetch('/api/accessi/user/create-managed-user', {",
404
411
  " method: 'POST',",
@@ -596,9 +603,13 @@ exports.WIKI_SECTIONS = [
596
603
  `SQL: esporta il DDL delle entità Accessi (tabelle, generatori, FK, indici, check, trigger) per replicare il database.`,
597
604
  ]),
598
605
  note('info', `Superutente (FLGSUPER)`, `Riceve TUTTE le abilitazioni al livello massimo (30) dopo il login. In console vede solo la sezione Utenti e gestisce utenti, ruoli e grant.`),
599
- note('info', `Admin (FLGADMIN)`, `Accede a tutta la console (catalogo, token, SSO, utenti) ma NON conferisce abilitazioni: i menu restano quelli assegnati via ABILITAZIONI/RUOLI_MNU.`),
606
+ note('info', `Admin (FLGADMIN)`, `Accede a tutta la console (catalogo, token, SSO, utenti) ma NON conferisce abilitazioni: i menu restano quelli assegnati via ABILITAZIONI/RUOLI_MNU. Gerarchia: ADMIN > SUPER > utente.`),
607
+ note('info', `Gerarchia dei ruoli`, `Vale ADMIN (2) > SUPER (1) > utente comune (0). Un attore può gestire solo utenti di rango pari o inferiore: un superutente può amministrare totalmente utenti comuni e superutenti (profilo, password, flag, ruoli, grant, stato, eliminazione, filtri e identità/utenti SSO) ma NON può toccare un admin. Un admin può gestire chiunque. La regola è imposta dal backend (ensureCanManageTargetUser): un tentativo non consentito restituisce 403.`),
608
+ note('info', `Gestione dei flag`, `Dalla scheda utente i flag sono mostrati in base al ruolo di chi è connesso: un admin può assegnare o togliere sia il flag Admin sia il flag Superutente; un superutente senza flag Admin può gestire solo il flag Superutente. I flag si impostano anche in creazione (utente locale o SSO).`),
609
+ note('warn', `Ultimo admin`, `Per non restare chiusi fuori dalla console, l'ultimo admin attivo non può essere disattivato, bloccato, eliminato né privato del flag Admin: l'operazione restituisce 400 finché non viene promosso un altro admin.`),
600
610
  note('info', `Accesso`, `Apri /api/accessi/console e accedi con un utente con FLGSUPER o FLGADMIN. Le sezioni sono raggiungibili anche tramite deep link (per esempio /api/accessi/console/menu-e-gruppi/menu).`),
601
611
  note('info', `Bootstrap admin`, `Con adminBootstrap.enabled il backend stampa a ogni avvio un token casuale (monouso, valido fino al riavvio). Nella schermata di login della console trovi "Crea utente admin": incolla il token e crea il primo admin senza email di conferma. La password è opzionale: se assente viene generata e mostrata una sola volta.`),
612
+ note('ok', `Auto-ingresso dal frontend`, `Se un frontend ha già una sessione Accessi valida e l'utente è abilitato alla console, può aprire la console senza rifare il login: \`POST /api/accessi/console/entry\` con \`Authorization: Bearer <jwt>\` restituisce un ticket monouso; apri poi \`/api/accessi/console#entry=<ticket>\`. Il JWT non finisce mai nell'URL; il ticket dura 60 secondi ed è utilizzabile una sola volta (endpoint di scambio protetto da rate limit).`),
602
613
  ],
603
614
  },
604
615
  // -------------------------------------------------------------------------
@@ -634,7 +645,7 @@ exports.WIKI_SECTIONS = [
634
645
  table(['Area', 'Endpoint principali'], [
635
646
  ['Auth', 'POST auth/login, auth/get-user-by-token, auth/confirm-reset-password/:token, auth/two-factor/verify, auth/two-factor/resend'],
636
647
  ['Email', 'POST email/send-reset-password-email, GET email/reset-password-page/:token'],
637
- ['Utenti', 'GET user/get-users, POST user/create-managed-user, PUT user/update-user/:codiceUtente, DELETE user/delete-user/:codiceUtente, POST user/set-stato, PATCH user/set-gdpr/:codiceUtente, POST user/register'],
648
+ ['Utenti', 'GET user/get-users, POST user/create-managed-user, PUT user/update-user/:codiceUtente, DELETE user/delete-user/:codiceUtente, DELETE user/delete-user-permanent/:codiceUtente, POST user/set-password/:codiceUtente, POST user/set-stato, PATCH user/set-gdpr/:codiceUtente, POST user/register'],
638
649
  ['Permessi', 'GET permission/roles, POST permission/create-role, PUT permission/update-role/:codiceRuolo, DELETE permission/delete-role/:codiceRuolo, POST permission/assign-roles/:codiceUtente, POST permission/assign-permissions/:codiceUtente, GET permission/grants/:codiceUtente, GET permission/menus, GET permission/menu-types, GET permission/groups-with-menus'],
639
650
  ['Catalogo', 'POST/PUT/DELETE permission/menus[/:codiceMenu], permission/menu-groups[/:codiceGruppo], permission/menu-types[/:codiceTipo]'],
640
651
  ['Configurator', 'PATCH configurator/menus/:codiceMenu/enabled, PATCH configurator/groups/:codiceGruppo/enabled'],