emilsoftware-utilities 2.0.0-dev.2 → 2.0.0-dev.20

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 (140) hide show
  1. package/README.MD +38 -38
  2. package/dist/ContractGenerator.js.map +1 -1
  3. package/dist/DatabaseUpdater.d.ts +1 -1
  4. package/dist/DatabaseUpdater.js +24 -24
  5. package/dist/DatabaseUpdater.js.map +1 -1
  6. package/dist/EmilsoftwareModule.js.map +1 -1
  7. package/dist/ExecutionTimeLogger.js.map +1 -1
  8. package/dist/Logger.js.map +1 -1
  9. package/dist/Orm.d.ts +7 -1
  10. package/dist/Orm.js +172 -78
  11. package/dist/Orm.js.map +1 -1
  12. package/dist/RoutesLoggerMiddleware.js.map +1 -1
  13. package/dist/Utilities.d.ts +2 -2
  14. package/dist/Utilities.js +3 -0
  15. package/dist/Utilities.js.map +1 -1
  16. package/dist/accessi-module/AccessiModule.d.ts +1 -1
  17. package/dist/accessi-module/AccessiModule.js.map +1 -1
  18. package/dist/accessi-module/Controllers/AuthController.d.ts +4 -4
  19. package/dist/accessi-module/Controllers/AuthController.js +43 -33
  20. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  21. package/dist/accessi-module/Controllers/ConfiguratorController.js +25 -30
  22. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  23. package/dist/accessi-module/Controllers/EmailController.d.ts +2 -4
  24. package/dist/accessi-module/Controllers/EmailController.js +8 -12
  25. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  26. package/dist/accessi-module/Controllers/FiltriController.js +29 -0
  27. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  28. package/dist/accessi-module/Controllers/PermissionController.js +35 -33
  29. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  30. package/dist/accessi-module/Controllers/UserController.d.ts +2 -2
  31. package/dist/accessi-module/Controllers/UserController.js +30 -12
  32. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  33. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  34. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  35. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js +0 -1
  36. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  37. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +0 -1
  38. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  39. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.d.ts +10 -0
  40. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js +52 -0
  41. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +1 -0
  42. package/dist/accessi-module/Dtos/BaseResponse.d.ts +20 -0
  43. package/dist/accessi-module/Dtos/BaseResponse.js +87 -1
  44. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  45. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.d.ts +3 -0
  46. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js +31 -0
  47. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -0
  48. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  49. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  50. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  51. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  52. package/dist/accessi-module/Dtos/GetUserByTokenRequest.d.ts +3 -0
  53. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js +26 -0
  54. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +1 -0
  55. package/dist/accessi-module/Dtos/GetUserByTokenResponse.d.ts +5 -0
  56. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js +27 -0
  57. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +1 -0
  58. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  59. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  60. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  61. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  62. package/dist/accessi-module/Dtos/PublicRegisterRequest.d.ts +5 -0
  63. package/dist/accessi-module/Dtos/PublicRegisterRequest.js +14 -0
  64. package/dist/accessi-module/Dtos/PublicRegisterRequest.js.map +1 -0
  65. package/dist/accessi-module/Dtos/RegisterRequest.js +4 -0
  66. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  67. package/dist/accessi-module/Dtos/RegisterResponse.d.ts +1 -1
  68. package/dist/accessi-module/Dtos/RegisterResponse.js +3 -3
  69. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  70. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  71. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  72. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.d.ts +4 -0
  73. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js +36 -0
  74. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +1 -0
  75. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  76. package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
  77. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
  78. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  79. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  80. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  81. package/dist/accessi-module/Dtos/UserDto.js +5 -1
  82. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  83. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  84. package/dist/accessi-module/Dtos/UserGrantsResponse.d.ts +5 -0
  85. package/dist/accessi-module/Dtos/UserGrantsResponse.js +27 -0
  86. package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +1 -0
  87. package/dist/accessi-module/Dtos/index.d.ts +7 -0
  88. package/dist/accessi-module/Dtos/index.js +7 -0
  89. package/dist/accessi-module/Dtos/index.js.map +1 -1
  90. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  91. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
  92. package/dist/accessi-module/Services/EmailService/EmailService.js +11 -11
  93. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  94. package/dist/accessi-module/Services/FiltriService/FiltriService.js +1 -8
  95. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  96. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +4 -0
  97. package/dist/accessi-module/Services/PermissionService/PermissionService.js +210 -147
  98. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  99. package/dist/accessi-module/Services/UserService/UserService.js +77 -174
  100. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  101. package/dist/accessi-module/Views/reset-password.html +213 -213
  102. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +16 -16
  103. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  104. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  105. package/dist/accessi-module/index.d.ts +1 -0
  106. package/dist/accessi-module/index.js +28 -5
  107. package/dist/accessi-module/index.js.map +1 -1
  108. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  109. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  110. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  111. package/dist/accessi-module/security/accessControl.js.map +1 -1
  112. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  113. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  114. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  115. package/dist/allegati-module/AllegatiModule.d.ts +1 -1
  116. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  117. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  118. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  119. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  120. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  121. package/dist/allegati-module/Dtos/index.js.map +1 -1
  122. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  123. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  124. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  125. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +49 -49
  126. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  127. package/dist/allegati-module/index.js.map +1 -1
  128. package/dist/autobind.js.map +1 -1
  129. package/dist/emilsoftware-utilities-2.0.0-dev.20.tgz +0 -0
  130. package/dist/firebird-compat.d.ts +25 -0
  131. package/dist/firebird-compat.js +218 -0
  132. package/dist/firebird-compat.js.map +1 -0
  133. package/dist/index.d.ts +5 -2
  134. package/dist/index.js +28 -2
  135. package/dist/index.js.map +1 -1
  136. package/dist/initEmilsoftwareModule.js.map +1 -1
  137. package/dist/swagger/SwaggerConfig.d.ts +7 -1
  138. package/dist/swagger/SwaggerConfig.js +18 -7
  139. package/dist/swagger/SwaggerConfig.js.map +1 -1
  140. package/package.json +83 -83
