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
@@ -46,22 +46,25 @@ let PermissionService = class PermissionService {
46
46
  const rawValue = (_d = (_b = (_a = result === null || result === void 0 ? void 0 : result[0]) === null || _a === void 0 ? void 0 : _a[fieldName]) !== null && _b !== void 0 ? _b : (_c = result === null || result === void 0 ? void 0 : result[0]) === null || _c === void 0 ? void 0 : _c[fieldName.toLowerCase()]) !== null && _d !== void 0 ? _d : (_e = result === null || result === void 0 ? void 0 : result[0]) === null || _e === void 0 ? void 0 : _e.count;
47
47
  return typeof rawValue === 'number' ? rawValue : Number.parseInt(`${rawValue !== null && rawValue !== void 0 ? rawValue : '0'}`, 10);
48
48
  }
49
+ extractIntegerColumn(result, fieldName) {
50
+ return new Set(result.map((row) => { var _a; return Number((_a = row[fieldName]) !== null && _a !== void 0 ? _a : row[fieldName.toLowerCase()]); }));
51
+ }
49
52
  getAllActiveMenusAsGrants() {
50
53
  return __awaiter(this, void 0, void 0, function* () {
51
- const query = `
52
- SELECT
53
- M.CODMNU AS codice_menu,
54
- 30 AS tipo_abilitazione,
55
- M.DESMNU AS descrizione_menu,
56
- G.DESGRP AS descrizione_gruppo,
57
- G.CODGRP AS codice_gruppo,
58
- M.ICON AS icona,
59
- M.CODTIP AS tipo,
60
- M.PAGINA AS pagina,
61
- M.NOTE AS note
62
- FROM MENU M
63
- LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
64
- WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
54
+ const query = `
55
+ SELECT
56
+ M.CODMNU AS codice_menu,
57
+ 30 AS tipo_abilitazione,
58
+ M.DESMNU AS descrizione_menu,
59
+ G.DESGRP AS descrizione_gruppo,
60
+ G.CODGRP AS codice_gruppo,
61
+ M.ICON AS icona,
62
+ M.CODTIP AS tipo,
63
+ M.PAGINA AS pagina,
64
+ M.NOTE AS note
65
+ FROM MENU M
66
+ LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
67
+ WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
65
68
  `;
66
69
  return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, [])
67
70
  .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase));
@@ -69,21 +72,21 @@ let PermissionService = class PermissionService {
69
72
  }
70
73
  getUserDirectPermissions(codiceUtente) {
71
74
  return __awaiter(this, void 0, void 0, function* () {
72
- const queryAbilitazioni = `
73
- SELECT
74
- A.CODMNU AS codice_menu,
75
- A.TIPABI AS tipo_abilitazione,
76
- M.DESMNU AS descrizione_menu,
77
- G.DESGRP AS descrizione_gruppo,
78
- G.CODGRP AS codice_gruppo,
79
- M.ICON AS icona,
80
- M.CODTIP AS tipo,
81
- M.PAGINA AS pagina,
82
- M.NOTE AS note
83
- FROM ABILITAZIONI A
84
- INNER JOIN MENU M ON A.CODMNU = M.CODMNU
85
- LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
86
- WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
75
+ const queryAbilitazioni = `
76
+ SELECT
77
+ A.CODMNU AS codice_menu,
78
+ A.TIPABI AS tipo_abilitazione,
79
+ M.DESMNU AS descrizione_menu,
80
+ G.DESGRP AS descrizione_gruppo,
81
+ G.CODGRP AS codice_gruppo,
82
+ M.ICON AS icona,
83
+ M.CODTIP AS tipo,
84
+ M.PAGINA AS pagina,
85
+ M.NOTE AS note
86
+ FROM ABILITAZIONI A
87
+ INNER JOIN MENU M ON A.CODMNU = M.CODMNU
88
+ LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
89
+ WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
87
90
  `;
88
91
  return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente])
89
92
  .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase));
@@ -91,46 +94,72 @@ let PermissionService = class PermissionService {
91
94
  }
