emilsoftware-utilities 2.0.0-dev.23 → 2.0.0-dev.24

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 (297) hide show
  1. package/README.MD +182 -38
  2. package/dist/ContractGenerator.d.ts +4 -3
  3. package/dist/ContractGenerator.js +15 -5
  4. package/dist/ContractGenerator.js.map +1 -1
  5. package/dist/DailyFileTransport.d.ts +8 -2
  6. package/dist/DailyFileTransport.js +9 -2
  7. package/dist/DailyFileTransport.js.map +1 -1
  8. package/dist/DatabaseUpdater.js +32 -27
  9. package/dist/DatabaseUpdater.js.map +1 -1
  10. package/dist/EmilsoftwareModule.js.map +1 -1
  11. package/dist/ExecutionTimeLogger.d.ts +2 -2
  12. package/dist/ExecutionTimeLogger.js +3 -2
  13. package/dist/ExecutionTimeLogger.js.map +1 -1
  14. package/dist/Logger.d.ts +22 -9
  15. package/dist/Logger.js +131 -54
  16. package/dist/Logger.js.map +1 -1
  17. package/dist/Orm.d.ts +26 -6
  18. package/dist/Orm.js +144 -40
  19. package/dist/Orm.js.map +1 -1
  20. package/dist/RoutesLoggerMiddleware.js.map +1 -1
  21. package/dist/Utilities.d.ts +12 -7
  22. package/dist/Utilities.js +57 -22
  23. package/dist/Utilities.js.map +1 -1
  24. package/dist/accessi-module/AccessiModule.d.ts +9 -0
  25. package/dist/accessi-module/AccessiModule.js +12 -4
  26. package/dist/accessi-module/AccessiModule.js.map +1 -1
  27. package/dist/accessi-module/Console/console.css +529 -281
  28. package/dist/accessi-module/Console/console.js +2081 -85
  29. package/dist/accessi-module/Console/console.js.map +1 -1
  30. package/dist/accessi-module/Console/generated/accessiApi.d.ts +167 -1
  31. package/dist/accessi-module/Console/generated/accessiApi.js +156 -2
  32. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
  33. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.d.ts +20 -8
  34. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +1 -1
  35. package/dist/accessi-module/Console/generated/model/abilitazioneMenuIcona.d.ts +12 -0
  36. package/dist/accessi-module/Console/generated/model/abilitazioneMenuIcona.js +9 -0
  37. package/dist/accessi-module/Console/generated/model/abilitazioneMenuIcona.js.map +1 -0
  38. package/dist/accessi-module/Console/generated/model/abilitazioneMenuNote.d.ts +12 -0
  39. package/dist/accessi-module/Console/generated/model/abilitazioneMenuNote.js +9 -0
  40. package/dist/accessi-module/Console/generated/model/abilitazioneMenuNote.js.map +1 -0
  41. package/dist/accessi-module/Console/generated/model/abilitazioneMenuPagina.d.ts +12 -0
  42. package/dist/accessi-module/Console/generated/model/abilitazioneMenuPagina.js +9 -0
  43. package/dist/accessi-module/Console/generated/model/abilitazioneMenuPagina.js.map +1 -0
  44. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipo.d.ts +12 -0
  45. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipo.js +9 -0
  46. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipo.js.map +1 -0
  47. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.d.ts +23 -0
  48. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js +3 -0
  49. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js.map +1 -0
  50. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.d.ts +14 -0
  51. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js +15 -0
  52. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js.map +1 -0
  53. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.d.ts +27 -0
  54. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js +9 -0
  55. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js.map +1 -0
  56. package/dist/accessi-module/Console/generated/model/createMenuRequest.d.ts +52 -0
  57. package/dist/accessi-module/Console/generated/model/createMenuRequest.js +9 -0
  58. package/dist/accessi-module/Console/generated/model/createMenuRequest.js.map +1 -0
  59. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.d.ts +18 -0
  60. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js +9 -0
  61. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js.map +1 -0
  62. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.d.ts +16 -0
  63. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js +9 -0
  64. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js.map +1 -0
  65. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.d.ts +14 -0
  66. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js +3 -0
  67. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js.map +1 -0
  68. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.d.ts +14 -0
  69. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js +3 -0
  70. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js.map +1 -0
  71. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.d.ts +12 -0
  72. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js +9 -0
  73. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js.map +1 -0
  74. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.d.ts +14 -0
  75. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js +3 -0
  76. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js.map +1 -0
  77. package/dist/accessi-module/Console/generated/model/getUsersParams.d.ts +8 -0
  78. package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +1 -1
  79. package/dist/accessi-module/Console/generated/model/index.d.ts +18 -0
  80. package/dist/accessi-module/Console/generated/model/index.js +18 -0
  81. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  82. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.d.ts +30 -0
  83. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js +9 -0
  84. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js.map +1 -0
  85. package/dist/accessi-module/Console/generated/model/menuTypeEntity.d.ts +12 -0
  86. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js +9 -0
  87. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js.map +1 -0
  88. package/dist/accessi-module/Console/generated/model/publicRegisterRequestCellulare.d.ts +13 -0
  89. package/dist/accessi-module/Console/generated/model/publicRegisterRequestCellulare.js +9 -0
  90. package/dist/accessi-module/Console/generated/model/publicRegisterRequestCellulare.js.map +1 -0
  91. package/dist/accessi-module/Console/generated/model/registerRequestCellulare.d.ts +13 -0
  92. package/dist/accessi-module/Console/generated/model/registerRequestCellulare.js +9 -0
  93. package/dist/accessi-module/Console/generated/model/registerRequestCellulare.js.map +1 -0
  94. package/dist/accessi-module/Console/generated/model/serviceTokenDto.d.ts +28 -0
  95. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js +9 -0
  96. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js.map +1 -0
  97. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.d.ts +21 -0
  98. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js +3 -0
  99. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js.map +1 -0
  100. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.d.ts +14 -0
  101. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js +15 -0
  102. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +1 -0
  103. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.d.ts +22 -0
  104. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js +9 -0
  105. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js.map +1 -0
  106. package/dist/accessi-module/Console/generated/model/updateMenuRequest.d.ts +47 -0
  107. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js +9 -0
  108. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js.map +1 -0
  109. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.d.ts +13 -0
  110. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js +9 -0
  111. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js.map +1 -0
  112. package/dist/accessi-module/Console/generated/model/userDtoAvatar.d.ts +13 -0
  113. package/dist/accessi-module/Console/generated/model/userDtoAvatar.js +9 -0
  114. package/dist/accessi-module/Console/generated/model/userDtoAvatar.js.map +1 -0
  115. package/dist/accessi-module/Console/generated/model/userDtoCellulare.d.ts +13 -0
  116. package/dist/accessi-module/Console/generated/model/userDtoCellulare.js +9 -0
  117. package/dist/accessi-module/Console/generated/model/userDtoCellulare.js.map +1 -0
  118. package/dist/accessi-module/Console/help.d.ts +13 -0
  119. package/dist/accessi-module/Console/help.js +348 -0
  120. package/dist/accessi-module/Console/help.js.map +1 -0
  121. package/dist/accessi-module/Console/index.html +89 -21
  122. package/dist/accessi-module/Console/openApiClient.d.ts +34 -0
  123. package/dist/accessi-module/Console/openApiClient.js +111 -0
  124. package/dist/accessi-module/Console/openApiClient.js.map +1 -0
  125. package/dist/accessi-module/Console/wiki.d.ts +52 -0
  126. package/dist/accessi-module/Console/wiki.js +689 -0
  127. package/dist/accessi-module/Console/wiki.js.map +1 -0
  128. package/dist/accessi-module/Controllers/AccessiConsoleController.d.ts +8 -1
  129. package/dist/accessi-module/Controllers/AccessiConsoleController.js +52 -15
  130. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +1 -1
  131. package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +1 -3
  132. package/dist/accessi-module/Controllers/ConfiguratorController.js +6 -8
  133. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  134. package/dist/accessi-module/Controllers/EmailController.d.ts +1 -1
  135. package/dist/accessi-module/Controllers/EmailController.js +1 -1
  136. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  137. package/dist/accessi-module/Controllers/FiltriController.d.ts +5 -4
  138. package/dist/accessi-module/Controllers/FiltriController.js +92 -4
  139. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  140. package/dist/accessi-module/Controllers/PermissionController.d.ts +11 -0
  141. package/dist/accessi-module/Controllers/PermissionController.js +273 -8
  142. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  143. package/dist/accessi-module/Controllers/ServiceTokenController.d.ts +23 -0
  144. package/dist/accessi-module/Controllers/ServiceTokenController.js +176 -0
  145. package/dist/accessi-module/Controllers/ServiceTokenController.js.map +1 -0
  146. package/dist/accessi-module/Controllers/UserController.d.ts +2 -2
  147. package/dist/accessi-module/Controllers/UserController.js +25 -9
  148. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  149. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  150. package/dist/accessi-module/Dtos/AbilitazioneMenu.js +16 -8
  151. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  152. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  153. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  154. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +1 -1
  155. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  156. package/dist/accessi-module/Dtos/CatalogDtos.d.ts +66 -0
  157. package/dist/accessi-module/Dtos/CatalogDtos.js +336 -0
  158. package/dist/accessi-module/Dtos/CatalogDtos.js.map +1 -0
  159. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
  160. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  161. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  162. package/dist/accessi-module/Dtos/GetMenusResponse.js +1 -1
  163. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  164. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  165. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +1 -1
  166. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +1 -1
  167. package/dist/accessi-module/Dtos/GetUsersResponse.d.ts +1 -1
  168. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  169. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  170. package/dist/accessi-module/Dtos/LoginResponse.d.ts +1 -1
  171. package/dist/accessi-module/Dtos/LoginResponse.js +1 -1
  172. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  173. package/dist/accessi-module/Dtos/MenuItem.js +1 -0
  174. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  175. package/dist/accessi-module/Dtos/RegisterRequest.js +2 -1
  176. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  177. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  178. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  179. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  180. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +1 -1
  181. package/dist/accessi-module/Dtos/ServiceToken.d.ts +34 -0
  182. package/dist/accessi-module/Dtos/ServiceToken.js +128 -0
  183. package/dist/accessi-module/Dtos/ServiceToken.js.map +1 -0
  184. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  185. package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
  186. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
  187. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  188. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  189. package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +1 -1
  190. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  191. package/dist/accessi-module/Dtos/UserDto.js +4 -2
  192. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  193. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  194. package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +1 -1
  195. package/dist/accessi-module/Dtos/index.d.ts +2 -0
  196. package/dist/accessi-module/Dtos/index.js +2 -0
  197. package/dist/accessi-module/Dtos/index.js.map +1 -1
  198. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +2 -2
  199. package/dist/accessi-module/Services/AuthService/AuthService.js +36 -36
  200. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  201. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
  202. package/dist/accessi-module/Services/EmailService/EmailService.d.ts +2 -1
  203. package/dist/accessi-module/Services/EmailService/EmailService.js +20 -17
  204. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  205. package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +10 -3
  206. package/dist/accessi-module/Services/FiltriService/FiltriService.js +64 -6
  207. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  208. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +44 -1
  209. package/dist/accessi-module/Services/PermissionService/PermissionService.js +508 -200
  210. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  211. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.d.ts +75 -0
  212. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js +265 -0
  213. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +1 -0
  214. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +23 -27
  215. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +1 -1
  216. package/dist/accessi-module/Services/UserService/UserService.d.ts +10 -3
  217. package/dist/accessi-module/Services/UserService/UserService.js +241 -155
  218. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  219. package/dist/accessi-module/Views/reset-password.html +213 -213
  220. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +8 -0
  221. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +89 -55
  222. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  223. package/dist/accessi-module/database-updates/accessiSchema.d.ts +1 -1
  224. package/dist/accessi-module/database-updates/accessiSchema.js +9 -1
  225. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -1
  226. package/dist/accessi-module/database-updates/optionalColumns.d.ts +2 -0
  227. package/dist/accessi-module/database-updates/optionalColumns.js +33 -1
  228. package/dist/accessi-module/database-updates/optionalColumns.js.map +1 -1
  229. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +7 -2
  230. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  231. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +1 -0
  232. package/dist/accessi-module/federated-auth/FederatedAuthController.js +26 -0
  233. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +1 -1
  234. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +6 -0
  235. package/dist/accessi-module/federated-auth/FederatedAuthService.js +28 -1
  236. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -1
  237. package/dist/accessi-module/index.d.ts +4 -1
  238. package/dist/accessi-module/index.js +8 -2
  239. package/dist/accessi-module/index.js.map +1 -1
  240. package/dist/accessi-module/jwt/jwt.strategy.js +8 -5
  241. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  242. package/dist/accessi-module/middleware/accessiRequirements.d.ts +1 -1
  243. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  244. package/dist/accessi-module/middleware/authenticateGen.js +11 -7
  245. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  246. package/dist/accessi-module/security/accessControl.js +8 -3
  247. package/dist/accessi-module/security/accessControl.js.map +1 -1
  248. package/dist/accessi-module/security/authenticatedToken.d.ts +1 -1
  249. package/dist/accessi-module/security/authenticatedToken.js +2 -1
  250. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  251. package/dist/accessi-module/security/passwordResetToken.d.ts +9 -3
  252. package/dist/accessi-module/security/passwordResetToken.js +9 -5
  253. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  254. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +1 -1
  255. package/dist/accessi-module/security/publicAuthRateLimit.js +28 -8
  256. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  257. package/dist/accessi-module/security/serviceTokenGuard.d.ts +25 -0
  258. package/dist/accessi-module/security/serviceTokenGuard.js +85 -0
  259. package/dist/accessi-module/security/serviceTokenGuard.js.map +1 -0
  260. package/dist/accessi-module/security/serviceTokenRateLimit.d.ts +8 -0
  261. package/dist/accessi-module/security/serviceTokenRateLimit.js +49 -0
  262. package/dist/accessi-module/security/serviceTokenRateLimit.js.map +1 -0
  263. package/dist/allegati-module/AllegatiModule.d.ts +11 -0
  264. package/dist/allegati-module/AllegatiModule.js +11 -1
  265. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  266. package/dist/allegati-module/Controllers/AllegatiController.d.ts +2 -1
  267. package/dist/allegati-module/Controllers/AllegatiController.js +23 -15
  268. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  269. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  270. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  271. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  272. package/dist/allegati-module/Dtos/index.js.map +1 -1
  273. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  274. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  275. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  276. package/dist/allegati-module/Services/AllegatiService/AllegatiService.d.ts +10 -3
  277. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +150 -101
  278. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  279. package/dist/allegati-module/index.js.map +1 -1
  280. package/dist/allegati-module/security/allegatiAuthorizationGuard.d.ts +14 -0
  281. package/dist/allegati-module/security/allegatiAuthorizationGuard.js +70 -0
  282. package/dist/allegati-module/security/allegatiAuthorizationGuard.js.map +1 -0
  283. package/dist/autobind.d.ts +10 -3
  284. package/dist/autobind.js +24 -9
  285. package/dist/autobind.js.map +1 -1
  286. package/dist/firebird-compat.d.ts +13 -0
  287. package/dist/firebird-compat.js +3 -2
  288. package/dist/firebird-compat.js.map +1 -1
  289. package/dist/index.js.map +1 -1
  290. package/dist/initEmilsoftwareModule.js.map +1 -1
  291. package/dist/scripts/generateAccessiWiki.d.ts +1 -0
  292. package/dist/scripts/generateAccessiWiki.js +131 -0
  293. package/dist/scripts/generateAccessiWiki.js.map +1 -0
  294. package/dist/swagger/SwaggerConfig.js +6 -3
  295. package/dist/swagger/SwaggerConfig.js.map +1 -1
  296. package/package.json +103 -92
  297. package/dist/emilsoftware-utilities-2.0.0-dev.23.tgz +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/wiki.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Contenuto della Wiki della console Accessi.\n *\n * I contenuti sono dati strutturati (non HTML) così da poter essere resi in modo\n * coerente dalla console e convertiti in un digest compatto per l'IA. Nessun\n * segreto o dato specifico di un ambiente deve finire qui.\n */\n\nexport type WikiTone = 'info' | 'ok' | 'warn' | 'danger';\n\nexport type WikiBlock =\n | { kind: 'p'; text: string }\n | { kind: 'h'; text: string }\n | { kind: 'list'; items: string[]; ordered?: boolean }\n | { kind: 'code'; language: string; title?: string; code: string; variant?: 'good' | 'bad' }\n | { kind: 'callout'; tone: WikiTone; title?: string; text: string }\n | { kind: 'table'; head: string[]; rows: string[][] };\n\nexport interface WikiSection {\n id: string;\n group: string;\n title: string;\n summary: string;\n blocks: WikiBlock[];\n}\n\nconst p = (text: string): WikiBlock => ({ kind: 'p', text });\nconst h = (text: string): WikiBlock => ({ kind: 'h', text });\nconst list = (items: string[], ordered = false): WikiBlock => ({ kind: 'list', items, ordered });\nconst code = (language: string, codeText: string, title?: string, variant?: 'good' | 'bad'): WikiBlock => ({ kind: 'code', language, title, code: codeText, variant });\nconst good = (language: string, codeText: string, title?: string): WikiBlock => code(language, codeText, title, 'good');\nconst bad = (language: string, codeText: string, title?: string): WikiBlock => code(language, codeText, title, 'bad');\nconst note = (tone: WikiTone, title: string, text: string): WikiBlock => ({ kind: 'callout', tone, title, text });\nconst table = (head: string[], rows: string[][]): WikiBlock => ({ kind: 'table', head, rows });\n\nexport const WIKI_SECTIONS: WikiSection[] = [\n // -------------------------------------------------------------------------\n {\n id: 'panoramica',\n group: 'Per iniziare',\n title: 'Panoramica e architettura',\n summary: 'Che cosa fa Accessi, come si incastra nel backend e come scorre una richiesta.',\n blocks: [\n p(`Accessi è un modulo Node/NestJS che aggiunge a un backend già esistente: autenticazione JWT, autorizzazione per ruoli e menu, gestione utenti, reset password, codici email (2FA e passwordless), SSO generico, token macchina-a-macchina e una console amministrativa. Il database è Firebird/InterBase.`),\n h(`Che cosa possiede il modulo`),\n list([\n `Le rotte sotto /api/accessi/* (login, utenti, ruoli, menu, filtri, SSO, token, console).`,\n `Lo schema database del dominio Accessi, riconciliato automaticamente al bootstrap.`,\n `Il middleware di autorizzazione authorizeAccessi per le rotte della tua applicazione.`,\n `La console web su /api/accessi/console.`,\n ]),\n h(`Che cosa resta alla tua applicazione`),\n list([\n `Il proprio frontend e le proprie rotte di business.`,\n `La validazione dei token dei provider SSO esterni (Accessi non li vede).`,\n `I segreti: jwtOptions.secret, SMTP, database ed encryptionKey non raggiungono mai il browser.`,\n ]),\n h(`Flusso di una richiesta protetta`),\n list([\n `Il client chiama una rotta della tua app con header Authorization: Bearer <jwt>.`,\n `La tua rotta esegue authorizeAccessi, che verifica firma HS256, scadenza e stato utente corrente.`,\n `Se passi un requisito, il modulo carica ruoli e grant dell'utente e li valuta.`,\n `Su successo req.user, req.data e (se richiesto) req.userGrants sono popolati; altrimenti risponde con il contratto errore Accessi.`,\n ], true),\n note('info', `Due modalità di bootstrap`, `Express esistente: initializeAccessiModule(app, options). NestJS esistente: AccessiModule.forRoot(options) nei tuoi imports. Non usarle entrambe.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'installazione',\n group: 'Per iniziare',\n title: 'Installazione',\n summary: 'Dipendenze, peer e build.',\n blocks: [\n code('bash', `npm install emilsoftware-utilities`, 'Installazione'),\n p(`La libreria dipende da node-firebird per il database e da Express 5 come peer per il montaggio. È consigliato Node 18 o superiore.`),\n note('warn', `Un solo modulo per processo`, `AccessiModule è @Global(): inizializzalo una sola volta per processo. In caso di più istanze, usa un processo per istanza.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'bootstrap-express',\n group: 'Per iniziare',\n title: 'Bootstrap su Express esistente',\n summary: 'initializeAccessiModule: ordine corretto e attesa prima di listen.',\n blocks: [\n p(`Chiama initializeAccessiModule prima di aprire la porta HTTP. Durante il bootstrap, authorizeAccessi risponde 503 ACCESSI_AUTH_INITIALIZING invece di autorizzare richieste parziali.`),\n good('ts', [\n \"import express from 'express';\",\n \"import { initializeAccessiModule, authorizeAccessi } from 'emilsoftware-utilities';\",\n '',\n 'const app = express();',\n 'app.use(express.json());',\n '',\n 'await initializeAccessiModule(app, options); // prima di app.listen',\n '',\n \"app.get('/api/ordini', authorizeAccessi, (req, res) => {\",\n ' res.json({ utente: req.user });',\n '});',\n '',\n \"app.get('/api/ordini/scrivi', (req, res, next) =>\",\n ' authorizeAccessi(req, res, next, {',\n \" requirements: [{ menuCode: 'ORDINI', minPermissionLevel: 20 }],\",\n ' }),',\n '(req, res) => res.json({ ok: true }));',\n '',\n 'app.listen(3000);',\n ].join('\\n'), 'Express + Accessi'),\n bad('ts', [\n 'const app = express();',\n 'app.listen(3000); // porta aperta prima del bootstrap',\n 'await initializeAccessiModule(app, options); // le richieste nel frattempo ricevono 503',\n ].join('\\n'), 'Non aprire la porta prima del bootstrap'),\n h(`Rotte montate`),\n p(`Accessi intercetta solo /api/accessi/*, /accessi/swagger* e /accessi/swagger.json. Tutte le altre rotte passano intatte al tuo stack Express.`),\n note('ok', `req.user`, `authorizeAccessi popola req.user con il payload utente corrente (utente, codiceUtente, flag) e req.data come alias storico. req.userGrants è presente solo se hai richiesto dei requisiti.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'bootstrap-nest',\n group: 'Per iniziare',\n title: 'Bootstrap su NestJS esistente',\n summary: 'AccessiModule.forRoot e uso dei provider esportati.',\n blocks: [\n p(`Se la tua applicazione è già NestJS, importa AccessiModule.forRoot(options). Il modulo è @Global e riesporta i servizi (AuthService, UserService, PermissionService, FederatedAuthService, ServiceTokenService, ServiceTokenGuard, AuthenticateGenService).`),\n good('ts', [\n \"import { Module } from '@nestjs/common';\",\n \"import { AccessiModule } from 'emilsoftware-utilities';\",\n '',\n '@Module({',\n ' imports: [AccessiModule.forRoot(options)],',\n '})',\n 'export class AppModule {}',\n ].join('\\n'), 'app.module.ts'),\n p(`Il global prefix api e le rotte /api/accessi/* sono gestiti dal modulo. Le tue rotte Nest si proteggono con JwtSimpleGuard usando il JWT Accessi.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'opzioni',\n group: 'Configurazione',\n title: 'AccessiOptions (riferimento completo)',\n summary: 'Ogni campo di configurazione con tipo, obbligo e note.',\n blocks: [\n table(\n ['Campo', 'Tipo', 'Obbligo', 'Note'],\n [\n ['databaseOptions', 'Options (node-firebird)', 'sì', 'Connessione Firebird al database Accessi.'],\n ['confirmationEmailUrl', 'string', 'sì', 'Base URL usata per il reset password.'],\n ['confirmationEmailReturnUrl', 'string', 'sì', 'URL di ritorno dopo il reset.'],\n ['confirmationEmailPrefix', 'string', 'no', 'Prefisso passato alla pagina di reset.'],\n ['customResetPage', 'string', 'no', 'Sostituisce la pagina HTML di reset inclusa.'],\n ['encryptionKey', 'string', 'sì', 'Compatibilità e migrazione delle password legacy.'],\n ['mockDemoUser', 'boolean', 'sì', 'Utenti fittizi admin e demo solo fuori produzione.'],\n ['passwordExpiration', 'boolean', 'no', 'Attiva il controllo della scadenza password al login.'],\n ['passwordExpirationDays', 'number', 'no', 'Valore predefinito: 90 giorni.'],\n ['legacyPasswordMigrationOnStartup', 'boolean', 'no', 'Predefinito true: converte le password legacy.'],\n ['autoUpdateDatabase', 'boolean', 'no', 'Predefinito true: riconcilia lo schema al boot.'],\n ['jwtOptions', '{ secret, expiresIn }', 'sì', 'Firma HS256 e durata dei JWT Accessi.'],\n ['emailOptions', 'EmailOptions', 'sì', 'SMTP per reset e codici email.'],\n ['publicAuthRateLimit', 'PublicAuthRateLimitOptions', 'no', 'Limiti in-memory sugli endpoint pubblici.'],\n ['publicRegistration', '{ enabled }', 'no', 'Registrazione pubblica: disattivata per impostazione predefinita.'],\n ['federatedAuthentication', 'FederatedAuthenticationOptions', 'no', `Abilita l'SSO generico.`],\n ['extensionFieldsOptions', 'ExtensionFieldsOptions[]', 'no', 'Tabelle esterne allegate al profilo.'],\n ['serviceTokens', '{ enabled, defaultTtlDays }', 'no', 'Token macchina-a-macchina, abilitati per impostazione predefinita.'],\n ],\n ),\n good('ts', [\n \"import type { AccessiOptions } from 'emilsoftware-utilities';\",\n '',\n 'export const options: AccessiOptions = {',\n ' databaseOptions: {',\n ' host: process.env.ACCESSI_DB_HOST!,',\n ' port: Number(process.env.ACCESSI_DB_PORT ?? 3050),',\n ' database: process.env.ACCESSI_DB_NAME!,',\n ' user: process.env.ACCESSI_DB_USER!,',\n ' password: process.env.ACCESSI_DB_PASSWORD!,',\n ' },',\n \" confirmationEmailUrl: 'https://app.example.com',\",\n \" confirmationEmailReturnUrl: 'https://app.example.com/login',\",\n ' encryptionKey: process.env.ACCESSI_ENCRYPTION_KEY!,',\n ' mockDemoUser: false,',\n ' passwordExpiration: true,',\n ' passwordExpirationDays: 90,',\n ' jwtOptions: {',\n \" secret: process.env.ACCESSI_JWT_SECRET!, // almeno 32 caratteri casuali, unico per ambiente\",\n \" expiresIn: '24h',\",\n ' },',\n ' emailOptions: {',\n ' host: process.env.SMTP_HOST!,',\n ' port: Number(process.env.SMTP_PORT ?? 587),',\n ' secure: false,',\n ' requireTLS: true,',\n ' tls: { rejectUnauthorized: true },',\n \" from: 'no-reply@example.com',\",\n ' auth: { user: process.env.SMTP_USER!, pass: process.env.SMTP_PASS! },',\n ' },',\n ' publicRegistration: { enabled: false },',\n ' serviceTokens: { enabled: true, defaultTtlDays: 365 },',\n '};',\n ].join('\\n'), 'Configurazione tipica'),\n bad('ts', [\n \"jwtOptions: { secret: 'accessi', expiresIn: '24h' }, // segreto debole e condiviso\",\n 'mockDemoUser: true, // MAI in produzione',\n ].join('\\n'), 'Errori comuni'),\n note('danger', `Segreti`, `Non versionare i segreti e non passarli al frontend. jwtOptions.secret deve essere identico tra le istanze del backend e diverso da quello dei provider SSO.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'database',\n group: 'Configurazione',\n title: 'Schema e aggiornamento del database',\n summary: 'Tabelle, riconciliazione automatica e CLI.',\n blocks: [\n p(`Accessi possiede lo schema del dominio. Con autoUpdateDatabase true (predefinito) lo riconcilia a ogni avvio; con false verifica comunque la compatibilità in sola lettura e blocca gli avvii incompatibili.`),\n h(`Tabelle principali`),\n list([\n `PARAMETRI, UTENTI, UTENTI_CONFIG, UTENTI_PWD, UTENTI_OLDPWD, UTENTI_GDPR`,\n `RUOLI, MENU_GRP, MENU_TIPI, MENU, ABILITAZIONI, RUOLI_MNU, UTENTI_RUOLI`,\n `FILTRI, FILTRI_TIPO`,\n `SSO_PROVIDER, UTENTI_IDENTITA_EXT`,\n `ACCESSI_2FA, ACCESSI_SERVICE_TOKEN`,\n ]),\n code('bash', `npm run db:update:accessi # riconcilia lo schema\\nnpm run db:check:accessi # verifica senza modificare`, 'CLI schema'),\n note('warn', `Versioni`, `La libreria richiede uno schema compatibile con la versione corrente (ACCESSI_SCHEMA_VERSION). Se la verifica fallisce, leggi il codice errore ACCESSI_DATABASE_SCHEMA_OUTDATED ed esegui db:update:accessi.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'login',\n group: 'Autenticazione',\n title: 'Login locale e JWT',\n summary: 'Endpoint di login, risposta e gestione della password scaduta.',\n blocks: [\n code('http', `POST /api/accessi/auth/login\\nContent-Type: application/json\\n\\n{ \"email\": \"utente@example.com\", \"password\": \"Segreta123!\" }`, 'Login con password'),\n p(`La risposta include Result.token (il JWT) e il profilo utente con ruoli, permessi e filtri. Se l'account è passwordless, ometti la password: il server risponde con un challenge via email (vedi la sezione su 2FA e passwordless).`),\n good('ts', [\n \"const res = await fetch('/api/accessi/auth/login', {\",\n \" method: 'POST',\",\n \" headers: { 'Content-Type': 'application/json' },\",\n ' body: JSON.stringify({ email, password }),',\n '});',\n 'const body = await res.json();',\n 'if (body.Result?.challenge) { /* richiedi il codice */ }',\n 'const token = body.Result?.token;',\n ].join('\\n'), 'Chiamata dal frontend'),\n note('warn', `Password scaduta`, `Con passwordExpiration attivo, una password scaduta produce una PasswordExpiredResponse con code PASSWORD_EXPIRED. Il client deve avviare il reset della password.`),\n h(`Verifica del token`),\n code('http', `POST /api/accessi/auth/get-user-by-token\\nContent-Type: application/json\\n\\n{ \"token\": \"<jwt>\" }`, 'get-user-by-token'),\n p(`Usalo per verificare un JWT e ottenere il profilo corrente (utile al bootstrap di una SPA). Restituisce Result.userData.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'passwordless-2fa',\n group: 'Autenticazione',\n title: 'Codici email, 2FA e passwordless',\n summary: 'Verifica in due passi, challenge e policy per utente.',\n blocks: [\n p(`La verifica con codice email è per-utente (flagDueFattori / UTENTI_CONFIG.FLG2FATT) ed è disattivata per impostazione predefinita. Con passwordlessLoginEnabled (FLGPWDLESS, richiede la 2FA attiva) l'accesso avviene con il solo codice email.`),\n table(\n ['Configurazione', 'Accesso locale', 'Accesso SSO'],\n [\n ['2FA disattivata', 'Password', 'Provider'],\n ['2FA attiva', 'Password + codice email', 'Provider + codice email'],\n ['2FA + passwordless', 'Solo codice email', 'Provider + codice email'],\n ],\n ),\n code('json', `{\\n \"Result\": {\\n \"challenge\": {\\n \"twoFactorRequired\": true,\\n \"challengeId\": \"64-caratteri-esadecimali\",\\n \"method\": \"email\",\\n \"expiresAt\": \"2026-09-11T14:00:00.000Z\",\\n \"resendAfterSeconds\": 60\\n }\\n }\\n}`, 'Risposta con challenge'),\n code('http', `POST /api/accessi/auth/two-factor/verify\\n{ \"challengeId\": \"...\", \"code\": \"012345\" }\\n\\nPOST /api/accessi/auth/two-factor/resend\\n{ \"challengeId\": \"...\" }`, 'Verifica e reinvio'),\n list([\n `Il codice ha 6 cifre, dura 10 minuti, consente 5 tentativi totali e al massimo 3 invii per challenge.`,\n `Fino alla verifica non sono presenti token, profilo o grant.`,\n `Il challenge non è un JWT e non va usato nell'header Authorization.`,\n ]),\n bad('ts', [\n '// Sbagliato: usare il challenge come token',\n \"fetch('/api/ordini', { headers: { Authorization: 'Bearer ' + challengeId } }); // 401\",\n ].join('\\n'), 'Il challenge non è un token'),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'reset-password',\n group: 'Autenticazione',\n title: 'Reset password',\n summary: 'Invio email e conferma con token monouso.',\n blocks: [\n 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'),\n p(`L'invio non rivela se l'email esiste (anti-enumerazione). Il token di reset è monouso ed è firmato con una chiave dedicata.`),\n note('info', `Pagina personalizzata`, `Imposta customResetPage per usare la tua pagina di reset invece di quella inclusa. confirmationEmailReturnUrl e confirmationEmailPrefix controllano il ritorno.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'middleware',\n group: 'Autorizzazione',\n title: 'authorizeAccessi (middleware)',\n summary: 'Proteggere le rotte della tua app con il JWT Accessi.',\n blocks: [\n p(`authorizeAccessi è un middleware Express che verifica il JWT, ricarica lo stato utente corrente e applica i requisiti. Su successo prosegue; su errore risponde direttamente con il contratto Accessi (non chiamare un tuo next(error)).`),\n good('ts', [\n \"app.get('/api/report',\",\n ' (req, res, next) => authorizeAccessi(req, res, next, {',\n \" requirements: [{ menuCode: 'REPORT', minPermissionLevel: 10 }],\",\n ' }),',\n ' (req, res) => res.json({ user: req.user, grants: req.userGrants }),',\n ');',\n ].join('\\n'), 'Rotta protetta'),\n h(`Che cosa trovi nella request`),\n list([\n `req.user e req.data: payload utente corrente (alias storici).`,\n `req.userGrants: grant effettivi, presente solo quando hai richiesto dei requisiti.`,\n ]),\n bad('ts', [\n \"app.get('/api/report', authorizeAccessi, (req, res) => {\",\n ' // Sbagliato: assumere che req.userGrants esista senza requisiti',\n ' const grants = req.userGrants.grants; // possibile TypeError',\n '});',\n ].join('\\n'), 'Non dare per scontato req.userGrants'),\n note('danger', `Lo stato utente è sempre ricontrollato`, `Un JWT valido non basta: se l'utente è stato bloccato, eliminato o ha cambiato policy, il middleware risponde 401 AUTH_USER_DISABLED.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'requisiti',\n group: 'Autorizzazione',\n title: 'Requisiti e livelli di abilitazione',\n summary: 'DSL accessiRequirement: permission, and, or, not, custom.',\n blocks: [\n p(`I requisiti si compongono con accessiRequirement. La forma storica requirements è un AND di permessi. Il livello è TipoAbilitazione: NESSUNA=0, LETTURA=10, SCRITTURA=20, SPECIAL=30; il confronto è tipoAbilitazione >= soglia.`),\n good('ts', [\n \"import { authorizeAccessi, accessiRequirement as r } from 'emilsoftware-utilities';\",\n '',\n '// AND (entrambi i menu)',\n 'const both = r.and(r.permission(\"ORDINI\", 20), r.permission(\"CLIENTI\", 10));',\n '',\n '// OR',\n 'const either = r.or(r.permission(\"REPORT\", 10), r.permission(\"EXPORT\", 20));',\n '',\n '// NOT + custom',\n 'const policy = r.and(',\n ' r.permission(\"AREA_RISERVATA\", 10),',\n ' r.not(r.permission(\"BLOCCO_TOTALE\", 0)),',\n ');',\n '',\n 'app.get(\"/api/riservato\", (req, res, next) => authorizeAccessi(req, res, next, {',\n ' requirementTree: policy,',\n ' customRequirementHandlers: {',\n ' stessoReparto: async (ctx) => ctx.userCode === Number(ctx.req.query.reparto),',\n ' },',\n '}), handler);',\n ].join('\\n'), 'Policy composte'),\n bad('ts', [\n '// Sbagliato: AND/OR senza figli -> errore di configurazione (500 AUTH_REQUIREMENTS_MISCONFIGURED)',\n 'const empty = r.and();',\n ].join('\\n'), 'Configurazione non valida'),\n note('warn', `custom senza handler`, `Un requisito custom la cui chiave non ha un handler produce 500 AUTH_REQUIREMENTS_MISCONFIGURED: è un errore di programmazione, non un 403.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'utenti',\n group: 'Dominio',\n title: 'Utenti',\n summary: 'Creazione, aggiornamento, stati, GDPR e filtri.',\n blocks: [\n h(`Stati di registrazione (STAREG)`),\n table(\n ['Valore', 'Nome', 'Effetto sul login'],\n [\n ['0', 'NULL', 'Non confermato'],\n ['5', 'INSERT', 'Non confermato'],\n ['10', 'INVIO', 'Richiede il rinnovo della password'],\n ['20', 'CONF', 'Valido'],\n ['50', 'DELETE', 'Bloccato (soft delete)'],\n ['99', 'BLOCC', 'Bloccato'],\n ],\n ),\n h(`Endpoint principali (superutente salvo diversamente indicato)`),\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/user/get-users', 'Elenco con paginazione (limit e offset, header X-Total-Count).'],\n ['POST', '/api/accessi/user/create-managed-user', 'Crea un utente locale e invia il reset password.'],\n ['PUT', '/api/accessi/user/update-user/:codiceUtente', 'Aggiorna profilo e policy (campi privilegiati solo superutente).'],\n ['DELETE', '/api/accessi/user/delete-user/:codiceUtente', 'Soft delete: STAREG=DELETE.'],\n ['POST', '/api/accessi/user/set-stato', 'Imposta lo stato di registrazione.'],\n ['PATCH', '/api/accessi/user/set-gdpr/:codiceUtente', 'Registra il consenso GDPR.'],\n ['POST', '/api/accessi/user/register', 'Registrazione pubblica, solo se publicRegistration.enabled.'],\n ],\n ),\n good('ts', [\n \"await fetch('/api/accessi/user/create-managed-user', {\",\n \" method: 'POST',\",\n \" headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + adminToken },\",\n ' body: JSON.stringify({',\n \" email: 'nuovo@example.com',\",\n \" nome: 'Mario',\",\n \" cognome: 'Rossi',\",\n ' roles: [1, 2],',\n \" permissions: [{ codiceMenu: 'REPORT', tipoAbilitazione: 10 }],\",\n ' }),',\n '});',\n ].join('\\n'), 'Creazione di un utente gestito'),\n bad('ts', [\n '// Sbagliato: inviare flag privilegiati dal frontend pubblico',\n 'fetch(\"/api/accessi/user/register\", {',\n ' method: \"POST\",',\n ' body: JSON.stringify({ email, flagSuper: true }), // ignorato o negato',\n '});',\n ].join('\\n'), 'Privilegi dal client'),\n note('info', `Campi estesi`, `extensionFieldsOptions allega colonne di tabelle applicative al profilo (per esempio la ragione sociale). Le colonne sono in whitelist: non costruirle mai da input HTTP.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'ruoli',\n group: 'Dominio',\n title: 'Ruoli e permessi',\n summary: 'Assegnazioni sostitutive e composizione dei grant.',\n blocks: [\n p(`I ruoli contengono una lista di menu con livello. Le assegnazioni (ruoli e permessi diretti) sono SOSTITUTIVE: invia sempre la lista completa desiderata. I grant diretti prevalgono su quelli dei ruoli; i superutenti vedono tutti i menu attivi.`),\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/permission/roles', 'Ruoli con i menu associati.'],\n ['POST', '/api/accessi/permission/create-role', 'Crea un ruolo (i menu sono obbligatori).'],\n ['PUT', '/api/accessi/permission/update-role/:codiceRuolo', 'Aggiorna un ruolo (menu sostitutivi).'],\n ['DELETE', '/api/accessi/permission/delete-role/:codiceRuolo', 'Elimina ruolo, mapping e assegnazioni.'],\n ['POST', '/api/accessi/permission/assign-roles/:codiceUtente', `Sostituisce i ruoli dell'utente.`],\n ['POST', '/api/accessi/permission/assign-permissions/:codiceUtente', 'Sostituisce i permessi diretti.'],\n ['GET', '/api/accessi/permission/grants/:codiceUtente', 'Grant effettivi, permessi diretti e ruoli.'],\n ],\n ),\n good('ts', [\n 'const role = {',\n \" descrizioneRuolo: 'Gestore ordini',\",\n ' menu: [',\n \" { codiceMenu: 'ORDINI', tipoAbilitazione: 20 },\",\n \" { codiceMenu: 'CLIENTI', tipoAbilitazione: 10 },\",\n ' ],',\n '};',\n 'await createRole(role); // POST /api/accessi/permission/create-role',\n '',\n \"// Sostitutivo: questa lista diventa l'intero set di ruoli dell'utente\",\n 'await assignRolesToUser(codiceUtente, { roles: [3, 7] });',\n ].join('\\n'), 'Creazione di un ruolo e assegnazione'),\n bad('ts', [\n \"// Sbagliato: pensare che l'assegnazione sia incrementale\",\n 'await assignRolesToUser(codiceUtente, { roles: [3] });',\n \"// ora l'utente ha SOLO il ruolo 3, non 3 più quelli di prima\",\n ].join('\\n'), 'Assegnazione non additiva'),\n note('warn', `Menu obbligatori`, `create-role e update-role rifiutano un ruolo senza menu. Se ti serve un ruolo senza accessi, non crearlo.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'menu',\n group: 'Dominio',\n title: 'Menu, gruppi e tipi menu',\n summary: 'Catalogo di navigazione e CRUD completo (superutente).',\n blocks: [\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/permission/menus', 'Menu attivi.'],\n ['GET', '/api/accessi/permission/menu-types', 'Catalogo dei tipi menu.'],\n ['GET', '/api/accessi/permission/groups-with-menus?includeDisabled=true', 'Gruppi con menu (anche disabilitati).'],\n ['POST', '/api/accessi/permission/menus', 'Crea un menu.'],\n ['PUT', '/api/accessi/permission/menus/:codiceMenu', 'Aggiorna un menu.'],\n ['DELETE', '/api/accessi/permission/menus/:codiceMenu', 'Elimina un menu (con grant e associazioni ai ruoli).'],\n ['POST', '/api/accessi/permission/menu-groups', 'Crea un gruppo.'],\n ['PUT', '/api/accessi/permission/menu-groups/:codiceGruppo', 'Aggiorna un gruppo.'],\n ['DELETE', '/api/accessi/permission/menu-groups/:codiceGruppo', 'Elimina un gruppo (solo se vuoto).'],\n ['POST/PUT/DELETE', '/api/accessi/permission/menu-types[/:codiceTipo]', 'CRUD dei tipi menu.'],\n ],\n ),\n p(`I codici (CODMNU, CODGRP, CODTIP) sono chiavi immutabili: si indicano in creazione e poi si passano nel percorso. Un gruppo o un tipo si elimina solo se non è referenziato.`),\n good('ts', [\n \"await createMenuGroup({ codiceGruppo: 'A', descrizioneGruppo: 'Amministrazione', ordineGruppo: 1, enabled: true });\",\n \"await createMenuType({ codiceTipo: 'X', descrizioneTipo: 'Operativo' });\",\n \"await createMenu({ codiceMenu: 'ORDINI', descrizioneMenu: 'Ordini', codiceGruppo: 'A', tipo: 'X', ordineMenu: 10, enabled: true });\",\n ].join('\\n'), 'Catalogo in ordine'),\n bad('ts', [\n '// Sbagliato: eliminare un gruppo che contiene menu -> 400 con spiegazione',\n \"await deleteMenuGroup('A'); // contiene N menu\",\n ].join('\\n'), 'Vincoli di integrità'),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'filtri',\n group: 'Dominio',\n title: 'Filtri applicativi',\n summary: 'Filtri per utente e catalogo dei tipi filtro.',\n blocks: [\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/filtri/tipi', 'Catalogo dei tipi filtro.'],\n ['POST', '/api/accessi/filtri/tipi', 'Crea un tipo filtro (superutente).'],\n ['PUT', '/api/accessi/filtri/tipi/:tipFil', 'Aggiorna un tipo filtro.'],\n ['DELETE', '/api/accessi/filtri/tipi/:tipFil', 'Elimina un tipo filtro (se non è usato).'],\n ['GET', '/api/accessi/filtri/utente?codUte=123', 'Filtri di un utente (self o superutente).'],\n ['POST', '/api/accessi/filtri/utente', 'Upsert dei filtri (self o superutente).'],\n ],\n ),\n note('info', `Mapping delle colonne`, `I campi filtro sono mappati su colonne FILTRI in whitelist (FILTRI_UTENTE_DB_MAPPING). I campi non configurati nello schema vengono rifiutati.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'sso',\n group: 'SSO',\n title: 'SSO generico (federated authentication)',\n summary: 'Il backend valida il provider, Accessi gestisce identità e sessioni.',\n blocks: [\n p(`Accessi non valida i token Azure, Google o SAML: è il TUO backend a validare il flusso SSO e a passare solo { provider, subject } verificati a FederatedAuthService. Così issuer, secret e token restano fuori dal modulo.`),\n good('ts', [\n \"import { FederatedAuthService } from 'emilsoftware-utilities';\",\n '',\n '// Nel tuo callback SSO, dopo aver validato il token del provider:',\n 'const verified = { provider: \"azure-ad-acme\", subject: claims.oid };',\n 'const result = await federatedAuthService.authenticate(verified);',\n '',\n 'if (result.login.challenge) {',\n ' // 2FA attiva: restituisci il challenge al frontend',\n ' return res.json({ challenge: result.login.challenge });',\n '}',\n 'return res.json({ login: result.login, token: result.token });',\n ].join('\\n'), 'Login SSO'),\n h(`API amministrative (superutente)`),\n list([\n `GET/POST /api/accessi/federated-auth/providers, PATCH/DELETE providers/:provider`,\n `GET/POST /api/accessi/federated-auth/users/:codiceUtente/identities`,\n `POST /api/accessi/federated-auth/users (crea un utente SSO-only)`,\n `PATCH /api/accessi/federated-auth/users/:codiceUtente/password-login`,\n ]),\n bad('ts', [\n \"// Sbagliato: far validare il token del provider ad Accessi o fidarsi del frontend\",\n 'await federatedAuthService.authenticate({ provider, subject: req.body.email }); // subject non verificato',\n ].join('\\n'), `Non fidarti dell'input`),\n note('warn', `Provider in uso`, `Un provider si elimina solo se nessuna identità è collegata; altrimenti disabilitalo. La chiave del provider deve coincidere con la configurazione del backend.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'service-token',\n group: 'Token di servizio',\n title: 'Token macchina-a-macchina',\n summary: 'Autenticazione tecnica con scope: non è un superutente.',\n blocks: [\n p(`Formato: st_<id>.<segreto> (segreto da 256 bit). Nel database si salva solo lo SHA-256 del segreto; il segreto è mostrato una sola volta. La verifica restituisce { tokenId, label, scopes }: nessun ruolo o grant.`),\n note('danger', `Non è un superutente`, `Un service token non apre le API Accessi: abilita solo le rotte della tua app che proteggi con ServiceTokenGuard.`),\n good('ts', [\n \"import { ServiceTokenGuard, RequireServiceTokenScopes } from 'emilsoftware-utilities';\",\n '',\n '@UseGuards(ServiceTokenGuard)',\n \"@RequireServiceTokenScopes('ia')\",\n '@Post(\"internal/ask\")',\n 'ask() { /* req.accessiServiceToken = { tokenId, label, scopes } */ }',\n ].join('\\n'), 'Rotta tecnica protetta'),\n h(`Gestione (superutente)`),\n list([\n `POST /api/accessi/service-token (label, scopes, expiresAt o ttlDays) -> segreto mostrato una volta`,\n `GET /api/accessi/service-token?includeRevoked=true`,\n `DELETE /api/accessi/service-token/:tokenId (revoca immediata)`,\n `POST /api/accessi/service-token/:tokenId/rotate`,\n ]),\n bad('ts', [\n '// Sbagliato: usare un service token per autenticare un utente umano',\n \"fetch('/api/profilo', { headers: { Authorization: 'Bearer ' + serviceToken } }); // req.user assente\",\n ].join('\\n'), 'Non è un utente'),\n note('warn', `Scadenza`, `Senza expiresAt né defaultTtlDays il token non scade: imposta serviceTokens.defaultTtlDays o una scadenza esplicita.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'console',\n group: 'Console',\n title: 'Console amministrativa',\n summary: 'Accesso, sezioni e che cosa si può fare.',\n blocks: [\n p(`La console è servita dal modulo su /api/accessi/console e richiede un superutente Accessi. Non ha stato proprio: ogni azione chiama le API protette con il JWT dell'utente connesso.`),\n list([\n `Utenti: elenco, creazione locale o SSO, profilo, ruoli, grant diretti, stato, 2FA.`,\n `Ruoli e grant: CRUD dei ruoli con l'albero delle abilitazioni.`,\n `Menu e gruppi: CRUD di gruppi, menu e tipi menu.`,\n `Filtri: filtri utente e tipi filtro.`,\n `Token di servizio: creazione, rotazione, revoca.`,\n `SSO: provider e identità.`,\n ]),\n note('info', `Accesso`, `Apri /api/accessi/console e accedi con un utente con flagSuper=true. Le sezioni sono raggiungibili anche tramite deep link (per esempio /api/accessi/console/menu-e-gruppi/menu).`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'errori',\n group: 'Riferimenti',\n title: 'Contratto errori e codici',\n summary: 'Formato della risposta e codici stabili ACCESSI_* e AUTH_*.',\n blocks: [\n p(`Gli errori HTTP delle API Accessi usano un contratto stabile: severity, status, statusCode, code, error (campo legacy uguale a code), message e details per gli errori di validazione.`),\n code('json', `{\\n \"severity\": \"error\",\\n \"status\": 400,\\n \"statusCode\": 2,\\n \"code\": \"ACCESSI_VALIDATION_ERROR\",\\n \"error\": \"ACCESSI_VALIDATION_ERROR\",\\n \"message\": \"La richiesta contiene dati non validi.\",\\n \"details\": [\"email: deve essere una stringa.\"]\\n}`, 'Errore di validazione'),\n table(\n ['Codice', 'Quando'],\n [\n ['ACCESSI_VALIDATION_ERROR', 'Body o parametri non validi (400).'],\n ['ACCESSI_AUTH_INITIALIZING', 'Bootstrap in corso (503).'],\n ['ACCESSI_AUTH_NOT_INITIALIZED', 'Modulo non inizializzato (500).'],\n ['AUTH_HEADER_MISSING / AUTH_TOKEN_MISSING', 'Header Authorization assente (401).'],\n ['AUTH_TOKEN_INVALID', 'JWT non valido o scaduto (401).'],\n ['AUTH_USER_DISABLED', 'Utente non più autorizzato (401).'],\n ['AUTH_INSUFFICIENT_PERMISSIONS', 'Requisiti non soddisfatti (403).'],\n ['AUTH_REQUIREMENTS_MISCONFIGURED', 'Policy malformata o handler custom mancante (500).'],\n ['ACCESSI_DATABASE_SCHEMA_OUTDATED', 'Schema del database incompatibile.'],\n ['ACCESSI_SERVICE_TOKEN_RATE_LIMITED', 'Troppi tentativi (429).'],\n ],\n ),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'endpoint',\n group: 'Riferimenti',\n title: 'Indice degli endpoint',\n summary: 'Tutte le rotte /api/accessi/* in una tabella.',\n blocks: [\n table(\n ['Area', 'Endpoint principali'],\n [\n ['Auth', 'POST auth/login, auth/get-user-by-token, auth/confirm-reset-password/:token, auth/two-factor/verify, auth/two-factor/resend'],\n ['Email', 'POST email/send-reset-password-email, GET email/reset-password-page/:token'],\n ['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'],\n ['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'],\n ['Catalogo', 'POST/PUT/DELETE permission/menus[/:codiceMenu], permission/menu-groups[/:codiceGruppo], permission/menu-types[/:codiceTipo]'],\n ['Configurator', 'PATCH configurator/menus/:codiceMenu/enabled, PATCH configurator/groups/:codiceGruppo/enabled'],\n ['Filtri', 'GET filtri/tipi, POST/PUT/DELETE filtri/tipi[/:tipFil], GET/POST filtri/utente'],\n ['SSO', 'GET/POST federated-auth/providers, PATCH/DELETE providers/:provider, GET/POST users/:codiceUtente/identities, POST users, PATCH users/:codiceUtente/password-login'],\n ['Token', 'POST/GET service-token, DELETE service-token/:tokenId, POST service-token/:tokenId/rotate'],\n ['Console', 'GET console, console/:view, console/:view/:sub, console/assets/:file'],\n ],\n ),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'antipattern',\n group: 'Riferimenti',\n title: 'Antipattern e checklist',\n summary: 'Che cosa non fare, in breve.',\n blocks: [\n list([\n `Non aprire la porta HTTP prima di initializeAccessiModule.`,\n `Non usare authorizeAccessi come unico strato: valida sempre anche l'input applicativo.`,\n `Non dare per scontato che req.userGrants esista se non hai richiesto dei requisiti.`,\n `Non considerare incrementali assignRolesToUser e assignPermissionsToUser: sono sostitutivi.`,\n `Non far validare i token SSO ad Accessi: passagli solo { provider, subject } verificati.`,\n `Non usare un service token come identità utente.`,\n `Non versionare segreti; jwtOptions.secret deve essere unico per ambiente.`,\n `Non eliminare gruppi o tipi in uso: gestisci l'errore 400 e disabilita invece.`,\n `Non usare il challenge 2FA come JWT.`,\n ]),\n note('ok', `Checklist di rilascio`, `Schema verificato (db:check), segreti da un secret manager, mockDemoUser=false, rate limit pubblico configurato, SMTP reale testato, serviceTokens.defaultTtlDays impostato.`),\n ],\n },\n];\n\n/** Elenco ordinato dei gruppi per l'indice. */\nexport function wikiGroups(): Array<{ group: string; sections: WikiSection[] }> {\n const groups: Array<{ group: string; sections: WikiSection[] }> = [];\n for (const section of WIKI_SECTIONS) {\n let bucket = groups.find((item) => item.group === section.group);\n if (!bucket) {\n bucket = { group: section.group, sections: [] };\n groups.push(bucket);\n }\n bucket.sections.push(section);\n }\n return groups;\n}\n\n/**\n * Digest compatto in Markdown per l'IA che costruisce il backend integratore.\n * Deriva dagli stessi dati della wiki, quindi resta sincronizzato.\n */\nexport function buildAiDigest(): string {\n const lines: string[] = [\n `# Accessi (emilsoftware-utilities) - guida compatta per l'integrazione backend`,\n '',\n `Modulo NestJS/Express + Firebird per autenticazione JWT, autorizzazione per menu, utenti, 2FA e passwordless, SSO generico, service token e console.`,\n '',\n ];\n\n for (const { group, sections } of wikiGroups()) {\n lines.push(`## ${group}`);\n for (const section of sections) {\n lines.push(`### ${section.title}`);\n lines.push(section.summary);\n for (const block of section.blocks) {\n switch (block.kind) {\n case 'p':\n lines.push(block.text);\n break;\n case 'h':\n lines.push(`**${block.text}**`);\n break;\n case 'list':\n block.items.forEach((item, index) => lines.push(`${block.ordered ? `${index + 1}.` : '-'} ${item}`));\n break;\n case 'code':\n lines.push('```' + block.language);\n lines.push(block.code);\n lines.push('```');\n break;\n case 'callout':\n lines.push(`[${block.tone.toUpperCase()}] ${block.title ? block.title + ': ' : ''}${block.text}`);\n break;\n case 'table':\n lines.push('| ' + block.head.join(' | ') + ' |');\n lines.push('| ' + block.head.map(() => '---').join(' | ') + ' |');\n block.rows.forEach((row) => lines.push('| ' + row.join(' | ') + ' |'));\n break;\n }\n }\n lines.push('');\n }\n }\n\n return lines.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n"]}