@@ -41,6 +41,98 @@ let PermissionService = class PermissionService {
41
41
  constructor(accessiOptions) {
42
42
  this.accessiOptions = accessiOptions;
43
43
  }
44
+ getCountFromResult(result, fieldName = 'COUNT') {
45
+ var _a, _b, _c, _d, _e;
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
+ return typeof rawValue === 'number' ? rawValue : Number.parseInt(`${rawValue !== null && rawValue !== void 0 ? rawValue : '0'}`, 10);
48
+ }
49
+ getAllActiveMenusAsGrants() {
50
+ 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
65
+ `;
66
+ return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, [])
67
+ .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase));
68
+ });
69
+ }
70
+ getUserDirectPermissions(codiceUtente) {
71
+ 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
87
+ `;
88
+ return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente])
89
+ .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase));
90
+ });
91
+ }
92
+ getUserRoles(codiceUtente) {
93
+ 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
+ RM.CODMNU 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
+ AND COALESCE(G.FLGENABLED, 1) = 1
111
+ WHERE RU.CODUTE = ?
112
+ `;
113
+ let ruoliResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]);
114
+ ruoliResult = ruoliResult.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
115
+ const ruoliMap = new Map();
116
+ for (const row of ruoliResult) {
117
+ const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;
118
+ if (!ruoliMap.has(codiceRuolo)) {
119
+ ruoliMap.set(codiceRuolo, {
120
+ codiceRuolo,
121
+ descrizioneRuolo: descrizioneRuolo === null || descrizioneRuolo === void 0 ? void 0 : descrizioneRuolo.trim(),
122
+ menu: []
123
+ });
124
+ }
125
+ if (codiceMenu && descrizioneMenu) {
126
+ ruoliMap.get(codiceRuolo).menu.push({
127
+ codiceRuolo: codiceRuolo,
128
+ codiceMenu: codiceMenu.trim(),
129
+ tipoAbilitazione,
130
+ });
131
+ }
132
+ }
133
+ return Array.from(ruoliMap.values());
134
+ });
135
+ }
44
136
  addAbilitazioni(codiceUtente, menuAbilitazioni) {
45
137
  return __awaiter(this, void 0, void 0, function* () {
46
138
  const deleteQuery = `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`;
@@ -78,37 +170,36 @@ let PermissionService = class PermissionService {
78
170
  }
79
171
  codiceRuolo = parsedCodiceRuolo;
80
172
  }
81
- else
82
- // aggiornamento ruolo esistente
83
- {
84
- let updateRoleQuery = `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`;
85
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, updateRoleQuery, [role.descrizioneRuolo, codiceRuolo]);
86
- let deleteRoleMenuQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;
87
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, deleteRoleMenuQuery, [codiceRuolo]);
173
+ else {
174
+ // aggiornamento ruolo esistente
175
+ const updateRoleQuery = `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`;
176
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, updateRoleQuery, [role.descrizioneRuolo, codiceRuolo]);
177
+ const deleteRoleMenuQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;
178
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleMenuQuery, [codiceRuolo]);
88
179
  }
89
180
  if (codiceRuolo === null) {
90
181
  throw new Error('Operazione ruolo non riuscita: codice ruolo non valorizzato.');
91
182
  }
92
- let createRoleMenuQuery = `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`;
93
- for (let menu of role.menu) {
94
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, createRoleMenuQuery, [codiceRuolo, menu.codiceMenu, menu.tipoAbilitazione]);
183
+ const createRoleMenuQuery = `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`;
184
+ for (const menu of role.menu) {
185
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, createRoleMenuQuery, [codiceRuolo, menu.codiceMenu, menu.tipoAbilitazione]);
95
186
  }
96
187
  });
97
188
  }
98
189
  getRolesWithMenus() {
99
190
  return __awaiter(this, void 0, void 0, function* () {
100
- const query = `
101
- SELECT
102
- R.CODRUO AS codice_ruolo,
103
- R.DESRUO AS descrizione_ruolo,
104
- M.CODMNU AS codice_menu,
105
- M.DESMNU AS descrizione_menu,
106
- M.NOTE AS note,
107
- RM.TIPABI AS tipo_abilitazione
108
- FROM RUOLI R
109
- LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
110
- LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU
111
- ORDER BY R.CODRUO, M.CODMNU
191
+ const query = `
192
+ SELECT
193
+ R.CODRUO AS codice_ruolo,
194
+ R.DESRUO AS descrizione_ruolo,
195
+ M.CODMNU AS codice_menu,
196
+ M.DESMNU AS descrizione_menu,
197
+ M.NOTE AS note,
198
+ RM.TIPABI AS tipo_abilitazione
199
+ FROM RUOLI R
200
+ LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
201
+ LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU
202
+ ORDER BY R.CODRUO, M.CODMNU
112
203
  `;
113
204
  let result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
114
205
  result = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
@@ -141,14 +232,33 @@ let PermissionService = class PermissionService {
141
232
  return __awaiter(this, void 0, void 0, function* () {
142
233
  const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;
143
234
  let result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);
144
- if (result[0].COUNT === 0) {
235
+ if (this.getCountFromResult(result) === 0) {
145
236
  throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);
146
237
  }
147
- const deleteQuery = `DELETE FROM UTENTI_RUOLI WHERE CODUTE = ?`;
148
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);
149
- const insertQuery = `INSERT INTO UTENTI_RUOLI (CODUTE, CODRUO) VALUES (?, ?)`;
150
- for (const codiceRuolo of roles) {
151
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, insertQuery, [codiceUtente, codiceRuolo]);
238
+ const normalizedRoles = Array.from(new Set(roles
239
+ .map((role) => Number.parseInt(`${role !== null && role !== void 0 ? role : ''}`, 10))
240
+ .filter((role) => Number.isInteger(role) && role > 0)));
241
+ const queriesWithParams = [
242
+ { query: `DELETE FROM UTENTI_RUOLI WHERE CODUTE = ?`, params: [codiceUtente] },
243
+ ...normalizedRoles.map((codiceRuolo) => ({
244
+ query: `INSERT INTO UTENTI_RUOLI (CODUTE, CODRUO) VALUES (?, ?)`,
245
+ params: [codiceUtente, codiceRuolo],
246
+ })),
247
+ ];
248
+ if (normalizedRoles.length > 0) {
249
+ const roleExistsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;
250
+ for (const codiceRuolo of normalizedRoles) {
251
+ const roleResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, roleExistsQuery, [codiceRuolo]);
252
+ if (this.getCountFromResult(roleResult) === 0) {
253
+ throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);
254
+ }
255
+ }
256
+ }
257
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);
258
+ const assignedRolesResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT COUNT(*) FROM UTENTI_RUOLI WHERE CODUTE = ?`, [codiceUtente]);
259
+ const assignedRolesCount = this.getCountFromResult(assignedRolesResult);
260
+ if (assignedRolesCount !== normalizedRoles.length) {
261
+ throw new Error(`Persistenza ruoli non coerente per utente ${codiceUtente}: attesi ${normalizedRoles.length}, trovati ${assignedRolesCount}.`);
152
262
  }
153
263
  });
154
264
  }
@@ -156,14 +266,40 @@ let PermissionService = class PermissionService {
156
266
  return __awaiter(this, void 0, void 0, function* () {
157
267
  const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;
158
268
  let result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);
159
- if (result[0].COUNT === 0) {
269
+ if (this.getCountFromResult(result) === 0) {
160
270
  throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);
161
271
  }
162
- const deleteQuery = `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`;
163
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);
164
- const insertQuery = `INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`;
165
- for (const permission of permissions) {
166
- yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, insertQuery, [codiceUtente, permission.codiceMenu, permission.tipoAbilitazione]);
272
+ const normalizedPermissions = Array.from(new Map(permissions
273
+ .map((permission) => {
274
+ var _a, _b;
275
+ return ({
276
+ codiceMenu: `${(_a = permission === null || permission === void 0 ? void 0 : permission.codiceMenu) !== null && _a !== void 0 ? _a : ''}`.trim(),
277
+ tipoAbilitazione: Number.parseInt(`${(_b = permission === null || permission === void 0 ? void 0 : permission.tipoAbilitazione) !== null && _b !== void 0 ? _b : ''}`, 10),
278
+ });
279
+ })
280
+ .filter((permission) => permission.codiceMenu.length > 0 && Number.isInteger(permission.tipoAbilitazione))
281
+ .map((permission) => [permission.codiceMenu, permission])).values());
282
+ const queriesWithParams = [
283
+ { query: `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`, params: [codiceUtente] },
284
+ ...normalizedPermissions.map((permission) => ({
285
+ query: `INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`,
286
+ params: [codiceUtente, permission.codiceMenu, permission.tipoAbilitazione],
287
+ })),
288
+ ];
289
+ if (normalizedPermissions.length > 0) {
290
+ const menuExistsQuery = `SELECT COUNT(*) FROM MENU WHERE CODMNU = ?`;
291
+ for (const permission of normalizedPermissions) {
292
+ const menuResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, menuExistsQuery, [permission.codiceMenu]);
293
+ if (this.getCountFromResult(menuResult) === 0) {
294
+ throw new Error(`Il menu con codice ${permission.codiceMenu} non esiste.`);
295
+ }
296
+ }
297
+ }
298
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);
299
+ const assignedPermissionsResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT COUNT(*) FROM ABILITAZIONI WHERE CODUTE = ?`, [codiceUtente]);
300
+ const assignedPermissionsCount = this.getCountFromResult(assignedPermissionsResult);
301
+ if (assignedPermissionsCount !== normalizedPermissions.length) {
302
+ throw new Error(`Persistenza abilitazioni non coerente per utente ${codiceUtente}: attese ${normalizedPermissions.length}, trovate ${assignedPermissionsCount}.`);
167
303
  }