92
95
  getUserRoles(codiceUtente) {
93
96
  return __awaiter(this, void 0, void 0, function* () {
94
- const queryRuoli = `
95
- SELECT
96
- R.CODRUO AS codice_ruolo,
97
- R.DESRUO AS descrizione_ruolo,
98
- CASE WHEN COALESCE(G.FLGENABLED, 1) = 1 THEN M.CODMNU END AS codice_menu,
99
- RM.TIPABI AS tipo_abilitazione,
100
- M.DESMNU AS descrizione_menu,
101
- M.NOTE AS note
102
- FROM UTENTI_RUOLI RU
103
- INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO
104
- LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
105
- LEFT JOIN MENU M
106
- ON RM.CODMNU = M.CODMNU
107
- AND M.FLGENABLED = 1
108
- LEFT JOIN MENU_GRP G
109
- ON G.CODGRP = M.CODGRP
110
- WHERE RU.CODUTE = ?
97
+ const queryRuoli = `
98
+ SELECT
99
+ R.CODRUO AS codice_ruolo,
100
+ R.DESRUO AS descrizione_ruolo,
101
+ CASE WHEN COALESCE(G.FLGENABLED, 1) = 1 THEN M.CODMNU END AS codice_menu,
102
+ RM.TIPABI AS tipo_abilitazione,
103
+ M.DESMNU AS descrizione_menu,
104
+ M.NOTE AS note
105
+ FROM UTENTI_RUOLI RU
106
+ INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO
107
+ LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
108
+ LEFT JOIN MENU M
109
+ ON RM.CODMNU = M.CODMNU
110
+ AND M.FLGENABLED = 1
111
+ LEFT JOIN MENU_GRP G
112
+ ON G.CODGRP = M.CODGRP
113
+ WHERE RU.CODUTE = ?
111
114
  `;
112
- let ruoliResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]);
113
- ruoliResult = ruoliResult.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
114
- const ruoliMap = new Map();
115
- for (const row of ruoliResult) {
116
- const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;
117
- if (!ruoliMap.has(codiceRuolo)) {
118
- ruoliMap.set(codiceRuolo, {
119
- codiceRuolo,
120
- descrizioneRuolo: descrizioneRuolo === null || descrizioneRuolo === void 0 ? void 0 : descrizioneRuolo.trim(),
121
- menu: []
122
- });
123
- }
124
- if (codiceMenu && descrizioneMenu) {
125
- ruoliMap.get(codiceRuolo).menu.push({
126
- codiceRuolo: codiceRuolo,
127
- codiceMenu: codiceMenu.trim(),
128
- tipoAbilitazione,
129
- });
115
+ const ruoliResult = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]))
116
+ .map(Utilities_1.RestUtilities.convertKeysToCamelCase);
117
+ return this.assembleRoles(ruoliResult);
118
+ });
119
+ }
120
+ /** Costruisce l'albero ruoli/menu a partire dalle righe (riusato da lettura singola e batch). */
121
+ assembleRoles(ruoliResult) {
122
+ const ruoliMap = new Map();
123
+ for (const row of ruoliResult) {
124
+ const codiceRuolo = Number(row.codiceRuolo);
125
+ const descrizioneRuolo = typeof row.descrizioneRuolo === 'string' ? row.descrizioneRuolo.trim() : '';
126
+ const codiceMenu = typeof row.codiceMenu === 'string' ? row.codiceMenu : undefined;
127
+ const descrizioneMenu = typeof row.descrizioneMenu === 'string' ? row.descrizioneMenu : undefined;
128
+ const tipoAbilitazione = Number(row.tipoAbilitazione);
129
+ if (!ruoliMap.has(codiceRuolo)) {
130
+ ruoliMap.set(codiceRuolo, {
131
+ codiceRuolo,
132
+ descrizioneRuolo,
133
+ menu: []
134
+ });
135
+ }
136
+ if (codiceMenu && descrizioneMenu) {
137
+ ruoliMap.get(codiceRuolo).menu.push({
138
+ codiceRuolo,
139
+ codiceMenu,
140
+ tipoAbilitazione,
141
+ });
142
+ }
143
+ }
144
+ return Array.from(ruoliMap.values());
145
+ }
146
+ /** Regola di composizione storica: grant diretti prevalgono, i ruoli si sommano per livello massimo. */
147
+ composeGrants(abilitazioni, ruoli, isSuperAdmin, allActiveMenus) {
148
+ const grantsMap = new Map();
149
+ for (const abilitazione of abilitazioni) {
150
+ grantsMap.set(abilitazione.codiceMenu, abilitazione);
151
+ }
152
+ const directMenuCodes = new Set(abilitazioni.map(grant => grant.codiceMenu));
153
+ for (const ruolo of ruoli) {
154
+ for (const menu of ruolo.menu) {
155
+ const existing = grantsMap.get(menu.codiceMenu);
156
+ if (!directMenuCodes.has(menu.codiceMenu) &&
157
+ (!existing || Number(menu.tipoAbilitazione) > Number(existing.tipoAbilitazione))) {
158
+ grantsMap.set(menu.codiceMenu, menu);
130
159
  }
131
160
  }
132
- return Array.from(ruoliMap.values());
133
- });
161
+ }
162
+ return isSuperAdmin ? allActiveMenus : Array.from(grantsMap.values());
134
163
  }
135
164
  /**
136
165
  * API legacy per salvare grant dalla struttura storica menu/gruppi.
@@ -138,16 +167,16 @@ let PermissionService = class PermissionService {
138
167
  */
139
168
  addAbilitazioni(codiceUtente, menuAbilitazioni) {
140
169
  return __awaiter(this, void 0, void 0, function* () {
141
- const deleteQuery = `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`;
142
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);
143
170
  const abilitazioniToInsert = menuAbilitazioni
144
- .flatMap(menuGrp => menuGrp.menu)
171
+ .flatMap(menuGrp => { var _a; return (_a = menuGrp.menu) !== null && _a !== void 0 ? _a : []; })
145
172
  .filter(menu => menu.flgChk)
146
173
  .map(menu => [codiceUtente, menu.codiceMenu, menu.tipoAbilitazione]);
147
174
  const insertQuery = `UPDATE OR INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`;
148
- for (const params of abilitazioniToInsert) {
149
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, insertQuery, params);
150
- }
175
+ // Delete + insert atomici: un errore a metà non lascia l'utente senza abilitazioni.
176
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, [
177
+ { query: `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`, params: [codiceUtente] },
178
+ ...abilitazioniToInsert.map(params => ({ query: insertQuery, params })),
179
+ ]);
151
180
  });
152
181
  }
153
182
  /** Rimuove tutti i grant diretti, senza toccare ruoli o menu ereditati dai ruoli. */
@@ -163,74 +192,75 @@ let PermissionService = class PermissionService {
163
192
  */
164
193
  updateOrInsertRole(role_1) {
165
194
  return __awaiter(this, arguments, void 0, function* (role, codiceRuolo = null) {
166
- var _a, _b, _c;
167
- // creazione nuovo ruolo
168
- if (codiceRuolo == null) {
169
- const createRoleQuery = `INSERT INTO RUOLI (DESRUO) VALUES (?)`;
170
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, createRoleQuery, [role.descrizioneRuolo]);
171
- const createdRoleResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT FIRST 1 CODRUO FROM RUOLI WHERE DESRUO = ? ORDER BY CODRUO DESC', [role.descrizioneRuolo]);
172
- const rawCodiceRuolo = (_b = (_a = createdRoleResult === null || createdRoleResult === void 0 ? void 0 : createdRoleResult[0]) === null || _a === void 0 ? void 0 : _a.CODRUO) !== null && _b !== void 0 ? _b : (_c = createdRoleResult === null || createdRoleResult === void 0 ? void 0 : createdRoleResult[0]) === null || _c === void 0 ? void 0 : _c.codruo;
173
- const parsedCodiceRuolo = typeof rawCodiceRuolo === 'number'
174
- ? rawCodiceRuolo
175
- : Number.parseInt(`${rawCodiceRuolo !== null && rawCodiceRuolo !== void 0 ? rawCodiceRuolo : ''}`, 10);
176
- if (Number.isNaN(parsedCodiceRuolo)) {
177
- throw new Error('Creazione ruolo non riuscita: impossibile recuperare CODRUO.');
195
+ // Ruolo, sostituzione menu e inserimenti in un'unica transazione: niente ruoli senza menu in caso di errore.
196
+ yield Orm_1.Orm.withTransaction(this.accessiOptions.databaseOptions, (transaction) => __awaiter(this, void 0, void 0, function* () {
197
+ var _a;
198
+ let resolvedCodiceRuolo = codiceRuolo;
199
+ if (resolvedCodiceRuolo == null) {
200
+ const createdRoleResult = yield Orm_1.Orm.transactionQuery(transaction, `INSERT INTO RUOLI (DESRUO) VALUES (?) RETURNING CODRUO`, [role.descrizioneRuolo]);
201
+ const createdRole = (Array.isArray(createdRoleResult) ? createdRoleResult[0] : createdRoleResult);
202
+ const rawCodiceRuolo = (_a = createdRole === null || createdRole === void 0 ? void 0 : createdRole.CODRUO) !== null && _a !== void 0 ? _a : createdRole === null || createdRole === void 0 ? void 0 : createdRole.codruo;
203
+ const parsedCodiceRuolo = typeof rawCodiceRuolo === 'number'
204
+ ? rawCodiceRuolo
205
+ : Number.parseInt(`${rawCodiceRuolo !== null && rawCodiceRuolo !== void 0 ? rawCodiceRuolo : ''}`, 10);
206
+ if (Number.isNaN(parsedCodiceRuolo)) {
207
+ throw new Error('Creazione ruolo non riuscita: impossibile recuperare CODRUO.');
208
+ }
209
+ resolvedCodiceRuolo = parsedCodiceRuolo;
178
210
  }
179
- codiceRuolo = parsedCodiceRuolo;
180
- }
181
- else {
182
- // aggiornamento ruolo esistente
183
- const updateRoleQuery = `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`;
184
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, updateRoleQuery, [role.descrizioneRuolo, codiceRuolo]);
185
- const deleteRoleMenuQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;
186
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleMenuQuery, [codiceRuolo]);
187
- }
188
- if (codiceRuolo === null) {
189
- throw new Error('Operazione ruolo non riuscita: codice ruolo non valorizzato.');
190
- }
191
- const createRoleMenuQuery = `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`;
192
- for (const menu of role.menu) {
193
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, createRoleMenuQuery, [codiceRuolo, menu.codiceMenu, menu.tipoAbilitazione]);
194
- }
211
+ else {
212
+ yield Orm_1.Orm.transactionQuery(transaction, `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`, [role.descrizioneRuolo, resolvedCodiceRuolo]);
213
+ yield Orm_1.Orm.transactionQuery(transaction, `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`, [resolvedCodiceRuolo]);
214
+ }
215
+ if (resolvedCodiceRuolo === null) {
216
+ throw new Error('Operazione ruolo non riuscita: codice ruolo non valorizzato.');
217
+ }
218
+ for (const menu of role.menu) {
219
+ yield Orm_1.Orm.transactionQuery(transaction, `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`, [resolvedCodiceRuolo, menu.codiceMenu, menu.tipoAbilitazione]);
220
+ }
221
+ }));
195
222
  });
196
223
  }
197
224
  /** Restituisce il catalogo ruoli con ogni associazione menu e livello, inclusi ruoli senza menu. */
198
225
  getRolesWithMenus() {
199
226
  return __awaiter(this, void 0, void 0, function* () {
200
- const query = `
201
- SELECT
202
- R.CODRUO AS codice_ruolo,
203
- R.DESRUO AS descrizione_ruolo,
204
- M.CODMNU AS codice_menu,
205
- M.DESMNU AS descrizione_menu,
206
- M.NOTE AS note,
207
- RM.TIPABI AS tipo_abilitazione
208
- FROM RUOLI R
209
- LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
210
- LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU
211
- ORDER BY R.CODRUO, M.CODMNU
227
+ const query = `
228
+ SELECT
229
+ R.CODRUO AS codice_ruolo,
230
+ R.DESRUO AS descrizione_ruolo,
231
+ M.CODMNU AS codice_menu,
232
+ M.DESMNU AS descrizione_menu,
233
+ M.NOTE AS note,
234
+ RM.TIPABI AS tipo_abilitazione
235
+ FROM RUOLI R
236
+ LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
237
+ LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU
238
+ ORDER BY R.CODRUO, M.CODMNU
212
239
  `;
213
- let result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
214
- result = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
240
+ const result = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []))
241
+ .map(Utilities_1.RestUtilities.convertKeysToCamelCase);
215
242
  const ruoliMap = new Map();
216
243
  for (const row of result) {
217
- const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;
244
+ const codiceRuolo = Number(row.codiceRuolo);
245
+ const descrizioneRuolo = typeof row.descrizioneRuolo === 'string' ? row.descrizioneRuolo.trim() : '';
246
+ const codiceMenu = typeof row.codiceMenu === 'string' ? row.codiceMenu : undefined;
247
+ const rawTipoAbilitazione = row.tipoAbilitazione;
218
248
  if (!ruoliMap.has(codiceRuolo)) {
219
249
  ruoliMap.set(codiceRuolo, {
220
250
  codiceRuolo,
221
- descrizioneRuolo: descrizioneRuolo === null || descrizioneRuolo === void 0 ? void 0 : descrizioneRuolo.trim(),
251
+ descrizioneRuolo,
222
252
  menu: []
223
253
  });
224
254
  }
225
- const abilitationValue = typeof tipoAbilitazione === 'number'
226
- ? tipoAbilitazione
227
- : Number.parseInt(`${tipoAbilitazione !== null && tipoAbilitazione !== void 0 ? tipoAbilitazione : ''}`, 10);
255
+ const abilitationValue = typeof rawTipoAbilitazione === 'number'
256
+ ? rawTipoAbilitazione
257
+ : Number.parseInt(`${rawTipoAbilitazione !== null && rawTipoAbilitazione !== void 0 ? rawTipoAbilitazione : ''}`, 10);
228
258
  if (!codiceMenu || Number.isNaN(abilitationValue) || abilitationValue <= Dtos_1.TipoAbilitazione.NESSUNA) {
229
259
  continue;
230
260
  }
231
261
  ruoliMap.get(codiceRuolo).menu.push({
232
- codiceRuolo: codiceRuolo,
233
- codiceMenu: codiceMenu.trim(),
262
+ codiceRuolo,
263
+ codiceMenu,
234
264
  tipoAbilitazione: abilitationValue,
235
265
  });
236
266
  }
@@ -259,12 +289,13 @@ let PermissionService = class PermissionService {
259
289
  })),