@@ -2,10 +2,17 @@ import { Response } from 'express';
2
2
  /** Serves the framework-free administrative console bundled with Accessi. API authorization remains on each API endpoint. */
3
3
  export declare class AccessiConsoleController {
4
4
  index(res: Response): void;
5
+ /**
6
+ * Percorsi SPA ammessi. Deve restare allineato a `routeSegment` (e ai padri dei
7
+ * sottomenu) in Console/console.ts, altrimenti i deep link restituiscono 404.
8
+ */
9
+ private static readonly allowedViews;
10
+ asset(file: string, res: Response): void | Response<any, Record<string, any>>;
5
11
  /**
6
12
  * Serves the SPA shell for the supported console sections, allowing direct
7
13
  * navigation, bookmarks and browser back/forward without server-side state.
8
14
  */
9
15
  section(view: string, res: Response): void | Response<any, Record<string, any>>;
10
- asset(file: string, res: Response): void | Response<any, Record<string, any>>;
16
+ /** Serves the SPA shell for nested sections (menu, filtri, SSO). */
17
+ subsection(view: string, sub: string, res: Response): void | Response<any, Record<string, any>>;
11
18
  }
@@ -11,39 +11,67 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
+ var AccessiConsoleController_1;
14
15
  Object.defineProperty(exports, "__esModule", { value: true });