168
304
  });
169
305
  }
@@ -175,29 +311,29 @@ let PermissionService = class PermissionService {
175
311
  throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);
176
312
  }
177
313
  const deleteRoleMenusQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;
178
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, deleteRoleMenusQuery, [codiceRuolo]);
314
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleMenusQuery, [codiceRuolo]);
179
315
  const deleteRoleUsersQuery = `DELETE FROM UTENTI_RUOLI WHERE CODRUO = ?`;
180
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, deleteRoleUsersQuery, [codiceRuolo]);
316
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleUsersQuery, [codiceRuolo]);
181
317
  const deleteRoleQuery = `DELETE FROM RUOLI WHERE CODRUO = ?`;
182
- yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, deleteRoleQuery, [codiceRuolo]);
318
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, deleteRoleQuery, [codiceRuolo]);
183
319
  });
184
320
  }
185
321
  getMenus() {
186
322
  return __awaiter(this, void 0, void 0, function* () {
187
- const query = `
188
- SELECT
189
- M.CODMNU AS codiceMenu,
190
- M.DESMNU AS descrizioneMenu,
191
- M.CODGRP AS codiceGruppo,
192
- G.DESGRP AS descrizioneGruppo,
193
- M.ICON AS icona,
194
- M.CODTIP AS tipo,
195
- M.PAGINA AS pagina,
196
- M.NOTE AS note
197
- FROM MENU M
198
- LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
199
- WHERE M.FLGENABLED = 1
200
- ORDER BY G.CODGRP, M.CODMNU
323
+ const query = `
324
+ SELECT
325
+ M.CODMNU AS codiceMenu,
326
+ M.DESMNU AS descrizioneMenu,
327
+ M.CODGRP AS codiceGruppo,
328
+ G.DESGRP AS descrizioneGruppo,
329
+ M.ICON AS icona,
330
+ M.CODTIP AS tipo,
331
+ M.PAGINA AS pagina,
332
+ M.NOTE AS note
333
+ FROM MENU M
334
+ LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
335
+ WHERE M.FLGENABLED = 1
336
+ ORDER BY G.CODGRP, M.CODMNU
201
337
  `;
202
338
  const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
203
339
  return result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
@@ -208,24 +344,24 @@ let PermissionService = class PermissionService {
208
344
  const filtersClause = includeDisabled
209
345
  ? ''
210
346
  : 'WHERE M.FLGENABLED = 1 AND (G.FLGENABLED IS NULL OR G.FLGENABLED = 1)';
211
- const query = `
212
- SELECT
213
- M.CODMNU AS codice_menu,
214
- M.DESMNU AS descrizione_menu,
215
- M.CODGRP AS codice_gruppo,
216
- G.DESGRP AS descrizione_gruppo,
217
- M.ICON AS icona,
218
- M.CODTIP AS tipo,
219
- M.PAGINA AS pagina,
220
- M.NOTE AS note,
221
- G.ORDINE AS ordine_gruppo,
222
- M.ORDINE as ordine_menu,
223
- M.FLGENABLED AS menu_enabled,
224
- G.FLGENABLED AS group_enabled
225
- FROM MENU M
226
- LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
227
- ${filtersClause}
228
- ORDER BY G.CODGRP, M.CODMNU
347
+ const query = `
348
+ SELECT
349
+ M.CODMNU AS codice_menu,
350
+ M.DESMNU AS descrizione_menu,
351
+ M.CODGRP AS codice_gruppo,
352
+ G.DESGRP AS descrizione_gruppo,
353
+ M.ICON AS icona,
354
+ M.CODTIP AS tipo,
355
+ M.PAGINA AS pagina,
356
+ M.NOTE AS note,
357
+ G.ORDINE AS ordine_gruppo,
358
+ M.ORDINE as ordine_menu,
359
+ M.FLGENABLED AS menu_enabled,
360
+ G.FLGENABLED AS group_enabled
361
+ FROM MENU M
362
+ LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
363
+ ${filtersClause}
364
+ ORDER BY G.CODGRP, M.CODMNU
229
365
  `;
230
366
  const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
231
367
  const groupMap = new Map();
@@ -266,83 +402,8 @@ let PermissionService = class PermissionService {
266
402
  throw new Error("Nessun utente trovato con il codice utente " + codiceUtente);
267
403
  result = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
268
404
  const isSuperAdmin = result[0].flagSuper;
269
- let abilitazioni = [];
270
- let ruoli = [];
271
- if (isSuperAdmin) {
272
- const query = `
273
- SELECT
274
- M.CODMNU AS codice_menu,
275
- 30 AS tipo_abilitazione,
276
- M.DESMNU AS descrizione_menu,
277
- G.DESGRP AS descrizione_gruppo,
278
- G.CODGRP AS codice_gruppo,
279
- M.ICON AS icona,
280
- M.CODTIP AS tipo,
281
- M.PAGINA AS pagina,
282
- M.NOTE AS note
283
- FROM MENU M
284
- INNER JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
285
- WHERE M.FLGENABLED = 1 AND G.FLGENABLED = 1
286
- `;
287
- abilitazioni = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, [])
288
- .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase)));
289
- }
290
- else {
291
- const queryAbilitazioni = `
292
- SELECT
293
- A.CODMNU AS codice_menu,
294
- A.TIPABI AS tipo_abilitazione,
295
- M.DESMNU AS descrizione_menu,
296
- G.DESGRP AS descrizione_gruppo,
297
- G.CODGRP AS codice_gruppo,
298
- M.ICON AS icona,
299
- M.CODTIP AS tipo,
300
- M.PAGINA AS pagina,
301
- M.NOTE AS note
302
- FROM ABILITAZIONI A
303
- INNER JOIN MENU M ON A.CODMNU = M.CODMNU
304
- INNER JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
305
- WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND G.FLGENABLED = 1
306
- `;
307
- abilitazioni = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente])
308
- .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase)));
309
- const queryRuoli = `
310
- SELECT
311
- R.CODRUO AS codice_ruolo,
312
- R.DESRUO AS descrizione_ruolo,
313
- RM.CODMNU AS codice_menu,
314
- RM.TIPABI AS tipo_abilitazione,
315
- M.DESMNU AS descrizione_menu,
316
- M.NOTE AS note
317
- FROM UTENTI_RUOLI RU
318
- INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO
319
- INNER JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
320
- INNER JOIN MENU M ON RM.CODMNU = M.CODMNU
321
- INNER JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
322
- WHERE RU.CODUTE = ? AND M.FLGENABLED = 1 AND G.FLGENABLED = 1
323
- `;
324
- let ruoliResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]);
325
- ruoliResult = ruoliResult.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
326
- const ruoliMap = new Map();
327
- for (const row of ruoliResult) {
328
- const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;
329
- if (!ruoliMap.has(codiceRuolo)) {
330
- ruoliMap.set(codiceRuolo, {
331
- codiceRuolo,
332
- descrizioneRuolo: descrizioneRuolo === null || descrizioneRuolo === void 0 ? void 0 : descrizioneRuolo.trim(),
333
- menu: []
334
- });
335
- }
336
- if (codiceMenu) {
337
- ruoliMap.get(codiceRuolo).menu.push({
338
- codiceRuolo: codiceRuolo,
339
- codiceMenu: codiceMenu.trim(),
340
- tipoAbilitazione,
341
- });
342
- }
343
- }
344
- ruoli = Array.from(ruoliMap.values());
345
- }
405
+ const abilitazioni = yield this.getUserDirectPermissions(codiceUtente);
406
+ const ruoli = yield this.getUserRoles(codiceUtente);
346
407
  // Merge user-specific and role-based permissions