260
290
  ];
261
291
  if (normalizedRoles.length > 0) {
262
- const roleExistsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;
263
- for (const codiceRuolo of normalizedRoles) {
264
- const roleResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, roleExistsQuery, [codiceRuolo]);
265
- if (this.getCountFromResult(roleResult) === 0) {
266
- throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);
267
- }
292
+ // Un'unica query IN invece di N count: stessa validazione, meno round-trip.
293
+ const placeholders = normalizedRoles.map(() => '?').join(', ');
294
+ const existingRolesResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT CODRUO FROM RUOLI WHERE CODRUO IN (${placeholders})`, normalizedRoles);
295
+ const existingRoles = this.extractIntegerColumn(existingRolesResult, 'CODRUO');
296
+ const missingRole = normalizedRoles.find((codiceRuolo) => !existingRoles.has(codiceRuolo));
297
+ if (missingRole !== undefined) {
298
+ throw new Error(`Il ruolo con codice ${missingRole} non esiste.`);
268
299
  }
269
300
  }
270
301
  yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);
@@ -304,12 +335,14 @@ let PermissionService = class PermissionService {
304
335
  })),
305
336
  ];
306
337
  if (normalizedPermissions.length > 0) {
307
- const menuExistsQuery = `SELECT COUNT(*) FROM MENU WHERE CODMNU = ?`;
308
- for (const permission of normalizedPermissions) {
309
- const menuResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, menuExistsQuery, [permission.codiceMenu]);
310
- if (this.getCountFromResult(menuResult) === 0) {
311
- throw new Error(`Il menu con codice ${permission.codiceMenu} non esiste.`);
312
- }
338
+ // Un'unica query IN invece di N count: stessa validazione, meno round-trip.
339
+ const menuCodes = normalizedPermissions.map((permission) => permission.codiceMenu);
340
+ const placeholders = menuCodes.map(() => '?').join(', ');
341
+ const existingMenusResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT CODMNU FROM MENU WHERE CODMNU IN (${placeholders})`, menuCodes);
342
+ const existingMenus = new Set(existingMenusResult.map((row) => { var _a, _b; return String((_b = (_a = row.CODMNU) !== null && _a !== void 0 ? _a : row.codmnu) !== null && _b !== void 0 ? _b : ''); }));
343
+ const missingMenu = menuCodes.find((codiceMenu) => !existingMenus.has(codiceMenu));
344
+ if (missingMenu !== undefined) {
345
+ throw new Error(`Il menu con codice ${missingMenu} non esiste.`);
313
346
  }