15
16
  exports.AccessiConsoleController = void 0;
16
17
  const common_1 = require("@nestjs/common");
17
18
  const swagger_1 = require("@nestjs/swagger");
18
19
  const path_1 = require("path");
19
20
  /** Serves the framework-free administrative console bundled with Accessi. API authorization remains on each API endpoint. */
20
- let AccessiConsoleController = class AccessiConsoleController {
21
+ let AccessiConsoleController = AccessiConsoleController_1 = class AccessiConsoleController {
21
22
  index(res) {
22
23
  res.setHeader('Cache-Control', 'no-store, max-age=0');
23
24
  res.setHeader('Referrer-Policy', 'no-referrer');
24
25
  res.setHeader('X-Content-Type-Options', 'nosniff');
25
26
  return res.sendFile((0, path_1.join)(__dirname, '..', 'Console', 'index.html'));
26
27
  }
28
+ // Le route statiche vanno dichiarate prima di `:view/:sub`, che altrimenti
29
+ // catturerebbe `assets/<file>` e restituirebbe 404 per CSS e bundle.
30
+ asset(file, res) {
31
+ const allowed = new Set(['console.css', 'console.js']);
32
+ if (!allowed.has(file))
33
+ return res.status(404).end();
34
+ // Keep the SPA shell, styles and bundle on the same deployed revision.
35
+ res.setHeader('Cache-Control', 'no-store, max-age=0');
36
+ return res.sendFile((0, path_1.join)(__dirname, '..', 'Console', file));
37
+ }
27
38
  /**
28
39
  * Serves the SPA shell for the supported console sections, allowing direct
29
40
  * navigation, bookmarks and browser back/forward without server-side state.
30
41
  */
31
42
  section(view, res) {
32
- const allowedViews = new Set(['utenti', 'ruoli-e-grant', 'menu-e-gruppi', 'filtri', 'sso']);
33
- if (!allowedViews.has(view))
43
+ if (!AccessiConsoleController_1.allowedViews.has(view))
34
44
  return res.status(404).end();
35
45
  return this.index(res);
36
46
  }
37
- asset(file, res) {
38
- const allowed = new Set(['console.css', 'console.js']);
39
- if (!allowed.has(file))
47
+ /** Serves the SPA shell for nested sections (menu, filtri, SSO). */
48
+ subsection(view, sub, res) {
49
+ if (!AccessiConsoleController_1.allowedViews.has(`${view}/${sub}`))
40
50
  return res.status(404).end();
41
- // Keep the SPA shell, styles and bundle on the same deployed revision.
42
- res.setHeader('Cache-Control', 'no-store, max-age=0');
43
- return res.sendFile((0, path_1.join)(__dirname, '..', 'Console', file));
51
+ return this.index(res);
44
52
  }
45
53
  };
46
54
  exports.AccessiConsoleController = AccessiConsoleController;
55
+ /**
56
+ * Percorsi SPA ammessi. Deve restare allineato a `routeSegment` (e ai padri dei
57
+ * sottomenu) in Console/console.ts, altrimenti i deep link restituiscono 404.
58
+ */
59
+ AccessiConsoleController.allowedViews = new Set([
60
+ 'utenti',
61
+ 'ruoli-e-grant',
62
+ 'menu-e-gruppi',
63
+ 'menu-e-gruppi/gruppi',
64
+ 'menu-e-gruppi/menu',
65
+ 'menu-e-gruppi/tipi-menu',
66
+ 'filtri',
67
+ 'filtri/utente',
68
+ 'filtri/tipi',
69
+ 'sso',
70
+ 'sso/provider',
71
+ 'sso/utenti',
72
+ 'token-di-servizio',
73
+ 'wiki',
74
+ ]);
47
75
  __decorate([
48
76
  (0, common_1.Get)(),
49
77
  __param(0, (0, common_1.Res)()),
@@ -51,6 +79,14 @@ __decorate([
51
79
  __metadata("design:paramtypes", [Object]),
52
80
  __metadata("design:returntype", void 0)
53
81
  ], AccessiConsoleController.prototype, "index", null);
82
+ __decorate([
83
+ (0, common_1.Get)('assets/:file'),
84
+ __param(0, (0, common_1.Param)('file')),
85
+ __param(1, (0, common_1.Res)()),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [String, Object]),
88
+ __metadata("design:returntype", void 0)
89
+ ], AccessiConsoleController.prototype, "asset", null);
54
90
  __decorate([
55
91
  (0, common_1.Get)(':view'),
56
92
  __param(0, (0, common_1.Param)('view')),
@@ -60,14 +96,15 @@ __decorate([
60
96
  __metadata("design:returntype", void 0)
61
97
  ], AccessiConsoleController.prototype, "section", null);
62
98
  __decorate([
63
- (0, common_1.Get)('assets/:file'),
64
- __param(0, (0, common_1.Param)('file')),
65
- __param(1, (0, common_1.Res)()),
99
+ (0, common_1.Get)(':view/:sub'),
100
+ __param(0, (0, common_1.Param)('view')),
101
+ __param(1, (0, common_1.Param)('sub')),
102
+ __param(2, (0, common_1.Res)()),
66
103
  __metadata("design:type", Function),
67
- __metadata("design:paramtypes", [String, Object]),
104
+ __metadata("design:paramtypes", [String, String, Object]),
68
105
  __metadata("design:returntype", void 0)
69
- ], AccessiConsoleController.prototype, "asset", null);
70
- exports.AccessiConsoleController = AccessiConsoleController = __decorate([
106
+ ], AccessiConsoleController.prototype, "subsection", null);
107
+ exports.AccessiConsoleController = AccessiConsoleController = AccessiConsoleController_1 = __decorate([
71
108
  (0, swagger_1.ApiExcludeController)(),
72
109
  (0, common_1.Controller)('accessi/console')
73
110
  ], AccessiConsoleController);
@@ -1 +1 @@
1
- {"version":3,"file":"AccessiConsoleController.js","sourceRoot":"","sources":["../../../src/accessi-module/Controllers/AccessiConsoleController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA6D;AAC7D,6CAAuD;AAEvD,+BAA4B;AAE5B,6HAA6H;AAGtH,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAEnC,KAAK,CAAQ,GAAa;QACxB,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;QACtD,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAChD,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QACnD,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IAEH,OAAO,CAAgB,IAAY,EAAS,GAAa;QACvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAGD,KAAK,CAAgB,IAAY,EAAS,GAAa;QACrD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrD,uEAAuE;QACvE,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF,CAAA;AA5BY,4DAAwB;AAEnC;IADC,IAAA,YAAG,GAAE;IACC,WAAA,IAAA,YAAG,GAAE,CAAA;;;;qDAKX;AAOD;IADC,IAAA,YAAG,EAAC,OAAO,CAAC;IACJ,WAAA,IAAA,cAAK,EAAC,MAAM,CAAC,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;uDAI1C;AAGD;IADC,IAAA,YAAG,EAAC,cAAc,CAAC;IACb,WAAA,IAAA,cAAK,EAAC,MAAM,CAAC,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;qDAMxC;mCA3BU,wBAAwB;IAFpC,IAAA,8BAAoB,GAAE;IACtB,IAAA,mBAAU,EAAC,iBAAiB,CAAC;GACjB,wBAAwB,CA4BpC","sourcesContent":["import { Controller, Get, Param, Res } from '@nestjs/common';\nimport { ApiExcludeController } from '@nestjs/swagger';\nimport { Response } from 'express';\nimport { join } from 'path';\n\n/** Serves the framework-free administrative console bundled with Accessi. API authorization remains on each API endpoint. */\n@ApiExcludeController()\n@Controller('accessi/console')\nexport class AccessiConsoleController {\n @Get()\n index(@Res() res: Response) {\n res.setHeader('Cache-Control', 'no-store, max-age=0');\n res.setHeader('Referrer-Policy', 'no-referrer');\n res.setHeader('X-Content-Type-Options', 'nosniff');\n return res.sendFile(join(__dirname, '..', 'Console', 'index.html'));\n }\n\n /**\n * Serves the SPA shell for the supported console sections, allowing direct\n * navigation, bookmarks and browser back/forward without server-side state.\n */\n @Get(':view')\n section(@Param('view') view: string, @Res() res: Response) {\n const allowedViews = new Set(['utenti', 'ruoli-e-grant', 'menu-e-gruppi', 'filtri', 'sso']);\n if (!allowedViews.has(view)) return res.status(404).end();\n return this.index(res);\n }\n\n @Get('assets/:file')\n asset(@Param('file') file: string, @Res() res: Response) {\n const allowed = new Set(['console.css', 'console.js']);\n if (!allowed.has(file)) return res.status(404).end();\n // Keep the SPA shell, styles and bundle on the same deployed revision.\n res.setHeader('Cache-Control', 'no-store, max-age=0');\n return res.sendFile(join(__dirname, '..', 'Console', file));\n }\n}\n"]}
1
+ {"version":3,"file":"AccessiConsoleController.js","sourceRoot":"","sources":["../../../src/accessi-module/Controllers/AccessiConsoleController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Controller, Get, Param, Res } from '@nestjs/common';\nimport { ApiExcludeController } from '@nestjs/swagger';\nimport { Response } from 'express';\nimport { join } from 'path';\n\n/** Serves the framework-free administrative console bundled with Accessi. API authorization remains on each API endpoint. */\n@ApiExcludeController()\n@Controller('accessi/console')\nexport class AccessiConsoleController {\n @Get()\n index(@Res() res: Response) {\n res.setHeader('Cache-Control', 'no-store, max-age=0');\n res.setHeader('Referrer-Policy', 'no-referrer');\n res.setHeader('X-Content-Type-Options', 'nosniff');\n return res.sendFile(join(__dirname, '..', 'Console', 'index.html'));\n }\n\n /**\n * Percorsi SPA ammessi. Deve restare allineato a `routeSegment` (e ai padri dei\n * sottomenu) in Console/console.ts, altrimenti i deep link restituiscono 404.\n */\n private static readonly allowedViews = new Set([\n 'utenti',\n 'ruoli-e-grant',\n 'menu-e-gruppi',\n 'menu-e-gruppi/gruppi',\n 'menu-e-gruppi/menu',\n 'menu-e-gruppi/tipi-menu',\n 'filtri',\n 'filtri/utente',\n 'filtri/tipi',\n 'sso',\n 'sso/provider',\n 'sso/utenti',\n 'token-di-servizio',\n 'wiki',\n ]);\n\n // Le route statiche vanno dichiarate prima di `:view/:sub`, che altrimenti\n // catturerebbe `assets/<file>` e restituirebbe 404 per CSS e bundle.\n @Get('assets/:file')\n asset(@Param('file') file: string, @Res() res: Response) {\n const allowed = new Set(['console.css', 'console.js']);\n if (!allowed.has(file)) return res.status(404).end();\n // Keep the SPA shell, styles and bundle on the same deployed revision.\n res.setHeader('Cache-Control', 'no-store, max-age=0');\n return res.sendFile(join(__dirname, '..', 'Console', file));\n }\n\n /**\n * Serves the SPA shell for the supported console sections, allowing direct\n * navigation, bookmarks and browser back/forward without server-side state.\n */\n @Get(':view')\n section(@Param('view') view: string, @Res() res: Response) {\n if (!AccessiConsoleController.allowedViews.has(view)) return res.status(404).end();\n return this.index(res);\n }\n\n /** Serves the SPA shell for nested sections (menu, filtri, SSO). */\n @Get(':view/:sub')\n subsection(@Param('view') view: string, @Param('sub') sub: string, @Res() res: Response) {\n if (!AccessiConsoleController.allowedViews.has(`${view}/${sub}`)) return res.status(404).end();\n return this.index(res);\n }\n}\n"]}
@@ -1,13 +1,11 @@
1
1
  import { Request, Response } from 'express';
2
- import type { AccessiOptions } from '../AccessiModule';
3
2
  import { UpdateEnabledStatusRequest } from '../Dtos';
4
3
  import { ConfiguratorService } from '../Services/ConfiguratorService/ConfiguratorService';
5
4
  import { UserService } from '../Services/UserService/UserService';
6
5
  export declare class ConfiguratorController {
7
- private readonly options;
8
6
  private userService;
9
7
  private configuratorService;
10
- constructor(options: AccessiOptions, userService: UserService, configuratorService: ConfiguratorService);
8
+ constructor(userService: UserService, configuratorService: ConfiguratorService);
11
9
  setMenuEnabled(codiceMenu: string, body: UpdateEnabledStatusRequest, req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
12
10
  setGroupEnabled(codiceGruppo: string, body: UpdateEnabledStatusRequest, req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
13
11
  }
@@ -32,8 +32,7 @@ const UserService_1 = require("../Services/UserService/UserService");
32
32
  const jwt_strategy_1 = require("../jwt/jwt.strategy");
33
33
  const accessControl_1 = require("../security/accessControl");
34
34
  let ConfiguratorController = ConfiguratorController_1 = class ConfiguratorController {
35
- constructor(options, userService, configuratorService) {
36
- this.options = options;
35
+ constructor(userService, configuratorService) {
37
36
  this.userService = userService;
38
37
  this.configuratorService = configuratorService;
39
38
  }
@@ -41,9 +40,9 @@ let ConfiguratorController = ConfiguratorController_1 = class ConfiguratorContro
41
40
  return __awaiter(this, void 0, void 0, function* () {
42
41
  try {
43
42
  if (!codiceMenu)
44
- throw new Error('Il codice del menu e obbligatorio.');
43
+ throw new common_1.BadRequestException('Il codice del menu e obbligatorio.');
45
44
  if ((body === null || body === void 0 ? void 0 : body.enabled) === undefined)
46
- throw new Error('Lo stato di abilitazione e obbligatorio.');
45
+ throw new common_1.BadRequestException('Lo stato di abilitazione e obbligatorio.');
47
46
  const authenticatedUser = (0, accessControl_1.getAuthenticatedAccessiUser)(req);
48
47
  const canConfigure = authenticatedUser.flagSuper ||
49
48
  authenticatedUser.flagAdminConfigurator ||
@@ -64,9 +63,9 @@ let ConfiguratorController = ConfiguratorController_1 = class ConfiguratorContro
64
63
  return __awaiter(this, void 0, void 0, function* () {
65
64
  try {
66
65
  if (!codiceGruppo)
67
- throw new Error('Il codice del gruppo e obbligatorio.');
66
+ throw new common_1.BadRequestException('Il codice del gruppo e obbligatorio.');
68
67
  if ((body === null || body === void 0 ? void 0 : body.enabled) === undefined)
69
- throw new Error('Lo stato di abilitazione e obbligatorio.');
68
+ throw new common_1.BadRequestException('Lo stato di abilitazione e obbligatorio.');
70
69
  const authenticatedUser = (0, accessControl_1.getAuthenticatedAccessiUser)(req);
71
70
  const canConfigure = authenticatedUser.flagSuper ||
72
71
  authenticatedUser.flagAdminConfigurator ||
@@ -144,8 +143,7 @@ exports.ConfiguratorController = ConfiguratorController = ConfiguratorController
144
143
  (0, common_1.UseGuards)(jwt_strategy_1.JwtSimpleGuard)
145
144
  /** Endpoint amministrativi per abilitare o disabilitare cataloghi menu senza cancellarne lo storico. */
146
145
  ,
147
- __param(0, (0, common_1.Inject)('ACCESSI_OPTIONS')),
148
- __metadata("design:paramtypes", [Object, UserService_1.UserService,
146
+ __metadata("design:paramtypes", [UserService_1.UserService,
149
147
  ConfiguratorService_1.ConfiguratorService])
150
148
  ], ConfiguratorController);
151
149
  //# sourceMappingURL=ConfiguratorController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfiguratorController.js","sourceRoot":"","sources":["../../../src/accessi-module/Controllers/ConfiguratorController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Body,\n Controller,\n Inject,\n Param,\n Patch,\n Req,\n Res,\n UseGuards,\n} from '@nestjs/common';\nimport {\n ApiBearerAuth,\n ApiBody,\n ApiOperation,\n ApiParam,\n ApiResponse,\n ApiTags,\n} from '@nestjs/swagger';\nimport { Request, Response } from 'express';\nimport { RestUtilities } from '../../Utilities';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { ActionResponse, ErrorResponse, UpdateEnabledStatusRequest } from '../Dtos';\nimport { ConfiguratorService } from '../Services/ConfiguratorService/ConfiguratorService';\nimport { UserService } from '../Services/UserService/UserService';\nimport { JwtSimpleGuard } from '../jwt/jwt.strategy';\nimport { getAuthenticatedAccessiUser } from '../security/accessControl';\n\n@ApiBearerAuth()\n@ApiTags('Configurator')\n@Controller('accessi/configurator')\n@UseGuards(JwtSimpleGuard)\n/** Endpoint amministrativi per abilitare o disabilitare cataloghi menu senza cancellarne lo storico. */\nexport class ConfiguratorController {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly options: AccessiOptions,\n private userService: UserService,\n private configuratorService: ConfiguratorService,\n ) {}\n\n @ApiOperation({\n summary: 'Aggiorna lo stato di abilitazione di un menu',\n operationId: 'setMenuEnabled',\n })\n @ApiParam({\n name: 'codiceMenu',\n description: 'Codice identificativo del menu da aggiornare',\n required: true,\n example: 'MNU001',\n })\n @ApiBody({ type: UpdateEnabledStatusRequest })\n @ApiResponse({ status: 200, description: 'Stato del menu aggiornato con successo', type: ActionResponse })\n @ApiResponse({ status: 400, description: 'Errore di validazione nei dati inviati', type: ErrorResponse })\n @ApiResponse({ status: 401, description: 'Utente non autenticato o token non valido', type: ErrorResponse })\n @ApiResponse({ status: 403, description: \"Utente non autorizzato ad eseguire l'operazione\", type: ErrorResponse })\n @ApiResponse({ status: 500, description: 'Errore interno del server', type: ErrorResponse })\n @Patch('menus/:codiceMenu/enabled')\n async setMenuEnabled(\n @Param('codiceMenu') codiceMenu: string,\n @Body() body: UpdateEnabledStatusRequest,\n @Req() req: Request,\n @Res() res: Response,\n ) {\n try {\n if (!codiceMenu) throw new Error('Il codice del menu e obbligatorio.');\n if (body?.enabled === undefined) throw new Error('Lo stato di abilitazione e obbligatorio.');\n\n const authenticatedUser = getAuthenticatedAccessiUser(req);\n\n const canConfigure =\n authenticatedUser.flagSuper ||\n authenticatedUser.flagAdminConfigurator ||\n (await this.userService.isAdminConfigurator(authenticatedUser.codiceUtente));\n if (!canConfigure) {\n return RestUtilities.sendErrorMessage(\n res,\n 'Utente non autorizzato ad aggiornare i menu.',\n ConfiguratorController.name,\n 403,\n );\n }\n\n await this.configuratorService.setMenuEnabled(codiceMenu, body.enabled);\n\n const action = body.enabled ? 'abilitato' : 'disabilitato';\n return RestUtilities.sendOKMessage(\n res,\n `Il menu ${codiceMenu} e stato ${action} con successo.`,\n );\n } catch (error) {\n return RestUtilities.sendErrorMessage(res, error, ConfiguratorController.name);\n }\n }\n\n @ApiOperation({\n summary: 'Aggiorna lo stato di abilitazione di un gruppo menu',\n operationId: 'setGroupEnabled',\n })\n @ApiParam({\n name: 'codiceGruppo',\n description: 'Codice identificativo del gruppo da aggiornare',\n required: true,\n example: 'GRP01',\n })\n @ApiBody({ type: UpdateEnabledStatusRequest })\n @ApiResponse({ status: 200, description: 'Stato del gruppo aggiornato con successo', type: ActionResponse })\n @ApiResponse({ status: 400, description: 'Errore di validazione nei dati inviati', type: ErrorResponse })\n @ApiResponse({ status: 401, description: 'Utente non autenticato o token non valido', type: ErrorResponse })\n @ApiResponse({ status: 403, description: \"Utente non autorizzato ad eseguire l'operazione\", type: ErrorResponse })\n @ApiResponse({ status: 500, description: 'Errore interno del server', type: ErrorResponse })\n @Patch('groups/:codiceGruppo/enabled')\n async setGroupEnabled(\n @Param('codiceGruppo') codiceGruppo: string,\n @Body() body: UpdateEnabledStatusRequest,\n @Req() req: Request,\n @Res() res: Response,\n ) {\n try {\n if (!codiceGruppo) throw new Error('Il codice del gruppo e obbligatorio.');\n if (body?.enabled === undefined) throw new Error('Lo stato di abilitazione e obbligatorio.');\n\n const authenticatedUser = getAuthenticatedAccessiUser(req);\n\n const canConfigure =\n authenticatedUser.flagSuper ||\n authenticatedUser.flagAdminConfigurator ||\n (await this.userService.isAdminConfigurator(authenticatedUser.codiceUtente));\n if (!canConfigure) {\n return RestUtilities.sendErrorMessage(\n res,\n 'Utente non autorizzato ad aggiornare i gruppi menu.',\n ConfiguratorController.name,\n 403,\n );\n }\n\n await this.configuratorService.setGroupEnabled(codiceGruppo, body.enabled);\n\n const action = body.enabled ? 'abilitato' : 'disabilitato';\n return RestUtilities.sendOKMessage(\n res,\n `Il gruppo ${codiceGruppo} e stato ${action} con successo.`,\n );\n } catch (error) {\n return RestUtilities.sendErrorMessage(res, error, ConfiguratorController.name);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ConfiguratorController.js","sourceRoot":"","sources":["../../../src/accessi-module/Controllers/ConfiguratorController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CASwB;AACxB,6CAOyB;AAEzB,+CAAgD;AAChD,kCAAoF;AACpF,6FAA0F;AAC1F,qEAAkE;AAClE,sDAAqD;AACrD,6DAAwE;AAOjE,IAAM,sBAAsB,8BAA5B,MAAM,sBAAsB;IACjC,YACU,WAAwB,EACxB,mBAAwC;QADxC,gBAAW,GAAX,WAAW,CAAa;QACxB,wBAAmB,GAAnB,mBAAmB,CAAqB;IAC/C,CAAC;IAmBE,cAAc,CACG,UAAkB,EAC/B,IAAgC,EACjC,GAAY,EACZ,GAAa;;YAEpB,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU;oBAAE,MAAM,IAAI,4BAAmB,CAAC,oCAAoC,CAAC,CAAC;gBACrF,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,MAAK,SAAS;oBAAE,MAAM,IAAI,4BAAmB,CAAC,0CAA0C,CAAC,CAAC;gBAE3G,MAAM,iBAAiB,GAAG,IAAA,2CAA2B,EAAC,GAAG,CAAC,CAAC;gBAE3D,MAAM,YAAY,GAChB,iBAAiB,CAAC,SAAS;oBAC3B,iBAAiB,CAAC,qBAAqB;oBACvC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,yBAAa,CAAC,gBAAgB,CACnC,GAAG,EACH,8CAA8C,EAC9C,wBAAsB,CAAC,IAAI,EAC3B,GAAG,CACJ,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAExE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC3D,OAAO,yBAAa,CAAC,aAAa,CAChC,GAAG,EACH,WAAW,UAAU,YAAY,MAAM,gBAAgB,CACxD,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,yBAAa,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,wBAAsB,CAAC,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;KAAA;IAmBK,eAAe,CACI,YAAoB,EACnC,IAAgC,EACjC,GAAY,EACZ,GAAa;;YAEpB,IAAI,CAAC;gBACH,IAAI,CAAC,YAAY;oBAAE,MAAM,IAAI,4BAAmB,CAAC,sCAAsC,CAAC,CAAC;gBACzF,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,MAAK,SAAS;oBAAE,MAAM,IAAI,4BAAmB,CAAC,0CAA0C,CAAC,CAAC;gBAE3G,MAAM,iBAAiB,GAAG,IAAA,2CAA2B,EAAC,GAAG,CAAC,CAAC;gBAE3D,MAAM,YAAY,GAChB,iBAAiB,CAAC,SAAS;oBAC3B,iBAAiB,CAAC,qBAAqB;oBACvC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,yBAAa,CAAC,gBAAgB,CACnC,GAAG,EACH,qDAAqD,EACrD,wBAAsB,CAAC,IAAI,EAC3B,GAAG,CACJ,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAE3E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC3D,OAAO,yBAAa,CAAC,aAAa,CAChC,GAAG,EACH,aAAa,YAAY,YAAY,MAAM,gBAAgB,CAC5D,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,yBAAa,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,wBAAsB,CAAC,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AAjHY,wDAAsB;AAuB3B;IAjBL,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,8CAA8C;QACvD,WAAW,EAAE,gBAAgB;KAC9B,CAAC;IACD,IAAA,kBAAQ,EAAC;QACR,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,8CAA8C;QAC3D,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,QAAQ;KAClB,CAAC;IACD,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,iCAA0B,EAAE,CAAC;IAC7C,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,wCAAwC,EAAE,IAAI,EAAE,qBAAc,EAAE,CAAC;IACzG,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,wCAAwC,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IACxG,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,2CAA2C,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IAC3G,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,iDAAiD,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IACjH,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IAC3F,IAAA,cAAK,EAAC,2BAA2B,CAAC;IAEhC,WAAA,IAAA,cAAK,EAAC,YAAY,CAAC,CAAA;IACnB,WAAA,IAAA,aAAI,GAAE,CAAA;IACN,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,YAAG,GAAE,CAAA;;6CAFQ,iCAA0B;;4DAiCzC;AAmBK;IAjBL,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,qDAAqD;QAC9D,WAAW,EAAE,iBAAiB;KAC/B,CAAC;IACD,IAAA,kBAAQ,EAAC;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,gDAAgD;QAC7D,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,OAAO;KACjB,CAAC;IACD,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,iCAA0B,EAAE,CAAC;IAC7C,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,0CAA0C,EAAE,IAAI,EAAE,qBAAc,EAAE,CAAC;IAC3G,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,wCAAwC,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IACxG,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,2CAA2C,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IAC3G,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,iDAAiD,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IACjH,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAa,EAAE,CAAC;IAC3F,IAAA,cAAK,EAAC,8BAA8B,CAAC;IAEnC,WAAA,IAAA,cAAK,EAAC,cAAc,CAAC,CAAA;IACrB,WAAA,IAAA,aAAI,GAAE,CAAA;IACN,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,YAAG,GAAE,CAAA;;6CAFQ,iCAA0B;;6DAiCzC;iCAhHU,sBAAsB;IALlC,IAAA,uBAAa,GAAE;IACf,IAAA,iBAAO,EAAC,cAAc,CAAC;IACvB,IAAA,mBAAU,EAAC,sBAAsB,CAAC;IAClC,IAAA,kBAAS,EAAC,6BAAc,CAAC;IAC1B,wGAAwG;;qCAG/E,yBAAW;QACH,yCAAmB;GAHvC,sBAAsB,CAiHlC","sourcesContent":["import {\r\n BadRequestException,\r\n Body,\r\n Controller,\r\n Param,\r\n Patch,\r\n Req,\r\n Res,\r\n UseGuards,\r\n} from '@nestjs/common';\r\nimport {\r\n ApiBearerAuth,\r\n ApiBody,\r\n ApiOperation,\r\n ApiParam,\r\n ApiResponse,\r\n ApiTags,\r\n} from '@nestjs/swagger';\r\nimport { Request, Response } from 'express';\r\nimport { RestUtilities } from '../../Utilities';\r\nimport { ActionResponse, ErrorResponse, UpdateEnabledStatusRequest } from '../Dtos';\r\nimport { ConfiguratorService } from '../Services/ConfiguratorService/ConfiguratorService';\r\nimport { UserService } from '../Services/UserService/UserService';\r\nimport { JwtSimpleGuard } from '../jwt/jwt.strategy';\r\nimport { getAuthenticatedAccessiUser } from '../security/accessControl';\r\n\r\n@ApiBearerAuth()\r\n@ApiTags('Configurator')\r\n@Controller('accessi/configurator')\r\n@UseGuards(JwtSimpleGuard)\r\n/** Endpoint amministrativi per abilitare o disabilitare cataloghi menu senza cancellarne lo storico. */\r\nexport class ConfiguratorController {\r\n constructor(\r\n private userService: UserService,\r\n private configuratorService: ConfiguratorService,\r\n ) {}\r\n\r\n @ApiOperation({\r\n summary: 'Aggiorna lo stato di abilitazione di un menu',\r\n operationId: 'setMenuEnabled',\r\n })\r\n @ApiParam({\r\n name: 'codiceMenu',\r\n description: 'Codice identificativo del menu da aggiornare',\r\n required: true,\r\n example: 'MNU001',\r\n })\r\n @ApiBody({ type: UpdateEnabledStatusRequest })\r\n @ApiResponse({ status: 200, description: 'Stato del menu aggiornato con successo', type: ActionResponse })\r\n @ApiResponse({ status: 400, description: 'Errore di validazione nei dati inviati', type: ErrorResponse })\r\n @ApiResponse({ status: 401, description: 'Utente non autenticato o token non valido', type: ErrorResponse })\r\n @ApiResponse({ status: 403, description: \"Utente non autorizzato ad eseguire l'operazione\", type: ErrorResponse })\r\n @ApiResponse({ status: 500, description: 'Errore interno del server', type: ErrorResponse })\r\n @Patch('menus/:codiceMenu/enabled')\r\n async setMenuEnabled(\r\n @Param('codiceMenu') codiceMenu: string,\r\n @Body() body: UpdateEnabledStatusRequest,\r\n @Req() req: Request,\r\n @Res() res: Response,\r\n ) {\r\n try {\r\n if (!codiceMenu) throw new BadRequestException('Il codice del menu e obbligatorio.');\r\n if (body?.enabled === undefined) throw new BadRequestException('Lo stato di abilitazione e obbligatorio.');\r\n\r\n const authenticatedUser = getAuthenticatedAccessiUser(req);\r\n\r\n const canConfigure =\r\n authenticatedUser.flagSuper ||\r\n authenticatedUser.flagAdminConfigurator ||\r\n (await this.userService.isAdminConfigurator(authenticatedUser.codiceUtente));\r\n if (!canConfigure) {\r\n return RestUtilities.sendErrorMessage(\r\n res,\r\n 'Utente non autorizzato ad aggiornare i menu.',\r\n ConfiguratorController.name,\r\n 403,\r\n );\r\n }\r\n\r\n await this.configuratorService.setMenuEnabled(codiceMenu, body.enabled);\r\n\r\n const action = body.enabled ? 'abilitato' : 'disabilitato';\r\n return RestUtilities.sendOKMessage(\r\n res,\r\n `Il menu ${codiceMenu} e stato ${action} con successo.`,\r\n );\r\n } catch (error) {\r\n return RestUtilities.sendErrorMessage(res, error, ConfiguratorController.name);\r\n }\r\n }\r\n\r\n @ApiOperation({\r\n summary: 'Aggiorna lo stato di abilitazione di un gruppo menu',\r\n operationId: 'setGroupEnabled',\r\n })\r\n @ApiParam({\r\n name: 'codiceGruppo',\r\n description: 'Codice identificativo del gruppo da aggiornare',\r\n required: true,\r\n example: 'GRP01',\r\n })\r\n @ApiBody({ type: UpdateEnabledStatusRequest })\r\n @ApiResponse({ status: 200, description: 'Stato del gruppo aggiornato con successo', type: ActionResponse })\r\n @ApiResponse({ status: 400, description: 'Errore di validazione nei dati inviati', type: ErrorResponse })\r\n @ApiResponse({ status: 401, description: 'Utente non autenticato o token non valido', type: ErrorResponse })\r\n @ApiResponse({ status: 403, description: \"Utente non autorizzato ad eseguire l'operazione\", type: ErrorResponse })\r\n @ApiResponse({ status: 500, description: 'Errore interno del server', type: ErrorResponse })\r\n @Patch('groups/:codiceGruppo/enabled')\r\n async setGroupEnabled(\r\n @Param('codiceGruppo') codiceGruppo: string,\r\n @Body() body: UpdateEnabledStatusRequest,\r\n @Req() req: Request,\r\n @Res() res: Response,\r\n ) {\r\n try {\r\n if (!codiceGruppo) throw new BadRequestException('Il codice del gruppo e obbligatorio.');\r\n if (body?.enabled === undefined) throw new BadRequestException('Lo stato di abilitazione e obbligatorio.');\r\n\r\n const authenticatedUser = getAuthenticatedAccessiUser(req);\r\n\r\n const canConfigure =\r\n authenticatedUser.flagSuper ||\r\n authenticatedUser.flagAdminConfigurator ||\r\n (await this.userService.isAdminConfigurator(authenticatedUser.codiceUtente));\r\n if (!canConfigure) {\r\n return RestUtilities.sendErrorMessage(\r\n res,\r\n 'Utente non autorizzato ad aggiornare i gruppi menu.',\r\n ConfiguratorController.name,\r\n 403,\r\n );\r\n }\r\n\r\n await this.configuratorService.setGroupEnabled(codiceGruppo, body.enabled);\r\n\r\n const action = body.enabled ? 'abilitato' : 'disabilitato';\r\n return RestUtilities.sendOKMessage(\r\n res,\r\n `Il gruppo ${codiceGruppo} e stato ${action} con successo.`,\r\n );\r\n } catch (error) {\r\n return RestUtilities.sendErrorMessage(res, error, ConfiguratorController.name);\r\n }\r\n }\r\n}\r\n"]}
@@ -6,6 +6,6 @@ export declare class EmailController {
6
6
  private readonly accessiOptions;
7
7
  private readonly emailService;
8
8
  constructor(accessiOptions: AccessiOptions, emailService: EmailService);
9
- serveResetPasswordPage(res: Response, token: string, returnUrl?: string): Promise<void>;
9
+ serveResetPasswordPage(res: Response, _token: string, _returnUrl?: string): Promise<void>;
10
10
  sendPasswordResetEmail(request: Request, sendResetPasswordData: SendResetPasswordEmailRequest, res: Response): Promise<Response<any, Record<string, any>>>;
11
11
  }
@@ -35,7 +35,7 @@ let EmailController = EmailController_1 = class EmailController {
35
35
  this.accessiOptions = accessiOptions;
36
36
  this.emailService = emailService;
37
37
  }
38
- serveResetPasswordPage(res, token, returnUrl) {
38
+ serveResetPasswordPage(res, _token, _returnUrl) {
39
39
  return __awaiter(this, void 0, void 0, function* () {
40
40
  return res.sendFile((0, path_1.join)(__dirname, '..', 'Views', 'reset-password.html'));
41
41
  });
@@ -1 +1 @@
1
- {"version":3,"file":"EmailController.js","sourceRoot":"","sources":["../../../src/accessi-module/Controllers/EmailController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6F;AAC7F,6CAAkG;AAElG,+BAA4B;AAC5B,+CAAgD;AAEhD,kCAAuF;AACvF,wEAAqE;AACrE,yEAGyC;AAKlC,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,YAC8C,cAA8B,EACzD,YAA0B;QADC,mBAAc,GAAd,cAAc,CAAgB;QACzD,iBAAY,GAAZ,YAAY,CAAc;IAC1C,CAAC;IAcE,sBAAsB,CACnB,GAAa,EACJ,KAAa,EACT,SAAkB;;YAEtC,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC7E,CAAC;KAAA;IAkBK,sBAAsB,CACnB,OAAgB,EACf,qBAAoD,EACrD,GAAa;;YAEpB,IAAI,CAAC;gBACH,MAAM,iBAAiB,GAAG,IAAA,8CAAwB,EAChD,IAAI,CAAC,cAAc,EACnB,oBAAoB,EACpB,OAAO,EACP,CAAC,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,KAAK,CAAC,CAC/B,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;oBAC/B,OAAO,IAAA,qDAA+B,EAAC,GAAG,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBACnF,CAAC;gBAED,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBAC5E,OAAO,yBAAa,CAAC,aAAa,CAChC,GAAG,EACH,0EAA0E,CAC3E,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,yBAAa,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAe,CAAC,IAAI,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AAnEY,0CAAe;AAkBpB;IAZL,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,8CAA8C;QACvD,WAAW,EAAE,wBAAwB;KACtC,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,mCAAmC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC7F,IAAA,kBAAQ,EAAC;QACR,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;IAC1F,IAAA,YAAG,EAAC,4BAA4B,CAAC;IAE/B,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,cAAK,EAAC,OAAO,CAAC,CAAA;IACd,WAAA,IAAA,cAAK,EAAC,WAAW,CAAC,CAAA;;;;6DAGpB;AAkBK;IAhBL,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,8CAA8C;QACvD,WAAW,EAAE,wBAAwB;KACtC,CAAC;IACD,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,oCAA6B,EAAE,CAAC;IAChD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,+CAA+C;QAC5D,IAAI,EAAE,qBAAc;KACrB,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,2CAA2C;QACxD,IAAI,EAAE,oBAAa;KACpB,CAAC;IACD,IAAA,aAAI,EAAC,2BAA2B,CAAC;IAE/B,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,aAAI,GAAE,CAAA;IACN,WAAA,IAAA,YAAG,GAAE,CAAA;;6CADyB,oCAA6B;;6DAsB7D;0BAlEU,eAAe;IAH3B,IAAA,iBAAO,EAAC,OAAO,CAAC;IAChB,IAAA,mBAAU,EAAC,eAAe,CAAC;IAC5B,8FAA8F;;IAGzF,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;6CACK,2BAAY;GAHlC,eAAe,CAmE3B","sourcesContent":["import { Body, Controller, Get, Inject, Param, Post, Query, Req, Res } from '@nestjs/common';\nimport { ApiBody, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';\nimport { Request, Response } from 'express';\nimport { join } from 'path';\nimport { RestUtilities } from '../../Utilities';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { ActionResponse, ErrorResponse, SendResetPasswordEmailRequest } from '../Dtos';\nimport { EmailService } from '../Services/EmailService/EmailService';\nimport {\n checkPublicAuthRateLimit,\n sendPublicAuthRateLimitExceeded,\n} from '../security/publicAuthRateLimit';\n\n@ApiTags('Email')\n@Controller('accessi/email')\n/** Endpoint pubblici del ciclo reset password; le risposte non rivelano se l'email esiste. */\nexport class EmailController {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly emailService: EmailService,\n ) {}\n\n @ApiOperation({\n summary: 'Serve una pagina per il reset della password',\n operationId: 'serveResetPasswordPage',\n })\n @ApiParam({ name: 'token', description: 'Token per il reset della password', required: true })\n @ApiQuery({\n name: 'returnUrl',\n description: 'Url di ritorno della pagina',\n required: false,\n })\n @ApiResponse({ status: 200, description: 'Pagina di reset password servita con successo' })\n @Get('reset-password-page/:token')\n async serveResetPasswordPage(\n @Res() res: Response,\n @Param('token') token: string,\n @Query('returnUrl') returnUrl?: string,\n ) {\n return res.sendFile(join(__dirname, '..', 'Views', 'reset-password.html'));\n }\n\n @ApiOperation({\n summary: 'Invia una e-mail per il reset della password',\n operationId: 'sendPasswordResetEmail',\n })\n @ApiBody({ type: SendResetPasswordEmailRequest })\n @ApiResponse({\n status: 200,\n description: \"L'email di reset e stata gestita con successo\",\n type: ActionResponse,\n })\n @ApiResponse({\n status: 500,\n description: \"Errore interno durante l'invio dell'email\",\n type: ErrorResponse,\n })\n @Post('send-reset-password-email')\n async sendPasswordResetEmail(\n @Req() request: Request,\n @Body() sendResetPasswordData: SendResetPasswordEmailRequest,\n @Res() res: Response,\n ) {\n try {\n const rateLimitDecision = checkPublicAuthRateLimit(\n this.accessiOptions,\n 'passwordResetEmail',\n request,\n [sendResetPasswordData?.email],\n );\n if (!rateLimitDecision.allowed) {\n return sendPublicAuthRateLimitExceeded(res, rateLimitDecision.retryAfterSeconds);\n }\n\n await this.emailService.sendPasswordResetEmail(sendResetPasswordData.email);\n return RestUtilities.sendOKMessage(\n res,\n \"Se l'account esiste, l'email di reset e stata inoltrata al destinatario.\",\n );\n } catch (error) {\n return RestUtilities.sendErrorMessage(res, error, EmailController.name);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"EmailController.js","sourceRoot":"","sources":["../../../src/accessi-module/Controllers/EmailController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Body, Controller, Get, Inject, Param, Post, Query, Req, Res } from '@nestjs/common';\nimport { ApiBody, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';\nimport { Request, Response } from 'express';\nimport { join } from 'path';\nimport { RestUtilities } from '../../Utilities';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { ActionResponse, ErrorResponse, SendResetPasswordEmailRequest } from '../Dtos';\nimport { EmailService } from '../Services/EmailService/EmailService';\nimport {\n checkPublicAuthRateLimit,\n sendPublicAuthRateLimitExceeded,\n} from '../security/publicAuthRateLimit';\n\n@ApiTags('Email')\n@Controller('accessi/email')\n/** Endpoint pubblici del ciclo reset password; le risposte non rivelano se l'email esiste. */\nexport class EmailController {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly emailService: EmailService,\n ) {}\n\n @ApiOperation({\n summary: 'Serve una pagina per il reset della password',\n operationId: 'serveResetPasswordPage',\n })\n @ApiParam({ name: 'token', description: 'Token per il reset della password', required: true })\n @ApiQuery({\n name: 'returnUrl',\n description: 'Url di ritorno della pagina',\n required: false,\n })\n @ApiResponse({ status: 200, description: 'Pagina di reset password servita con successo' })\n @Get('reset-password-page/:token')\n async serveResetPasswordPage(\n @Res() res: Response,\n @Param('token') _token: string,\n @Query('returnUrl') _returnUrl?: string,\n ) {\n return res.sendFile(join(__dirname, '..', 'Views', 'reset-password.html'));\n }\n\n @ApiOperation({\n summary: 'Invia una e-mail per il reset della password',\n operationId: 'sendPasswordResetEmail',\n })\n @ApiBody({ type: SendResetPasswordEmailRequest })\n @ApiResponse({\n status: 200,\n description: \"L'email di reset e stata gestita con successo\",\n type: ActionResponse,\n })\n @ApiResponse({\n status: 500,\n description: \"Errore interno durante l'invio dell'email\",\n type: ErrorResponse,\n })\n @Post('send-reset-password-email')\n async sendPasswordResetEmail(\n @Req() request: Request,\n @Body() sendResetPasswordData: SendResetPasswordEmailRequest,\n @Res() res: Response,\n ) {\n try {\n const rateLimitDecision = checkPublicAuthRateLimit(\n this.accessiOptions,\n 'passwordResetEmail',\n request,\n [sendResetPasswordData?.email],\n );\n if (!rateLimitDecision.allowed) {\n return sendPublicAuthRateLimitExceeded(res, rateLimitDecision.retryAfterSeconds);\n }\n\n await this.emailService.sendPasswordResetEmail(sendResetPasswordData.email);\n return RestUtilities.sendOKMessage(\n res,\n \"Se l'account esiste, l'email di reset e stata inoltrata al destinatario.\",\n );\n } catch (error) {\n return RestUtilities.sendErrorMessage(res, error, EmailController.name);\n }\n }\n}\n"]}
@@ -1,12 +1,13 @@
1
1
  import { Request, Response } from 'express';
2
- import type { AccessiOptions } from '../AccessiModule';
3
- import { FiltriUtente, GetFiltriUtenteRequest } from '../Dtos';
2
+ import { CreateFilterTypeRequest, FiltriUtente, GetFiltriUtenteRequest, UpdateFilterTypeRequest } from '../Dtos';
4
3
  import { FiltriService } from '../Services/FiltriService/FiltriService';
5
4
  export declare class FiltriController {
6
5
  private readonly filtriService;
7
- private readonly options;
8
- constructor(filtriService: FiltriService, options: AccessiOptions);
6
+ constructor(filtriService: FiltriService);
9
7
  getTipoFiltri(res: Response): Promise<Response<any, Record<string, any>>>;
8
+ createTipoFiltro(request: Request, res: Response, body: CreateFilterTypeRequest): Promise<Response<any, Record<string, any>>>;
9
+ updateTipoFiltro(request: Request, res: Response, tipFil: number, body: UpdateFilterTypeRequest): Promise<Response<any, Record<string, any>>>;
10
+ deleteTipoFiltro(request: Request, res: Response, tipFil: number): Promise<Response<any, Record<string, any>>>;
10
11
  getFiltriUtente(request: Request, res: Response, req: GetFiltriUtenteRequest): Promise<Response<any, Record<string, any>>>;
11
12
  saveFiltriUtente(request: Request, res: Response, req: FiltriUtente): Promise<Response<any, Record<string, any>>>;
12
13
  }