347
408
  const grantsMap = new Map();
348
409
  // Add user-specific permissions
@@ -357,7 +418,9 @@ let PermissionService = class PermissionService {
357
418
  }
358
419
  }
359
420
  }
360
- const grants = Array.from(grantsMap.values());
421
+ const grants = isSuperAdmin
422
+ ? yield this.getAllActiveMenusAsGrants()
423
+ : Array.from(grantsMap.values());
361
424
  return { abilitazioni, ruoli, grants };
362
425
  });
363
426
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionService.js","sourceRoot":"","sources":["../../../../src/accessi-module/Services/PermissionService/PermissionService.ts"],"names":[],"mappings":"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","sourcesContent":["\r\nimport { Orm } from \"../../../Orm\";\r\nimport { RestUtilities } from \"../../../Utilities\";\r\nimport { AccessiOptions } from \"../../AccessiModule\";\r\nimport { Permission, TipoAbilitazione } from \"../../Dtos\";\r\nimport { AbilitazioneMenu } from \"../../Dtos/AbilitazioneMenu\";\r\nimport { GroupWithMenusEntity } from \"../../Dtos/GetGroupsWithMenusResponse\";\r\nimport { MenuEntity } from \"../../Dtos/GetMenusResponse\";\r\nimport { Role } from \"../../Dtos/Role\";\r\nimport { Inject, Injectable } from \"@nestjs/common\";\r\n\r\n@Injectable()\r\nexport class PermissionService {\r\n constructor(\r\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions\r\n ) { }\r\n\r\n\r\n public async addAbilitazioni(codiceUtente: number, menuAbilitazioni: any[]): Promise<void> {\r\n const deleteQuery = `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`;\r\n await Orm.execute(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);\r\n\r\n const abilitazioniToInsert = menuAbilitazioni\r\n .flatMap(menuGrp => menuGrp.menu)\r\n .filter(menu => menu.flgChk)\r\n .map(menu => [codiceUtente, menu.codiceMenu, menu.tipoAbilitazione]);\r\n\r\n const insertQuery = `UPDATE OR INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`;\r\n\r\n for (const params of abilitazioniToInsert) {\r\n await Orm.execute(this.accessiOptions.databaseOptions, insertQuery, params);\r\n }\r\n }\r\n\r\n\r\n public async resetAbilitazioni(codiceUtente: number): Promise<void> {\r\n const query = \"DELETE FROM ABILITAZIONI WHERE CODUTE = ?\";\r\n await Orm.execute(this.accessiOptions.databaseOptions, query, [codiceUtente]);\r\n }\r\n\r\n public async updateOrInsertRole(role: Role, codiceRuolo: number | null = null): Promise<void> {\r\n\r\n // creazione nuovo ruolo\r\n if (codiceRuolo == null) {\r\n const createRoleQuery = `INSERT INTO RUOLI (DESRUO) VALUES (?)`;\r\n await Orm.execute(this.accessiOptions.databaseOptions, createRoleQuery, [role.descrizioneRuolo]);\r\n\r\n const createdRoleResult = await Orm.query(\r\n this.accessiOptions.databaseOptions,\r\n 'SELECT FIRST 1 CODRUO FROM RUOLI WHERE DESRUO = ? ORDER BY CODRUO DESC',\r\n [role.descrizioneRuolo]\r\n );\r\n const rawCodiceRuolo = createdRoleResult?.[0]?.CODRUO ?? createdRoleResult?.[0]?.codruo;\r\n const parsedCodiceRuolo = typeof rawCodiceRuolo === 'number'\r\n ? rawCodiceRuolo\r\n : Number.parseInt(`${rawCodiceRuolo ?? ''}`, 10);\r\n if (Number.isNaN(parsedCodiceRuolo)) {\r\n throw new Error('Creazione ruolo non riuscita: impossibile recuperare CODRUO.');\r\n }\r\n codiceRuolo = parsedCodiceRuolo;\r\n } else\r\n // aggiornamento ruolo esistente\r\n {\r\n\r\n let updateRoleQuery = `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`;\r\n await Orm.query(this.accessiOptions.databaseOptions, updateRoleQuery, [role.descrizioneRuolo, codiceRuolo]);\r\n\r\n let deleteRoleMenuQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;\r\n await Orm.query(this.accessiOptions.databaseOptions, deleteRoleMenuQuery, [codiceRuolo]);\r\n }\r\n\r\n if (codiceRuolo === null) {\r\n throw new Error('Operazione ruolo non riuscita: codice ruolo non valorizzato.');\r\n }\r\n\r\n let createRoleMenuQuery = `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`;\r\n for (let menu of role.menu) {\r\n await Orm.query(this.accessiOptions.databaseOptions, createRoleMenuQuery, [codiceRuolo, menu.codiceMenu, menu.tipoAbilitazione]);\r\n }\r\n\r\n }\r\n\r\n\r\n public async getRolesWithMenus(): Promise<Role[]> {\r\n const query = `\r\n SELECT \r\n R.CODRUO AS codice_ruolo, \r\n R.DESRUO AS descrizione_ruolo, \r\n M.CODMNU AS codice_menu, \r\n M.DESMNU AS descrizione_menu,\r\n M.NOTE AS note,\r\n RM.TIPABI AS tipo_abilitazione\r\n FROM RUOLI R\r\n LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\r\n LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU\r\n ORDER BY R.CODRUO, M.CODMNU\r\n `;\r\n\r\n let result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\r\n result = result.map(RestUtilities.convertKeysToCamelCase);\r\n\r\n const ruoliMap = new Map<number, Role>();\r\n\r\n for (const row of result) {\r\n const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;\r\n\r\n if (!ruoliMap.has(codiceRuolo)) {\r\n ruoliMap.set(codiceRuolo, {\r\n codiceRuolo,\r\n descrizioneRuolo: descrizioneRuolo?.trim(),\r\n menu: []\r\n });\r\n }\r\n\r\n const abilitationValue = typeof tipoAbilitazione === 'number'\r\n ? tipoAbilitazione\r\n : Number.parseInt(`${tipoAbilitazione ?? ''}`, 10);\r\n\r\n if (!codiceMenu || Number.isNaN(abilitationValue) || abilitationValue <= TipoAbilitazione.NESSUNA) {\r\n continue;\r\n }\r\n\r\n ruoliMap.get(codiceRuolo)!.menu.push({\r\n codiceRuolo: codiceRuolo,\r\n codiceMenu: codiceMenu.trim(),\r\n tipoAbilitazione: abilitationValue as TipoAbilitazione,\r\n });\r\n }\r\n\r\n return Array.from(ruoliMap.values());\r\n }\r\n\r\n\r\n public async assignRolesToUser(codiceUtente: number, roles: number[]): Promise<void> {\r\n\r\n const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;\r\n let result = await Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);\r\n\r\n if (result[0].COUNT === 0) {\r\n throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);\r\n }\r\n\r\n const deleteQuery = `DELETE FROM UTENTI_RUOLI WHERE CODUTE = ?`;\r\n await Orm.query(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);\r\n\r\n const insertQuery = `INSERT INTO UTENTI_RUOLI (CODUTE, CODRUO) VALUES (?, ?)`;\r\n\r\n for (const codiceRuolo of roles) {\r\n await Orm.query(this.accessiOptions.databaseOptions, insertQuery, [codiceUtente, codiceRuolo]);\r\n }\r\n }\r\n\r\n\r\n public async assignPermissionsToUser(codiceUtente: number, permissions: Permission[]): Promise<void> {\r\n\r\n const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;\r\n let result = await Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);\r\n\r\n if (result[0].COUNT === 0) {\r\n throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);\r\n }\r\n\r\n const deleteQuery = `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`;\r\n await Orm.execute(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);\r\n\r\n const insertQuery = `INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`;\r\n\r\n for (const permission of permissions) {\r\n await Orm.execute(this.accessiOptions.databaseOptions, insertQuery, [codiceUtente, permission.codiceMenu, permission.tipoAbilitazione]);\r\n }\r\n }\r\n\r\n\r\n public async deleteRole(codiceRuolo: number): Promise<void> {\r\n\r\n const existsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;\r\n let result = await Orm.query(this.accessiOptions.databaseOptions, existsQuery, [codiceRuolo]);\r\n\r\n if (result[0].COUNT === 0) {\r\n throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);\r\n }\r\n\r\n const deleteRoleMenusQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;\r\n await Orm.query(this.accessiOptions.databaseOptions, deleteRoleMenusQuery, [codiceRuolo]);\r\n\r\n const deleteRoleUsersQuery = `DELETE FROM UTENTI_RUOLI WHERE CODRUO = ?`;\r\n await Orm.query(this.accessiOptions.databaseOptions, deleteRoleUsersQuery, [codiceRuolo]);\r\n\r\n const deleteRoleQuery = `DELETE FROM RUOLI WHERE CODRUO = ?`;\r\n await Orm.query(this.accessiOptions.databaseOptions, deleteRoleQuery, [codiceRuolo]);\r\n\r\n }\r\n\r\n\r\n public async getMenus(): Promise<MenuEntity[]> {\r\n const query = `\r\n SELECT \r\n M.CODMNU AS codiceMenu, \r\n M.DESMNU AS descrizioneMenu,\r\n M.CODGRP AS codiceGruppo,\r\n G.DESGRP AS descrizioneGruppo,\r\n M.ICON AS icona,\r\n M.CODTIP AS tipo,\r\n M.PAGINA AS pagina,\r\n M.NOTE AS note\r\n FROM MENU M\r\n LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP\r\n WHERE M.FLGENABLED = 1\r\n ORDER BY G.CODGRP, M.CODMNU\r\n `;\r\n\r\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\r\n return result.map(RestUtilities.convertKeysToCamelCase);\r\n }\r\n\r\n\r\n public async getGroupsWithMenus(includeDisabled = false): Promise<GroupWithMenusEntity[]> {\r\n const filtersClause = includeDisabled\r\n ? ''\r\n : 'WHERE M.FLGENABLED = 1 AND (G.FLGENABLED IS NULL OR G.FLGENABLED = 1)';\r\n\r\n const query = `\r\n SELECT\r\n M.CODMNU AS codice_menu,\r\n M.DESMNU AS descrizione_menu,\r\n M.CODGRP AS codice_gruppo,\r\n G.DESGRP AS descrizione_gruppo,\r\n M.ICON AS icona,\r\n M.CODTIP AS tipo,\r\n M.PAGINA AS pagina,\r\n M.NOTE AS note,\r\n G.ORDINE AS ordine_gruppo,\r\n M.ORDINE as ordine_menu,\r\n M.FLGENABLED AS menu_enabled,\r\n G.FLGENABLED AS group_enabled\r\n FROM MENU M\r\n LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP\r\n ${filtersClause}\r\n ORDER BY G.CODGRP, M.CODMNU\r\n `;\r\n\r\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\r\n\r\n const groupMap = new Map<\r\n string,\r\n GroupWithMenusEntity & { menus: (MenuEntity & { enabled?: boolean })[] }\r\n >();\r\n\r\n result.forEach(row => {\r\n const converted = RestUtilities.convertKeysToCamelCase(row) as MenuEntity & {\r\n menuEnabled?: number | boolean;\r\n groupEnabled?: number | boolean;\r\n };\r\n\r\n const { menuEnabled, groupEnabled, ...menuBase } = converted as any;\r\n const normalizedGroupKey = menuBase.codiceGruppo ?? '__UNGROUPED__';\r\n const groupEnabledFlag =\r\n groupEnabled === undefined ? true : Number(groupEnabled) === 1 || groupEnabled === true;\r\n const menuEnabledFlag =\r\n menuEnabled === undefined ? true : Number(menuEnabled) === 1 || menuEnabled === true;\r\n\r\n if (!groupMap.has(normalizedGroupKey)) {\r\n groupMap.set(normalizedGroupKey, {\r\n codiceGruppo: menuBase.codiceGruppo ?? normalizedGroupKey,\r\n descrizioneGruppo: menuBase.descrizioneGruppo,\r\n ordineGruppo: menuBase.ordineGruppo,\r\n enabled: groupEnabledFlag,\r\n menus: [],\r\n });\r\n }\r\n\r\n if (menuBase.codiceMenu) {\r\n groupMap.get(normalizedGroupKey)!.menus.push({\r\n ...menuBase,\r\n enabled: menuEnabledFlag,\r\n });\r\n }\r\n });\r\n\r\n const groupsArray = Array.from(groupMap.values())\r\n .map(group => ({\r\n ...group,\r\n menus: (group.menus ?? []).sort(\r\n (a, b) =>\r\n (a.ordineMenu ?? Number.MAX_SAFE_INTEGER) - (b.ordineMenu ?? Number.MAX_SAFE_INTEGER),\r\n ),\r\n }))\r\n .sort(\r\n (a, b) =>\r\n (a.ordineGruppo ?? Number.MAX_SAFE_INTEGER) - (b.ordineGruppo ?? Number.MAX_SAFE_INTEGER),\r\n );\r\n\r\n return groupsArray;\r\n }\r\n\r\n\r\n\r\n public async getUserRolesAndGrants(codiceUtente: number): Promise<{\r\n abilitazioni: AbilitazioneMenu[],\r\n ruoli: Role[],\r\n grants: AbilitazioneMenu[]\r\n }> {\r\n const codiceUtenteQuery = \"SELECT FLGSUPER as flag_super FROM UTENTI_CONFIG WHERE CODUTE = ?\";\r\n let result = await Orm.query(this.accessiOptions.databaseOptions, codiceUtenteQuery, [codiceUtente]);\r\n if (!result || result.length == 0) throw new Error(\"Nessun utente trovato con il codice utente \" + codiceUtente);\r\n\r\n result = result.map(RestUtilities.convertKeysToCamelCase) as { flagSuper: boolean }[];\r\n const isSuperAdmin = result[0].flagSuper;\r\n\r\n let abilitazioni: AbilitazioneMenu[] = [];\r\n let ruoli: Role[] = [];\r\n\r\n if (isSuperAdmin) {\r\n const query = `\r\n SELECT\r\n M.CODMNU AS codice_menu,\r\n 30 AS tipo_abilitazione,\r\n M.DESMNU AS descrizione_menu,\r\n G.DESGRP AS descrizione_gruppo,\r\n G.CODGRP AS codice_gruppo,\r\n M.ICON AS icona,\r\n M.CODTIP AS tipo,\r\n M.PAGINA AS pagina,\r\n M.NOTE AS note\r\n FROM MENU M\r\n INNER JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\r\n WHERE M.FLGENABLED = 1 AND G.FLGENABLED = 1\r\n `;\r\n abilitazioni = await Orm.query(this.accessiOptions.databaseOptions, query, [])\r\n .then(results => results.map(RestUtilities.convertKeysToCamelCase)) as AbilitazioneMenu[];\r\n } else {\r\n const queryAbilitazioni = `\r\n SELECT\r\n A.CODMNU AS codice_menu,\r\n A.TIPABI AS tipo_abilitazione,\r\n M.DESMNU AS descrizione_menu,\r\n G.DESGRP AS descrizione_gruppo,\r\n G.CODGRP AS codice_gruppo,\r\n M.ICON AS icona,\r\n M.CODTIP AS tipo,\r\n M.PAGINA AS pagina,\r\n M.NOTE AS note\r\n FROM ABILITAZIONI A\r\n INNER JOIN MENU M ON A.CODMNU = M.CODMNU\r\n INNER JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\r\n WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND G.FLGENABLED = 1\r\n `;\r\n abilitazioni = await Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente])\r\n .then(results => results.map(RestUtilities.convertKeysToCamelCase)) as AbilitazioneMenu[];\r\n\r\n const queryRuoli = `\r\n SELECT\r\n R.CODRUO AS codice_ruolo,\r\n R.DESRUO AS descrizione_ruolo,\r\n RM.CODMNU AS codice_menu,\r\n RM.TIPABI AS tipo_abilitazione,\r\n M.DESMNU AS descrizione_menu,\r\n M.NOTE AS note\r\n FROM UTENTI_RUOLI RU\r\n INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO\r\n INNER JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\r\n INNER JOIN MENU M ON RM.CODMNU = M.CODMNU\r\n INNER JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\r\n WHERE RU.CODUTE = ? AND M.FLGENABLED = 1 AND G.FLGENABLED = 1\r\n `;\r\n let ruoliResult = await Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]);\r\n ruoliResult = ruoliResult.map(RestUtilities.convertKeysToCamelCase);\r\n\r\n const ruoliMap = new Map<number, Role>();\r\n for (const row of ruoliResult) {\r\n const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;\r\n\r\n if (!ruoliMap.has(codiceRuolo)) {\r\n ruoliMap.set(codiceRuolo, {\r\n codiceRuolo,\r\n descrizioneRuolo: descrizioneRuolo?.trim(),\r\n menu: []\r\n });\r\n }\r\n\r\n if (codiceMenu) {\r\n ruoliMap.get(codiceRuolo)!.menu.push({\r\n codiceRuolo: codiceRuolo,\r\n codiceMenu: codiceMenu.trim(),\r\n tipoAbilitazione,\r\n });\r\n }\r\n }\r\n\r\n ruoli = Array.from(ruoliMap.values());\r\n }\r\n\r\n // Merge user-specific and role-based permissions\r\n const grantsMap = new Map<string, AbilitazioneMenu>();\r\n\r\n // Add user-specific permissions\r\n for (const abilitazione of abilitazioni) {\r\n grantsMap.set(abilitazione.codiceMenu, abilitazione);\r\n }\r\n\r\n // Add role-based permissions if not already present\r\n for (const ruolo of ruoli) {\r\n for (const menu of ruolo.menu) {\r\n if (!grantsMap.has(menu.codiceMenu)) {\r\n grantsMap.set(menu.codiceMenu, menu);\r\n }\r\n }\r\n }\r\n\r\n const grants = Array.from(grantsMap.values());\r\n\r\n return { abilitazioni, ruoli, grants };\r\n }\r\n\r\n\r\n\r\n}\r\n\r\n\r\n"]}
1
+ {"version":3,"file":"PermissionService.js","sourceRoot":"","sources":["../../../../src/accessi-module/Services/PermissionService/PermissionService.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { Orm } from \"../../../Orm\";\nimport { RestUtilities } from \"../../../Utilities\";\nimport { AccessiOptions } from \"../../AccessiModule\";\nimport { Permission, TipoAbilitazione } from \"../../Dtos\";\nimport { AbilitazioneMenu } from \"../../Dtos/AbilitazioneMenu\";\nimport { GroupWithMenusEntity } from \"../../Dtos/GetGroupsWithMenusResponse\";\nimport { MenuEntity } from \"../../Dtos/GetMenusResponse\";\nimport { Role } from \"../../Dtos/Role\";\nimport { Inject, Injectable } from \"@nestjs/common\";\n\n@Injectable()\nexport class PermissionService {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions\n ) { }\n\n private getCountFromResult(result: any[], fieldName = 'COUNT'): number {\n const rawValue = result?.[0]?.[fieldName]\n ?? result?.[0]?.[fieldName.toLowerCase()]\n ?? result?.[0]?.count;\n return typeof rawValue === 'number' ? rawValue : Number.parseInt(`${rawValue ?? '0'}`, 10);\n }\n\n private async getAllActiveMenusAsGrants(): Promise<AbilitazioneMenu[]> {\n const query = `\n SELECT\n M.CODMNU AS codice_menu,\n 30 AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n G.DESGRP AS descrizione_gruppo,\n G.CODGRP AS codice_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note\n FROM MENU M\n LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\n WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1\n `;\n\n return await Orm.query(this.accessiOptions.databaseOptions, query, [])\n .then(results => results.map(RestUtilities.convertKeysToCamelCase)) as AbilitazioneMenu[];\n }\n\n private async getUserDirectPermissions(codiceUtente: number): Promise<AbilitazioneMenu[]> {\n const queryAbilitazioni = `\n SELECT\n A.CODMNU AS codice_menu,\n A.TIPABI AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n G.DESGRP AS descrizione_gruppo,\n G.CODGRP AS codice_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note\n FROM ABILITAZIONI A\n INNER JOIN MENU M ON A.CODMNU = M.CODMNU\n LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\n WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1\n `;\n\n return await Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente])\n .then(results => results.map(RestUtilities.convertKeysToCamelCase)) as AbilitazioneMenu[];\n }\n\n private async getUserRoles(codiceUtente: number): Promise<Role[]> {\n const queryRuoli = `\n SELECT\n R.CODRUO AS codice_ruolo,\n R.DESRUO AS descrizione_ruolo,\n RM.CODMNU AS codice_menu,\n RM.TIPABI AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n M.NOTE AS note\n FROM UTENTI_RUOLI RU\n INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO\n LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\n LEFT JOIN MENU M\n ON RM.CODMNU = M.CODMNU\n AND M.FLGENABLED = 1\n LEFT JOIN MENU_GRP G\n ON G.CODGRP = M.CODGRP\n AND COALESCE(G.FLGENABLED, 1) = 1\n WHERE RU.CODUTE = ?\n `;\n let ruoliResult = await Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]);\n ruoliResult = ruoliResult.map(RestUtilities.convertKeysToCamelCase);\n\n const ruoliMap = new Map<number, Role>();\n for (const row of ruoliResult) {\n const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;\n\n if (!ruoliMap.has(codiceRuolo)) {\n ruoliMap.set(codiceRuolo, {\n codiceRuolo,\n descrizioneRuolo: descrizioneRuolo?.trim(),\n menu: []\n });\n }\n\n if (codiceMenu && descrizioneMenu) {\n ruoliMap.get(codiceRuolo)!.menu.push({\n codiceRuolo: codiceRuolo,\n codiceMenu: codiceMenu.trim(),\n tipoAbilitazione,\n });\n }\n }\n\n return Array.from(ruoliMap.values());\n }\n\n\n public async addAbilitazioni(codiceUtente: number, menuAbilitazioni: any[]): Promise<void> {\n const deleteQuery = `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, deleteQuery, [codiceUtente]);\n\n const abilitazioniToInsert = menuAbilitazioni\n .flatMap(menuGrp => menuGrp.menu)\n .filter(menu => menu.flgChk)\n .map(menu => [codiceUtente, menu.codiceMenu, menu.tipoAbilitazione]);\n\n const insertQuery = `UPDATE OR INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`;\n\n for (const params of abilitazioniToInsert) {\n await Orm.execute(this.accessiOptions.databaseOptions, insertQuery, params);\n }\n }\n\n\n public async resetAbilitazioni(codiceUtente: number): Promise<void> {\n const query = \"DELETE FROM ABILITAZIONI WHERE CODUTE = ?\";\n await Orm.execute(this.accessiOptions.databaseOptions, query, [codiceUtente]);\n }\n\n public async updateOrInsertRole(role: Role, codiceRuolo: number | null = null): Promise<void> {\n\n // creazione nuovo ruolo\n if (codiceRuolo == null) {\n const createRoleQuery = `INSERT INTO RUOLI (DESRUO) VALUES (?)`;\n await Orm.execute(this.accessiOptions.databaseOptions, createRoleQuery, [role.descrizioneRuolo]);\n\n const createdRoleResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n 'SELECT FIRST 1 CODRUO FROM RUOLI WHERE DESRUO = ? ORDER BY CODRUO DESC',\n [role.descrizioneRuolo]\n );\n const rawCodiceRuolo = createdRoleResult?.[0]?.CODRUO ?? createdRoleResult?.[0]?.codruo;\n const parsedCodiceRuolo = typeof rawCodiceRuolo === 'number'\n ? rawCodiceRuolo\n : Number.parseInt(`${rawCodiceRuolo ?? ''}`, 10);\n if (Number.isNaN(parsedCodiceRuolo)) {\n throw new Error('Creazione ruolo non riuscita: impossibile recuperare CODRUO.');\n }\n codiceRuolo = parsedCodiceRuolo;\n } else {\n // aggiornamento ruolo esistente\n const updateRoleQuery = `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, updateRoleQuery, [role.descrizioneRuolo, codiceRuolo]);\n\n const deleteRoleMenuQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, deleteRoleMenuQuery, [codiceRuolo]);\n }\n\n if (codiceRuolo === null) {\n throw new Error('Operazione ruolo non riuscita: codice ruolo non valorizzato.');\n }\n\n const createRoleMenuQuery = `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`;\n for (const menu of role.menu) {\n await Orm.execute(this.accessiOptions.databaseOptions, createRoleMenuQuery, [codiceRuolo, menu.codiceMenu, menu.tipoAbilitazione]);\n }\n\n }\n\n\n public async getRolesWithMenus(): Promise<Role[]> {\n const query = `\n SELECT \n R.CODRUO AS codice_ruolo, \n R.DESRUO AS descrizione_ruolo, \n M.CODMNU AS codice_menu, \n M.DESMNU AS descrizione_menu,\n M.NOTE AS note,\n RM.TIPABI AS tipo_abilitazione\n FROM RUOLI R\n LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\n LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU\n ORDER BY R.CODRUO, M.CODMNU\n `;\n\n let result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\n result = result.map(RestUtilities.convertKeysToCamelCase);\n\n const ruoliMap = new Map<number, Role>();\n\n for (const row of result) {\n const { codiceRuolo, descrizioneRuolo, codiceMenu, descrizioneMenu, tipoAbilitazione } = row;\n\n if (!ruoliMap.has(codiceRuolo)) {\n ruoliMap.set(codiceRuolo, {\n codiceRuolo,\n descrizioneRuolo: descrizioneRuolo?.trim(),\n menu: []\n });\n }\n\n const abilitationValue = typeof tipoAbilitazione === 'number'\n ? tipoAbilitazione\n : Number.parseInt(`${tipoAbilitazione ?? ''}`, 10);\n\n if (!codiceMenu || Number.isNaN(abilitationValue) || abilitationValue <= TipoAbilitazione.NESSUNA) {\n continue;\n }\n\n ruoliMap.get(codiceRuolo)!.menu.push({\n codiceRuolo: codiceRuolo,\n codiceMenu: codiceMenu.trim(),\n tipoAbilitazione: abilitationValue as TipoAbilitazione,\n });\n }\n\n return Array.from(ruoliMap.values());\n }\n\n\n public async assignRolesToUser(codiceUtente: number, roles: number[]): Promise<void> {\n\n const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;\n let result = await Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);\n\n if (this.getCountFromResult(result) === 0) {\n throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);\n }\n\n const normalizedRoles = Array.from(\n new Set(\n roles\n .map((role) => Number.parseInt(`${role ?? ''}`, 10))\n .filter((role) => Number.isInteger(role) && role > 0),\n ),\n );\n\n const queriesWithParams = [\n { query: `DELETE FROM UTENTI_RUOLI WHERE CODUTE = ?`, params: [codiceUtente] },\n ...normalizedRoles.map((codiceRuolo) => ({\n query: `INSERT INTO UTENTI_RUOLI (CODUTE, CODRUO) VALUES (?, ?)`,\n params: [codiceUtente, codiceRuolo],\n })),\n ];\n\n if (normalizedRoles.length > 0) {\n const roleExistsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;\n for (const codiceRuolo of normalizedRoles) {\n const roleResult = await Orm.query(this.accessiOptions.databaseOptions, roleExistsQuery, [codiceRuolo]);\n if (this.getCountFromResult(roleResult) === 0) {\n throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);\n }\n }\n }\n\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);\n\n const assignedRolesResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT COUNT(*) FROM UTENTI_RUOLI WHERE CODUTE = ?`,\n [codiceUtente],\n );\n const assignedRolesCount = this.getCountFromResult(assignedRolesResult);\n if (assignedRolesCount !== normalizedRoles.length) {\n throw new Error(\n `Persistenza ruoli non coerente per utente ${codiceUtente}: attesi ${normalizedRoles.length}, trovati ${assignedRolesCount}.`,\n );\n }\n }\n\n\n public async assignPermissionsToUser(codiceUtente: number, permissions: Permission[]): Promise<void> {\n\n const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;\n let result = await Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);\n\n if (this.getCountFromResult(result) === 0) {\n throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);\n }\n\n const normalizedPermissions = Array.from(\n new Map(\n permissions\n .map((permission) => ({\n codiceMenu: `${permission?.codiceMenu ?? ''}`.trim(),\n tipoAbilitazione: Number.parseInt(`${permission?.tipoAbilitazione ?? ''}`, 10),\n }))\n .filter(\n (permission) =>\n permission.codiceMenu.length > 0 && Number.isInteger(permission.tipoAbilitazione),\n )\n .map((permission) => [permission.codiceMenu, permission] as const),\n ).values(),\n );\n\n const queriesWithParams = [\n { query: `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`, params: [codiceUtente] },\n ...normalizedPermissions.map((permission) => ({\n query: `INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`,\n params: [codiceUtente, permission.codiceMenu, permission.tipoAbilitazione],\n })),\n ];\n\n if (normalizedPermissions.length > 0) {\n const menuExistsQuery = `SELECT COUNT(*) FROM MENU WHERE CODMNU = ?`;\n for (const permission of normalizedPermissions) {\n const menuResult = await Orm.query(this.accessiOptions.databaseOptions, menuExistsQuery, [permission.codiceMenu]);\n if (this.getCountFromResult(menuResult) === 0) {\n throw new Error(`Il menu con codice ${permission.codiceMenu} non esiste.`);\n }\n }\n }\n\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);\n\n const assignedPermissionsResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT COUNT(*) FROM ABILITAZIONI WHERE CODUTE = ?`,\n [codiceUtente],\n );\n const assignedPermissionsCount = this.getCountFromResult(assignedPermissionsResult);\n if (assignedPermissionsCount !== normalizedPermissions.length) {\n throw new Error(\n `Persistenza abilitazioni non coerente per utente ${codiceUtente}: attese ${normalizedPermissions.length}, trovate ${assignedPermissionsCount}.`,\n );\n }\n }\n\n\n public async deleteRole(codiceRuolo: number): Promise<void> {\n\n const existsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;\n let result = await Orm.query(this.accessiOptions.databaseOptions, existsQuery, [codiceRuolo]);\n\n if (result[0].COUNT === 0) {\n throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);\n }\n\n const deleteRoleMenusQuery = `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, deleteRoleMenusQuery, [codiceRuolo]);\n\n const deleteRoleUsersQuery = `DELETE FROM UTENTI_RUOLI WHERE CODRUO = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, deleteRoleUsersQuery, [codiceRuolo]);\n\n const deleteRoleQuery = `DELETE FROM RUOLI WHERE CODRUO = ?`;\n await Orm.execute(this.accessiOptions.databaseOptions, deleteRoleQuery, [codiceRuolo]);\n\n }\n\n\n public async getMenus(): Promise<MenuEntity[]> {\n const query = `\n SELECT \n M.CODMNU AS codiceMenu, \n M.DESMNU AS descrizioneMenu,\n M.CODGRP AS codiceGruppo,\n G.DESGRP AS descrizioneGruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note\n FROM MENU M\n LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP\n WHERE M.FLGENABLED = 1\n ORDER BY G.CODGRP, M.CODMNU\n `;\n\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\n return result.map(RestUtilities.convertKeysToCamelCase);\n }\n\n\n public async getGroupsWithMenus(includeDisabled = false): Promise<GroupWithMenusEntity[]> {\n const filtersClause = includeDisabled\n ? ''\n : 'WHERE M.FLGENABLED = 1 AND (G.FLGENABLED IS NULL OR G.FLGENABLED = 1)';\n\n const query = `\n SELECT\n M.CODMNU AS codice_menu,\n M.DESMNU AS descrizione_menu,\n M.CODGRP AS codice_gruppo,\n G.DESGRP AS descrizione_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note,\n G.ORDINE AS ordine_gruppo,\n M.ORDINE as ordine_menu,\n M.FLGENABLED AS menu_enabled,\n G.FLGENABLED AS group_enabled\n FROM MENU M\n LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP\n ${filtersClause}\n ORDER BY G.CODGRP, M.CODMNU\n `;\n\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\n\n const groupMap = new Map<\n string,\n GroupWithMenusEntity & { menus: (MenuEntity & { enabled?: boolean })[] }\n >();\n\n result.forEach(row => {\n const converted = RestUtilities.convertKeysToCamelCase(row) as MenuEntity & {\n menuEnabled?: number | boolean;\n groupEnabled?: number | boolean;\n };\n\n const { menuEnabled, groupEnabled, ...menuBase } = converted as any;\n const normalizedGroupKey = menuBase.codiceGruppo ?? '__UNGROUPED__';\n const groupEnabledFlag =\n groupEnabled === undefined ? true : Number(groupEnabled) === 1 || groupEnabled === true;\n const menuEnabledFlag =\n menuEnabled === undefined ? true : Number(menuEnabled) === 1 || menuEnabled === true;\n\n if (!groupMap.has(normalizedGroupKey)) {\n groupMap.set(normalizedGroupKey, {\n codiceGruppo: menuBase.codiceGruppo ?? normalizedGroupKey,\n descrizioneGruppo: menuBase.descrizioneGruppo,\n ordineGruppo: menuBase.ordineGruppo,\n enabled: groupEnabledFlag,\n menus: [],\n });\n }\n\n if (menuBase.codiceMenu) {\n groupMap.get(normalizedGroupKey)!.menus.push({\n ...menuBase,\n enabled: menuEnabledFlag,\n });\n }\n });\n\n const groupsArray = Array.from(groupMap.values())\n .map(group => ({\n ...group,\n menus: (group.menus ?? []).sort(\n (a, b) =>\n (a.ordineMenu ?? Number.MAX_SAFE_INTEGER) - (b.ordineMenu ?? Number.MAX_SAFE_INTEGER),\n ),\n }))\n .sort(\n (a, b) =>\n (a.ordineGruppo ?? Number.MAX_SAFE_INTEGER) - (b.ordineGruppo ?? Number.MAX_SAFE_INTEGER),\n );\n\n return groupsArray;\n }\n\n\n\n public async getUserRolesAndGrants(codiceUtente: number): Promise<{\n abilitazioni: AbilitazioneMenu[],\n ruoli: Role[],\n grants: AbilitazioneMenu[]\n }> {\n const codiceUtenteQuery = \"SELECT FLGSUPER as flag_super FROM UTENTI_CONFIG WHERE CODUTE = ?\";\n let result = await Orm.query(this.accessiOptions.databaseOptions, codiceUtenteQuery, [codiceUtente]);\n if (!result || result.length == 0) throw new Error(\"Nessun utente trovato con il codice utente \" + codiceUtente);\n\n result = result.map(RestUtilities.convertKeysToCamelCase) as { flagSuper: boolean }[];\n const isSuperAdmin = result[0].flagSuper;\n\n const abilitazioni = await this.getUserDirectPermissions(codiceUtente);\n const ruoli = await this.getUserRoles(codiceUtente);\n\n // Merge user-specific and role-based permissions\n const grantsMap = new Map<string, AbilitazioneMenu>();\n\n // Add user-specific permissions\n for (const abilitazione of abilitazioni) {\n grantsMap.set(abilitazione.codiceMenu, abilitazione);\n }\n\n // Add role-based permissions if not already present\n for (const ruolo of ruoli) {\n for (const menu of ruolo.menu) {\n if (!grantsMap.has(menu.codiceMenu)) {\n grantsMap.set(menu.codiceMenu, menu);\n }\n }\n }\n\n const grants = isSuperAdmin\n ? await this.getAllActiveMenusAsGrants()\n : Array.from(grantsMap.values());\n\n return { abilitazioni, ruoli, grants };\n }\n\n\n\n}\n\n\n"]}