314
347
  }
315
348
  yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);
@@ -324,35 +357,35 @@ let PermissionService = class PermissionService {
324
357
  deleteRole(codiceRuolo) {
325
358
  return __awaiter(this, void 0, void 0, function* () {
326
359
  const existsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;
327
- let result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, existsQuery, [codiceRuolo]);
328
- if (result[0].COUNT === 0) {
360
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, existsQuery, [codiceRuolo]);
361
+ if (this.getCountFromResult(result) === 0) {
329
362
  throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);
330
363
  }
331
- const deleteRoleMenusQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;
332
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleMenusQuery, [codiceRuolo]);
333
- const deleteRoleUsersQuery = `DELETE FROM UTENTI_RUOLI WHERE CODRUO = ?`;
334
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleUsersQuery, [codiceRuolo]);
335
- const deleteRoleQuery = `DELETE FROM RUOLI WHERE CODRUO = ?`;
336
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleQuery, [codiceRuolo]);
364
+ // Le tre delete sono atomiche: nessun ruolo orfano se una fallisce.
365
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, [
366
+ { query: `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`, params: [codiceRuolo] },
367
+ { query: `DELETE FROM UTENTI_RUOLI WHERE CODRUO = ?`, params: [codiceRuolo] },
368
+ { query: `DELETE FROM RUOLI WHERE CODRUO = ?`, params: [codiceRuolo] },
369
+ ]);
337
370
  });
338
371
  }
339
372
  /** Restituisce solo menu abilitati; per il catalogo amministrativo usare `getGroupsWithMenus(true)`. */
340
373
  getMenus() {
341
374
  return __awaiter(this, void 0, void 0, function* () {
342
- const query = `
343
- SELECT
344
- M.CODMNU AS codiceMenu,
345
- M.DESMNU AS descrizioneMenu,
346
- M.CODGRP AS codiceGruppo,
347
- G.DESGRP AS descrizioneGruppo,
348
- M.ICON AS icona,
349
- M.CODTIP AS tipo,
350
- M.PAGINA AS pagina,
351
- M.NOTE AS note
352
- FROM MENU M
353
- LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
354
- WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
355
- ORDER BY G.CODGRP, M.CODMNU
375
+ const query = `
376
+ SELECT
377
+ M.CODMNU AS codiceMenu,
378
+ M.DESMNU AS descrizioneMenu,
379
+ M.CODGRP AS codiceGruppo,
380
+ G.DESGRP AS descrizioneGruppo,
381
+ M.ICON AS icona,
382
+ M.CODTIP AS tipo,
383
+ M.PAGINA AS pagina,
384
+ M.NOTE AS note
385
+ FROM MENU M
386
+ LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
387
+ WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
388
+ ORDER BY G.CODGRP, M.CODMNU
356
389
  `;
357
390
  const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
358
391
  return result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
@@ -367,38 +400,38 @@ let PermissionService = class PermissionService {
367
400
  const filtersClause = includeDisabled
368
401
  ? ''
369
402
  : 'WHERE M.FLGENABLED = 1 AND (G.FLGENABLED IS NULL OR G.FLGENABLED = 1)';
370
- const query = `
371
- SELECT
372
- M.CODMNU AS codice_menu,
373
- M.DESMNU AS descrizione_menu,
374
- M.CODGRP AS codice_gruppo,
375
- G.DESGRP AS descrizione_gruppo,
376
- M.ICON AS icona,
377
- M.CODTIP AS tipo,
378
- M.PAGINA AS pagina,
379
- M.NOTE AS note,
380
- G.ORDINE AS ordine_gruppo,
381
- M.ORDINE as ordine_menu,
382
- M.FLGENABLED AS menu_enabled,
383
- G.FLGENABLED AS group_enabled
384
- FROM MENU M
385
- LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
386
- ${filtersClause}
387
- ORDER BY G.CODGRP, M.CODMNU
403
+ const query = `
404
+ SELECT
405
+ M.CODMNU AS codice_menu,
406
+ M.DESMNU AS descrizione_menu,
407
+ M.CODGRP AS codice_gruppo,
408
+ G.DESGRP AS descrizione_gruppo,
409
+ M.ICON AS icona,
410
+ M.CODTIP AS tipo,
411
+ M.PAGINA AS pagina,
412
+ M.NOTE AS note,
413
+ G.ORDINE AS ordine_gruppo,
414
+ M.ORDINE as ordine_menu,
415
+ M.FLGENABLED AS menu_enabled,
416
+ G.FLGENABLED AS group_enabled
417
+ FROM MENU M
418
+ LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
419
+ ${filtersClause}
420
+ ORDER BY G.CODGRP, M.CODMNU
388
421
  `;
389
422
  const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
390
423
  const groupMap = new Map();
391
- result.forEach(row => {
392
- var _a, _b;
424
+ result.forEach((row) => {
425
+ var _a, _b, _c;
393
426
  const converted = Utilities_1.RestUtilities.convertKeysToCamelCase(row);
394
- const _c = converted, { menuEnabled, groupEnabled } = _c, menuBase = __rest(_c, ["menuEnabled", "groupEnabled"]);
427
+ const { menuEnabled, groupEnabled } = converted, menuBase = __rest(converted, ["menuEnabled", "groupEnabled"]);
395
428
  const normalizedGroupKey = (_a = menuBase.codiceGruppo) !== null && _a !== void 0 ? _a : '__UNGROUPED__';
396
429
  const groupEnabledFlag = groupEnabled == null ? true : Number(groupEnabled) === 1 || groupEnabled === true;
397
430
  const menuEnabledFlag = menuEnabled === undefined ? true : Number(menuEnabled) === 1 || menuEnabled === true;
398
431
  if (!groupMap.has(normalizedGroupKey)) {
399
432
  groupMap.set(normalizedGroupKey, {
400
433
  codiceGruppo: (_b = menuBase.codiceGruppo) !== null && _b !== void 0 ? _b : normalizedGroupKey,
401
- descrizioneGruppo: menuBase.descrizioneGruppo,
434
+ descrizioneGruppo: (_c = menuBase.descrizioneGruppo) !== null && _c !== void 0 ? _c : '',
402
435
  ordineGruppo: menuBase.ordineGruppo,
403
436
  enabled: groupEnabledFlag,
404
437
  menus: [],
@@ -417,42 +450,317 @@ let PermissionService = class PermissionService {
417
450
  return groupsArray;
418
451
  });
419
452
  }
453
+ // -----------------------------------------------------------------------
454
+ // Cataloghi di configurazione: CRUD di menu, gruppi, tipi menu.
455
+ // `table` e `column` sono sempre costanti interne, mai input utente: i
456
+ // valori sono parametrizzati, quindi non esiste superficie di SQL injection.
457
+ // -----------------------------------------------------------------------
458
+ countWhere(table, column, value) {
459
+ return __awaiter(this, void 0, void 0, function* () {
460
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT COUNT(*) FROM ${table} WHERE ${column} = ?`, [value]);
461
+ return this.getCountFromResult(result);
462
+ });
463
+ }
464
+ assertMenuGroupExists(codiceGruppo) {
465
+ return __awaiter(this, void 0, void 0, function* () {
466
+ if ((yield this.countWhere('MENU_GRP', 'CODGRP', codiceGruppo)) === 0) {
467
+ throw new common_1.BadRequestException(`Il gruppo menu ${codiceGruppo} non esiste.`);
468
+ }
469
+ });
470
+ }
471
+ assertMenuTypeExists(codiceTipo) {
472
+ return __awaiter(this, void 0, void 0, function* () {
473
+ if ((yield this.countWhere('MENU_TIPI', 'CODTIP', codiceTipo)) === 0) {
474
+ throw new common_1.BadRequestException(`Il tipo menu ${codiceTipo} non esiste.`);
475
+ }
476
+ });
477
+ }
478
+ /** Catalogo completo dei tipi menu, usato dagli editor di configurazione. */
479
+ getMenuTypes() {
480
+ return __awaiter(this, void 0, void 0, function* () {
481
+ const query = `SELECT CODTIP AS codice_tipo, DESTIP AS descrizione_tipo FROM MENU_TIPI ORDER BY CODTIP`;
482
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
483
+ return result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
484
+ });
485
+ }
486
+ createMenuType(input) {
487
+ return __awaiter(this, void 0, void 0, function* () {
488
+ var _a;
489
+ if ((yield this.countWhere('MENU_TIPI', 'CODTIP', input.codiceTipo)) > 0) {
490
+ throw new common_1.BadRequestException(`Il tipo menu ${input.codiceTipo} esiste gia.`);
491
+ }
492
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `INSERT INTO MENU_TIPI (CODTIP, DESTIP) VALUES (?, ?)`, [input.codiceTipo, (_a = input.descrizioneTipo) !== null && _a !== void 0 ? _a : null]);
493
+ });
494
+ }
495
+ updateMenuType(codiceTipo, input) {
496
+ return __awaiter(this, void 0, void 0, function* () {
497
+ yield this.assertMenuTypeExists(codiceTipo);
498
+ if (input.descrizioneTipo === undefined)
499
+ return;
500
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `UPDATE MENU_TIPI SET DESTIP = ? WHERE CODTIP = ?`, [input.descrizioneTipo, codiceTipo]);
501
+ });
502
+ }
503
+ /** Elimina un tipo menu solo se nessun menu lo utilizza (la FK lo impedirebbe comunque). */
504
+ deleteMenuType(codiceTipo) {
505
+ return __awaiter(this, void 0, void 0, function* () {
506
+ yield this.assertMenuTypeExists(codiceTipo);
507
+ const used = yield this.countWhere('MENU', 'CODTIP', codiceTipo);
508
+ if (used > 0) {
509
+ throw new common_1.BadRequestException(`Impossibile eliminare il tipo ${codiceTipo}: ${used} menu lo utilizzano.`);
510
+ }
511
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `DELETE FROM MENU_TIPI WHERE CODTIP = ?`, [codiceTipo]);
512
+ });
513
+ }
514
+ createMenuGroup(input) {
515
+ return __awaiter(this, void 0, void 0, function* () {
516
+ var _a, _b, _c;
517
+ if ((yield this.countWhere('MENU_GRP', 'CODGRP', input.codiceGruppo)) > 0) {
518
+ throw new common_1.BadRequestException(`Il gruppo menu ${input.codiceGruppo} esiste gia.`);
519
+ }
520
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `INSERT INTO MENU_GRP (CODGRP, DESGRP, FLGENABLED, ORDINE, NOMECAMPO) VALUES (?, ?, ?, ?, ?)`, [
521
+ input.codiceGruppo,
522
+ (_a = input.descrizioneGruppo) !== null && _a !== void 0 ? _a : null,
523
+ input.enabled === false ? 0 : 1,
524
+ (_b = input.ordineGruppo) !== null && _b !== void 0 ? _b : 0,
525
+ (_c = input.nomeCampo) !== null && _c !== void 0 ? _c : null,
526
+ ]);
527
+ });
528
+ }
529
+ updateMenuGroup(codiceGruppo, input) {
530
+ return __awaiter(this, void 0, void 0, function* () {
531
+ yield this.assertMenuGroupExists(codiceGruppo);
532
+ const sets = [];
533
+ const params = [];
534
+ if (input.descrizioneGruppo !== undefined) {
535
+ sets.push('DESGRP = ?');
536
+ params.push(input.descrizioneGruppo);
537
+ }
538
+ if (input.ordineGruppo !== undefined) {
539
+ sets.push('ORDINE = ?');
540
+ params.push(input.ordineGruppo);
541
+ }
542
+ if (input.enabled !== undefined) {
543
+ sets.push('FLGENABLED = ?');
544
+ params.push(input.enabled ? 1 : 0);
545
+ }
546
+ if (input.nomeCampo !== undefined) {
547
+ sets.push('NOMECAMPO = ?');
548
+ params.push(input.nomeCampo);
549
+ }
550
+ if (sets.length === 0)
551
+ return;
552
+ params.push(codiceGruppo);
553
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `UPDATE MENU_GRP SET ${sets.join(', ')} WHERE CODGRP = ?`, params);
554
+ });
555
+ }
556
+ /** Elimina un gruppo solo se non contiene menu, per non lasciare menu orfani. */
557
+ deleteMenuGroup(codiceGruppo) {
558
+ return __awaiter(this, void 0, void 0, function* () {
559
+ yield this.assertMenuGroupExists(codiceGruppo);
560
+ const used = yield this.countWhere('MENU', 'CODGRP', codiceGruppo);
561
+ if (used > 0) {
562
+ throw new common_1.BadRequestException(`Impossibile eliminare il gruppo ${codiceGruppo}: contiene ${used} menu.`);
563
+ }
564
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `DELETE FROM MENU_GRP WHERE CODGRP = ?`, [codiceGruppo]);
565
+ });
566
+ }
567
+ createMenu(input) {
568
+ return __awaiter(this, void 0, void 0, function* () {
569
+ var _a, _b, _c, _d, _e, _f, _g;
570
+ if ((yield this.countWhere('MENU', 'CODMNU', input.codiceMenu)) > 0) {
571
+ throw new common_1.BadRequestException(`Il menu ${input.codiceMenu} esiste gia.`);
572
+ }
573
+ yield this.assertMenuGroupExists(input.codiceGruppo);
574
+ if (input.tipo)
575
+ yield this.assertMenuTypeExists(input.tipo);
576
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU, NOTE)
577
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
578
+ input.codiceMenu,
579
+ (_a = input.descrizioneMenu) !== null && _a !== void 0 ? _a : null,
580
+ input.codiceGruppo,
581
+ input.enabled === false ? 0 : 1,
582
+ (_b = input.icona) !== null && _b !== void 0 ? _b : null,
583
+ (_c = input.ordineMenu) !== null && _c !== void 0 ? _c : null,
584
+ (_d = input.tipo) !== null && _d !== void 0 ? _d : null,
585
+ (_e = input.pagina) !== null && _e !== void 0 ? _e : null,
586
+ (_f = input.rifMenu) !== null && _f !== void 0 ? _f : null,
587
+ (_g = input.note) !== null && _g !== void 0 ? _g : null,
588
+ ]);
589
+ });
590
+ }
591
+ updateMenu(codiceMenu, input) {
592
+ return __awaiter(this, void 0, void 0, function* () {
593
+ if ((yield this.countWhere('MENU', 'CODMNU', codiceMenu)) === 0) {
594
+ throw new common_1.BadRequestException(`Il menu ${codiceMenu} non esiste.`);
595
+ }
596
+ if (input.codiceGruppo !== undefined)
597
+ yield this.assertMenuGroupExists(input.codiceGruppo);
598
+ if (input.tipo)
599
+ yield this.assertMenuTypeExists(input.tipo);
600
+ const sets = [];
601
+ const params = [];
602
+ if (input.descrizioneMenu !== undefined) {
603
+ sets.push('DESMNU = ?');
604
+ params.push(input.descrizioneMenu);
605
+ }
606
+ if (input.codiceGruppo !== undefined) {
607
+ sets.push('CODGRP = ?');
608
+ params.push(input.codiceGruppo);
609
+ }
610
+ if (input.tipo !== undefined) {
611
+ sets.push('CODTIP = ?');
612
+ params.push(input.tipo || null);
613
+ }
614
+ if (input.icona !== undefined) {
615
+ sets.push('ICON = ?');
616
+ params.push(input.icona);
617
+ }
618
+ if (input.pagina !== undefined) {
619
+ sets.push('PAGINA = ?');
620
+ params.push(input.pagina);
621
+ }
622
+ if (input.ordineMenu !== undefined) {
623
+ sets.push('ORDINE = ?');
624
+ params.push(input.ordineMenu);
625
+ }
626
+ if (input.enabled !== undefined) {
627
+ sets.push('FLGENABLED = ?');
628
+ params.push(input.enabled ? 1 : 0);
629
+ }
630
+ if (input.rifMenu !== undefined) {
631
+ sets.push('RIFMENU = ?');
632
+ params.push(input.rifMenu);
633
+ }
634
+ if (input.note !== undefined) {
635
+ sets.push('NOTE = ?');
636
+ params.push(input.note);
637
+ }
638
+ if (sets.length === 0)
639
+ return;
640
+ params.push(codiceMenu);
641
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, `UPDATE MENU SET ${sets.join(', ')} WHERE CODMNU = ?`, params);
642
+ });
643
+ }
644
+ /** Elimina menu, grant utente e associazioni ruolo in un'unica transazione. */
645
+ deleteMenu(codiceMenu) {
646
+ return __awaiter(this, void 0, void 0, function* () {
647
+ if ((yield this.countWhere('MENU', 'CODMNU', codiceMenu)) === 0) {
648
+ throw new common_1.BadRequestException(`Il menu ${codiceMenu} non esiste.`);
649
+ }
650
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, [
651
+ { query: `DELETE FROM ABILITAZIONI WHERE CODMNU = ?`, params: [codiceMenu] },
652
+ { query: `DELETE FROM RUOLI_MNU WHERE CODMNU = ?`, params: [codiceMenu] },
653
+ { query: `DELETE FROM MENU WHERE CODMNU = ?`, params: [codiceMenu] },
654
+ ]);
655
+ });
656
+ }
420
657
  /**
421
658
  * Calcola l'autorizzazione effettiva: grant diretti e grant dei ruoli sono uniti per codice menu.
422
659
  * Per compatibilita storica un grant diretto prevale su quello del ruolo; i superutenti ricevono tutti i menu attivi.
423
660
  */
424
661
  getUserRolesAndGrants(codiceUtente) {
425
662
  return __awaiter(this, void 0, void 0, function* () {
663
+ var _a;
426
664
  const codiceUtenteQuery = "SELECT FLGSUPER as flag_super FROM UTENTI_CONFIG WHERE CODUTE = ?";
427
- let result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, codiceUtenteQuery, [codiceUtente]);
665
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, codiceUtenteQuery, [codiceUtente]);
428
666
  if (!result || result.length == 0)
429
667
  throw new Error("Nessun utente trovato con il codice utente " + codiceUtente);
430
- result = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
431
- const rawSuperFlag = result[0].flagSuper;
432
- const isSuperAdmin = rawSuperFlag === true || rawSuperFlag === 1 || rawSuperFlag === '1';
668
+ const isSuperAdmin = this.isSuperFlag((_a = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase)[0]) === null || _a === void 0 ? void 0 : _a.flagSuper);
433
669
  const abilitazioni = yield this.getUserDirectPermissions(codiceUtente);
434
670
  const ruoli = yield this.getUserRoles(codiceUtente);
435
- // Merge user-specific and role-based permissions
436
- const grantsMap = new Map();
437
- // Add user-specific permissions
438
- for (const abilitazione of abilitazioni) {
439
- grantsMap.set(abilitazione.codiceMenu, abilitazione);
440
- }
441
- // Direct grants (including explicit denial) override roles; roles combine by maximum level.
442
- const directMenuCodes = new Set(abilitazioni.map(grant => grant.codiceMenu));
443
- for (const ruolo of ruoli) {
444
- for (const menu of ruolo.menu) {
445
- const existing = grantsMap.get(menu.codiceMenu);
446
- if (!directMenuCodes.has(menu.codiceMenu) &&
447
- (!existing || Number(menu.tipoAbilitazione) > Number(existing.tipoAbilitazione))) {
448
- grantsMap.set(menu.codiceMenu, menu);
449
- }
671
+ const grants = this.composeGrants(abilitazioni, ruoli, isSuperAdmin, isSuperAdmin ? yield this.getAllActiveMenusAsGrants() : []);
672
+ return { abilitazioni, ruoli, grants };
673
+ });
674
+ }
675
+ isSuperFlag(value) {
676
+ return value === true || value === 1 || value === '1';
677
+ }
678
+ /**
679
+ * Versione batch di `getUserRolesAndGrants`: esegue un numero costante di query per N utenti
680
+ * (invece di N set di query) e restituisce mappa per codice utente. Stessa composizione della
681
+ * lettura singola.
682
+ */
683
+ getUsersRolesAndGrants(codiciUtente) {
684
+ return __awaiter(this, void 0, void 0, function* () {
685
+ var _a, _b;
686
+ const result = new Map();
687
+ const ids = Array.from(new Set(codiciUtente.filter((id) => Number.isInteger(id) && id > 0)));
688
+ if (ids.length === 0) {
689
+ return result;
690
+ }
691
+ const placeholders = ids.map(() => '?').join(', ');
692
+ const superRows = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT CODUTE AS codice_utente, FLGSUPER AS flag_super FROM UTENTI_CONFIG WHERE CODUTE IN (${placeholders})`, ids)).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
693
+ const superUsers = new Set();
694
+ for (const row of superRows) {
695
+ if (this.isSuperFlag(row.flagSuper)) {
696
+ superUsers.add(Number(row.codiceUtente));
450
697
  }
451
698
  }
452
- const grants = isSuperAdmin
453
- ? yield this.getAllActiveMenusAsGrants()
454
- : Array.from(grantsMap.values());
455
- return { abilitazioni, ruoli, grants };
699
+ const permissionRows = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT
700
+ A.CODUTE AS codice_utente,
701
+ A.CODMNU AS codice_menu,
702
+ A.TIPABI AS tipo_abilitazione,
703
+ M.DESMNU AS descrizione_menu,
704
+ G.DESGRP AS descrizione_gruppo,
705
+ G.CODGRP AS codice_gruppo,
706
+ M.ICON AS icona,
707
+ M.CODTIP AS tipo,
708
+ M.PAGINA AS pagina,
709
+ M.NOTE AS note
710
+ FROM ABILITAZIONI A
711
+ INNER JOIN MENU M ON A.CODMNU = M.CODMNU
712
+ LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
713
+ WHERE A.CODUTE IN (${placeholders}) AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1`, ids)).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
714
+ const roleRows = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT
715
+ RU.CODUTE AS codice_utente,
716
+ R.CODRUO AS codice_ruolo,
717
+ R.DESRUO AS descrizione_ruolo,
718
+ CASE WHEN COALESCE(G.FLGENABLED, 1) = 1 THEN M.CODMNU END AS codice_menu,
719
+ RM.TIPABI AS tipo_abilitazione,
720
+ M.DESMNU AS descrizione_menu,
721
+ M.NOTE AS note
722
+ FROM UTENTI_RUOLI RU
723
+ INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO
724
+ LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
725
+ LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU AND M.FLGENABLED = 1
726
+ LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
727
+ WHERE RU.CODUTE IN (${placeholders})`, ids)).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
728
+ const allActiveMenus = superUsers.size > 0 ? yield this.getAllActiveMenusAsGrants() : [];
729
+ const permissionsByUser = new Map();
730
+ for (const row of permissionRows) {
731
+ const { codiceUtente } = row, grant = __rest(row, ["codiceUtente"]);
732
+ const key = Number(codiceUtente);
733
+ const bucket = permissionsByUser.get(key);
734
+ if (bucket) {
735
+ bucket.push(grant);
736
+ }
737
+ else {
738
+ permissionsByUser.set(key, [grant]);
739
+ }
740
+ }
741
+ const rolesByUser = new Map();
742
+ for (const row of roleRows) {
743
+ const { codiceUtente } = row, roleRow = __rest(row, ["codiceUtente"]);
744
+ const key = Number(codiceUtente);
745
+ const bucket = rolesByUser.get(key);
746
+ if (bucket) {
747
+ bucket.push(roleRow);
748
+ }
749
+ else {
750
+ rolesByUser.set(key, [roleRow]);
751
+ }
752
+ }
753
+ for (const id of ids) {
754
+ const abilitazioni = (_a = permissionsByUser.get(id)) !== null && _a !== void 0 ? _a : [];
755
+ const ruoli = this.assembleRoles((_b = rolesByUser.get(id)) !== null && _b !== void 0 ? _b : []);
756
+ const isSuperAdmin = superUsers.has(id);
757
+ result.set(id, {
758
+ abilitazioni,
759
+ ruoli,
760
+ grants: this.composeGrants(abilitazioni, ruoli, isSuperAdmin, isSuperAdmin ? allActiveMenus : []),
761
+ });
762
+ }
763
+ return result;
456
764
  });
457
765
  }
458
766
  };