emilsoftware-utilities 2.0.0-dev.60 → 2.0.0-dev.62

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 (79) hide show
  1. package/dist/accessi-module/AccessiModule.d.ts +6 -0
  2. package/dist/accessi-module/AccessiModule.js.map +1 -1
  3. package/dist/accessi-module/Console/console.js +163 -4
  4. package/dist/accessi-module/Console/console.js.map +1 -1
  5. package/dist/accessi-module/Console/generated/accessiApi.d.ts +68 -5
  6. package/dist/accessi-module/Console/generated/accessiApi.js +84 -10
  7. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
  8. package/dist/accessi-module/Console/generated/model/createScopeRequest.d.ts +18 -0
  9. package/dist/accessi-module/Console/generated/model/createScopeRequest.js +9 -0
  10. package/dist/accessi-module/Console/generated/model/createScopeRequest.js.map +1 -0
  11. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.d.ts +4 -0
  12. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js.map +1 -1
  13. package/dist/accessi-module/Console/generated/model/getMenuScopesResponse.d.ts +14 -0
  14. package/dist/accessi-module/Console/generated/model/getMenuScopesResponse.js +3 -0
  15. package/dist/accessi-module/Console/generated/model/getMenuScopesResponse.js.map +1 -0
  16. package/dist/accessi-module/Console/generated/model/getMenusParams.d.ts +12 -0
  17. package/dist/accessi-module/Console/generated/model/getMenusParams.js +9 -0
  18. package/dist/accessi-module/Console/generated/model/getMenusParams.js.map +1 -0
  19. package/dist/accessi-module/Console/generated/model/getScopesResponse.d.ts +14 -0
  20. package/dist/accessi-module/Console/generated/model/getScopesResponse.js +3 -0
  21. package/dist/accessi-module/Console/generated/model/getScopesResponse.js.map +1 -0
  22. package/dist/accessi-module/Console/generated/model/getUserRolesAndGrantsParams.d.ts +12 -0
  23. package/dist/accessi-module/Console/generated/model/getUserRolesAndGrantsParams.js +9 -0
  24. package/dist/accessi-module/Console/generated/model/getUserRolesAndGrantsParams.js.map +1 -0
  25. package/dist/accessi-module/Console/generated/model/index.d.ts +9 -0
  26. package/dist/accessi-module/Console/generated/model/index.js +9 -0
  27. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  28. package/dist/accessi-module/Console/generated/model/loginRequest.d.ts +2 -0
  29. package/dist/accessi-module/Console/generated/model/loginRequest.js.map +1 -1
  30. package/dist/accessi-module/Console/generated/model/scopeEntity.d.ts +12 -0
  31. package/dist/accessi-module/Console/generated/model/scopeEntity.js +9 -0
  32. package/dist/accessi-module/Console/generated/model/scopeEntity.js.map +1 -0
  33. package/dist/accessi-module/Console/generated/model/setMenuScopesRequest.d.ts +10 -0
  34. package/dist/accessi-module/Console/generated/model/setMenuScopesRequest.js +9 -0
  35. package/dist/accessi-module/Console/generated/model/setMenuScopesRequest.js.map +1 -0
  36. package/dist/accessi-module/Console/generated/model/setScopeMenusRequest.d.ts +10 -0
  37. package/dist/accessi-module/Console/generated/model/setScopeMenusRequest.js +9 -0
  38. package/dist/accessi-module/Console/generated/model/setScopeMenusRequest.js.map +1 -0
  39. package/dist/accessi-module/Console/generated/model/updateScopeRequest.d.ts +13 -0
  40. package/dist/accessi-module/Console/generated/model/updateScopeRequest.js +9 -0
  41. package/dist/accessi-module/Console/generated/model/updateScopeRequest.js.map +1 -0
  42. package/dist/accessi-module/Console/index.html +1 -0
  43. package/dist/accessi-module/Controllers/PermissionController.d.ts +11 -3
  44. package/dist/accessi-module/Controllers/PermissionController.js +208 -12
  45. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  46. package/dist/accessi-module/Dtos/LoginRequest.d.ts +2 -0
  47. package/dist/accessi-module/Dtos/LoginRequest.js +10 -0
  48. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  49. package/dist/accessi-module/Dtos/ScopeDtos.d.ts +28 -0
  50. package/dist/accessi-module/Dtos/ScopeDtos.js +103 -0
  51. package/dist/accessi-module/Dtos/ScopeDtos.js.map +1 -0
  52. package/dist/accessi-module/Dtos/index.d.ts +1 -0
  53. package/dist/accessi-module/Dtos/index.js +1 -0
  54. package/dist/accessi-module/Dtos/index.js.map +1 -1
  55. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +1 -1
  56. package/dist/accessi-module/Services/AuthService/AuthService.js +3 -3
  57. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  58. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +27 -4
  59. package/dist/accessi-module/Services/PermissionService/PermissionService.js +177 -24
  60. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  61. package/dist/accessi-module/Services/UserService/UserService.d.ts +1 -0
  62. package/dist/accessi-module/Services/UserService/UserService.js +1 -1
  63. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  64. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +2 -0
  65. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  66. package/dist/accessi-module/database-updates/accessiSchema.d.ts +1 -1
  67. package/dist/accessi-module/database-updates/accessiSchema.js +12 -1
  68. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -1
  69. package/dist/accessi-module/database-updates/menuScopeSeed.d.ts +15 -0
  70. package/dist/accessi-module/database-updates/menuScopeSeed.js +338 -0
  71. package/dist/accessi-module/database-updates/menuScopeSeed.js.map +1 -0
  72. package/dist/accessi-module/database-updates/menuScopeSeeder.d.ts +8 -0
  73. package/dist/accessi-module/database-updates/menuScopeSeeder.js +131 -0
  74. package/dist/accessi-module/database-updates/menuScopeSeeder.js.map +1 -0
  75. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +4 -1
  76. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  77. package/dist/emilsoftware-utilities-2.0.0-dev.62.tgz +0 -0
  78. package/package.json +3 -3
  79. package/dist/emilsoftware-utilities-2.0.0-dev.60.tgz +0 -0
@@ -50,7 +50,8 @@ let PermissionService = class PermissionService {
50
50
  return new Set(result.map((row) => { var _a; return Number((_a = row[fieldName]) !== null && _a !== void 0 ? _a : row[fieldName.toLowerCase()]); }));
51
51
  }
52
52
  getAllActiveMenusAsGrants() {
53
- return __awaiter(this, void 0, void 0, function* () {
53
+ return __awaiter(this, arguments, void 0, function* (scopeCodes = []) {
54
+ const scopeFilter = this.scopeFilter('M', scopeCodes);
54
55
  const query = `
55
56
  SELECT
56
57
  M.CODMNU AS codice_menu,
@@ -64,14 +65,49 @@ let PermissionService = class PermissionService {
64
65
  M.NOTE AS note
65
66
  FROM MENU M
66
67
  LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
67
- WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
68
+ WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}
68
69
  `;
69
- return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, [])
70
+ return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, scopeFilter.params)
70
71
  .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase));
71
72
  });
72
73
  }
73
- getUserDirectPermissions(codiceUtente) {
74
+ /**
75
+ * Normalizza e valida il filtro `scope` (CSV). Restituisce i codici in
76
+ * maiuscolo; lista vuota significa "nessun filtro" (comportamento storico).
77
+ */
78
+ resolveScopeCodes(scope) {
74
79
  return __awaiter(this, void 0, void 0, function* () {
80
+ const codes = Array.from(new Set(String(scope !== null && scope !== void 0 ? scope : '')
81
+ .split(',')
82
+ .map((value) => value.trim().toUpperCase())
83
+ .filter((value) => value.length > 0)));
84
+ if (codes.length === 0) {
85
+ return [];
86
+ }
87
+ const placeholders = codes.map(() => '?').join(', ');
88
+ const rows = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT CODICE FROM SCOPES WHERE CODICE IN (${placeholders})`, codes));
89
+ const known = new Set(rows.map((row) => { var _a, _b; return String((_b = (_a = row.CODICE) !== null && _a !== void 0 ? _a : row.codice) !== null && _b !== void 0 ? _b : '').trim().toUpperCase(); }));
90
+ const missing = codes.filter((code) => !known.has(code));
91
+ if (missing.length > 0) {
92
+ throw new common_1.BadRequestException(`Scope non validi: ${missing.join(', ')}.`);
93
+ }
94
+ return codes;
95
+ });
96
+ }
97
+ /** Clausola SQL EXISTS per filtrare i menu sugli scope richiesti. */
98
+ scopeFilter(alias, scopeCodes) {
99
+ if (scopeCodes.length === 0) {
100
+ return { sql: '', params: [] };
101
+ }
102
+ const placeholders = scopeCodes.map(() => '?').join(', ');
103
+ return {
104
+ sql: ` AND EXISTS (SELECT 1 FROM MENU_SCOPES MS WHERE MS.CODICE_MENU = ${alias}.CODMNU AND MS.CODICE_SCOPE IN (${placeholders}))`,
105
+ params: [...scopeCodes],
106
+ };
107
+ }
108
+ getUserDirectPermissions(codiceUtente_1) {
109
+ return __awaiter(this, arguments, void 0, function* (codiceUtente, scopeCodes = []) {
110
+ const scopeFilter = this.scopeFilter('M', scopeCodes);
75
111
  const queryAbilitazioni = `
76
112
  SELECT
77
113
  A.CODMNU AS codice_menu,
@@ -86,14 +122,15 @@ let PermissionService = class PermissionService {
86
122
  FROM ABILITAZIONI A
87
123
  INNER JOIN MENU M ON A.CODMNU = M.CODMNU
88
124
  LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
89
- WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
125
+ WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}
90
126
  `;
91
- return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente])
127
+ return yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente, ...scopeFilter.params])
92
128
  .then(results => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase));
93
129
  });
94
130
  }
95
- getUserRoles(codiceUtente) {
96
- return __awaiter(this, void 0, void 0, function* () {
131
+ getUserRoles(codiceUtente_1) {
132
+ return __awaiter(this, arguments, void 0, function* (codiceUtente, scopeCodes = []) {
133
+ const scopeFilter = this.scopeFilter('M', scopeCodes);
97
134
  const queryRuoli = `
98
135
  SELECT
99
136
  R.CODRUO AS codice_ruolo,
@@ -110,9 +147,9 @@ let PermissionService = class PermissionService {
110
147
  AND M.FLGENABLED = 1
111
148
  LEFT JOIN MENU_GRP G
112
149
  ON G.CODGRP = M.CODGRP
113
- WHERE RU.CODUTE = ?
150
+ WHERE RU.CODUTE = ?${scopeFilter.sql}
114
151
  `;
115
- const ruoliResult = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente]))
152
+ const ruoliResult = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente, ...scopeFilter.params]))
116
153
  .map(Utilities_1.RestUtilities.convertKeysToCamelCase);
117
154
  return this.assembleRoles(ruoliResult);
118
155
  });
@@ -391,8 +428,10 @@ let PermissionService = class PermissionService {
391
428
  });
392
429
  }
393
430
  /** Restituisce solo menu abilitati; per il catalogo amministrativo usare `getGroupsWithMenus(true)`. */
394
- getMenus() {
431
+ getMenus(scope) {
395
432
  return __awaiter(this, void 0, void 0, function* () {
433
+ const scopeCodes = yield this.resolveScopeCodes(scope);
434
+ const scopeFilter = this.scopeFilter('M', scopeCodes);
396
435
  const query = `
397
436
  SELECT
398
437
  M.CODMNU AS codice_menu,
@@ -407,10 +446,10 @@ let PermissionService = class PermissionService {
407
446
  M.ORDINE AS ordine_menu
408
447
  FROM MENU M
409
448
  LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP
410
- WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1
449
+ WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}
411
450
  ORDER BY G.CODGRP, M.CODMNU
412
451
  `;
413
- const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
452
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, scopeFilter.params);
414
453
  return result.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
415
454
  });
416
455
  }
@@ -419,10 +458,15 @@ let PermissionService = class PermissionService {
419
458
  * i flussi applicativi di autorizzazione devono usare il comportamento predefinito, che nasconde voci disabilitate.
420
459
  */
421
460
  getGroupsWithMenus() {
422
- return __awaiter(this, arguments, void 0, function* (includeDisabled = false) {
423
- const filtersClause = includeDisabled
461
+ return __awaiter(this, arguments, void 0, function* (includeDisabled = false, scope) {
462
+ const scopeCodes = yield this.resolveScopeCodes(scope);
463
+ const scopeFilter = this.scopeFilter('M', scopeCodes);
464
+ let filtersClause = includeDisabled
424
465
  ? ''
425
466
  : 'WHERE M.FLGENABLED = 1 AND (G.FLGENABLED IS NULL OR G.FLGENABLED = 1)';
467
+ if (scopeFilter.sql) {
468
+ filtersClause = filtersClause ? `${filtersClause}${scopeFilter.sql}` : `WHERE 1 = 1${scopeFilter.sql}`;
469
+ }
426
470
  const query = `
427
471
  SELECT
428
472
  M.CODMNU AS codice_menu,
@@ -442,7 +486,7 @@ let PermissionService = class PermissionService {
442
486
  ${filtersClause}
443
487
  ORDER BY G.CODGRP, M.CODMNU
444
488
  `;
445
- const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, []);
489
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, scopeFilter.params);
446
490
  const groupMap = new Map();
447
491
  result.forEach((row) => {
448
492
  var _a, _b, _c;
@@ -676,17 +720,18 @@ let PermissionService = class PermissionService {
676
720
  * Calcola l'autorizzazione effettiva: grant diretti e grant dei ruoli sono uniti per codice menu
677
721
  * prendendo il livello massimo. I superutenti ricevono tutti i menu attivi.
678
722
  */
679
- getUserRolesAndGrants(codiceUtente) {
723
+ getUserRolesAndGrants(codiceUtente, scope) {
680
724
  return __awaiter(this, void 0, void 0, function* () {
681
725
  var _a;
726
+ const scopeCodes = yield this.resolveScopeCodes(scope);
682
727
  const codiceUtenteQuery = "SELECT FLGSUPER as flag_super FROM UTENTI_CONFIG WHERE CODUTE = ?";
683
728
  const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, codiceUtenteQuery, [codiceUtente]);
684
729
  if (!result || result.length == 0)
685
730
  throw new Error("Nessun utente trovato con il codice utente " + codiceUtente);
686
731
  const isSuperAdmin = this.isSuperFlag((_a = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase)[0]) === null || _a === void 0 ? void 0 : _a.flagSuper);
687
- const abilitazioni = yield this.getUserDirectPermissions(codiceUtente);
688
- const ruoli = yield this.getUserRoles(codiceUtente);
689
- const grants = this.composeGrants(abilitazioni, ruoli, isSuperAdmin, yield this.getAllActiveMenusAsGrants());
732
+ const abilitazioni = yield this.getUserDirectPermissions(codiceUtente, scopeCodes);
733
+ const ruoli = yield this.getUserRoles(codiceUtente, scopeCodes);
734
+ const grants = this.composeGrants(abilitazioni, ruoli, isSuperAdmin, yield this.getAllActiveMenusAsGrants(scopeCodes));
690
735
  return { abilitazioni, ruoli, grants };
691
736
  });
692
737
  }
@@ -698,9 +743,11 @@ let PermissionService = class PermissionService {
698
743
  * (invece di N set di query) e restituisce mappa per codice utente. Stessa composizione della
699
744
  * lettura singola.
700
745
  */
701
- getUsersRolesAndGrants(codiciUtente) {
746
+ getUsersRolesAndGrants(codiciUtente, scope) {
702
747
  return __awaiter(this, void 0, void 0, function* () {
703
748
  var _a, _b;
749
+ const scopeCodes = yield this.resolveScopeCodes(scope);
750
+ const scopeFilter = this.scopeFilter('M', scopeCodes);
704
751
  const result = new Map();
705
752
  const ids = Array.from(new Set(codiciUtente.filter((id) => Number.isInteger(id) && id > 0)));
706
753
  if (ids.length === 0) {
@@ -728,7 +775,7 @@ let PermissionService = class PermissionService {
728
775
  FROM ABILITAZIONI A
729
776
  INNER JOIN MENU M ON A.CODMNU = M.CODMNU
730
777
  LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
731
- WHERE A.CODUTE IN (${placeholders}) AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1`, ids)).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
778
+ WHERE A.CODUTE IN (${placeholders}) AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}`, [...ids, ...scopeFilter.params])).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
732
779
  const roleRows = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `SELECT
733
780
  RU.CODUTE AS codice_utente,
734
781
  R.CODRUO AS codice_ruolo,
@@ -742,8 +789,8 @@ let PermissionService = class PermissionService {
742
789
  LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO
743
790
  LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU AND M.FLGENABLED = 1
744
791
  LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP
745
- WHERE RU.CODUTE IN (${placeholders})`, ids)).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
746
- const allActiveMenus = yield this.getAllActiveMenusAsGrants();
792
+ WHERE RU.CODUTE IN (${placeholders})${scopeFilter.sql}`, [...ids, ...scopeFilter.params])).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
793
+ const allActiveMenus = yield this.getAllActiveMenusAsGrants(scopeCodes);
747
794
  const permissionsByUser = new Map();
748
795
  for (const row of permissionRows) {
749
796
  const { codiceUtente } = row, grant = __rest(row, ["codiceUtente"]);
@@ -781,6 +828,112 @@ let PermissionService = class PermissionService {
781
828
  return result;
782
829
  });
783
830
  }
831
+ // -----------------------------------------------------------------------
832
+ // Scope applicativi: catalogo e associazioni menu/scope.
833
+ // -----------------------------------------------------------------------
834
+ normalizeScopeCode(value) {
835
+ const code = String(value !== null && value !== void 0 ? value : '').trim().toUpperCase();
836
+ if (!/^[A-Z][A-Z0-9_]{0,19}$/.test(code)) {
837
+ throw new common_1.BadRequestException('Codice scope non valido: usa lettere maiuscole, cifre e underscore (max 20 caratteri).');
838
+ }
839
+ return code;
840
+ }
841
+ assertScopeExists(codiceScope) {
842
+ return __awaiter(this, void 0, void 0, function* () {
843
+ if ((yield this.countWhere('SCOPES', 'CODICE', codiceScope)) === 0) {
844
+ throw new common_1.BadRequestException(`Lo scope ${codiceScope} non esiste.`);
845
+ }
846
+ });
847
+ }
848
+ assertMenuExists(codiceMenu) {
849
+ return __awaiter(this, void 0, void 0, function* () {
850
+ if ((yield this.countWhere('MENU', 'CODMNU', codiceMenu)) === 0) {
851
+ throw new common_1.BadRequestException(`Il menu ${codiceMenu} non esiste.`);
852
+ }
853
+ });
854
+ }
855
+ /** Catalogo degli scope applicativi (disponibile anche ai client per le etichette). */
856
+ getScopes() {
857
+ return __awaiter(this, void 0, void 0, function* () {
858
+ const rows = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT CODICE AS codice, NOME AS nome FROM SCOPES ORDER BY CODICE', []);
859
+ return rows.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
860
+ });
861
+ }
862
+ createScope(input) {
863
+ return __awaiter(this, void 0, void 0, function* () {
864
+ const codice = this.normalizeScopeCode(input.codice);
865
+ if ((yield this.countWhere('SCOPES', 'CODICE', codice)) > 0) {
866
+ throw new common_1.BadRequestException(`Lo scope ${codice} esiste gia.`);
867
+ }
868
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, 'INSERT INTO SCOPES (CODICE, NOME) VALUES (?, ?)', [codice, input.nome]);
869
+ });
870
+ }
871
+ updateScope(codiceScope, input) {
872
+ return __awaiter(this, void 0, void 0, function* () {
873
+ const codice = this.normalizeScopeCode(codiceScope);
874
+ yield this.assertScopeExists(codice);
875
+ if (input.nome === undefined)
876
+ return;
877
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, 'UPDATE SCOPES SET NOME = ? WHERE CODICE = ?', [input.nome, codice]);
878
+ });
879
+ }
880
+ /** Elimina lo scope; le associazioni menu/scope spariscono per FK ON DELETE CASCADE. */
881
+ deleteScope(codiceScope) {
882
+ return __awaiter(this, void 0, void 0, function* () {
883
+ const codice = this.normalizeScopeCode(codiceScope);
884
+ yield this.assertScopeExists(codice);
885
+ yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, 'DELETE FROM SCOPES WHERE CODICE = ?', [codice]);
886
+ });
887
+ }
888
+ /** Scope associati a un menu. */
889
+ getMenuScopes(codiceMenu) {
890
+ return __awaiter(this, void 0, void 0, function* () {
891
+ const code = String(codiceMenu !== null && codiceMenu !== void 0 ? codiceMenu : '').trim().toUpperCase();
892
+ yield this.assertMenuExists(code);
893
+ const rows = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT CODICE_SCOPE FROM MENU_SCOPES WHERE CODICE_MENU = ? ORDER BY CODICE_SCOPE', [code]);
894
+ return rows
895
+ .map((row) => { var _a, _b; return String((_b = (_a = row.CODICE_SCOPE) !== null && _a !== void 0 ? _a : row.codiceScope) !== null && _b !== void 0 ? _b : '').trim(); })
896
+ .filter((value) => value.length > 0);
897
+ });
898
+ }
899
+ /** Sostituisce in modo atomico gli scope di un menu. */
900
+ setMenuScopes(codiceMenu, scopes) {
901
+ return __awaiter(this, void 0, void 0, function* () {
902
+ const code = String(codiceMenu !== null && codiceMenu !== void 0 ? codiceMenu : '').trim().toUpperCase();
903
+ yield this.assertMenuExists(code);
904
+ const normalized = Array.from(new Set((scopes !== null && scopes !== void 0 ? scopes : []).map((scope) => this.normalizeScopeCode(scope))));
905
+ for (const scope of normalized) {
906
+ yield this.assertScopeExists(scope);
907
+ }
908
+ const queries = [
909
+ { query: 'DELETE FROM MENU_SCOPES WHERE CODICE_MENU = ?', params: [code] },
910
+ ...normalized.map((scope) => ({
911
+ query: 'INSERT INTO MENU_SCOPES (CODICE_MENU, CODICE_SCOPE) VALUES (?, ?)',
912
+ params: [code, scope],
913
+ })),
914
+ ];
915
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, queries);
916
+ });
917
+ }
918
+ /** Sostituisce in modo atomico i menu di uno scope (assegnazione massiva). */
919
+ setScopeMenus(codiceScope, menus) {
920
+ return __awaiter(this, void 0, void 0, function* () {
921
+ const scope = this.normalizeScopeCode(codiceScope);
922
+ yield this.assertScopeExists(scope);
923
+ const normalized = Array.from(new Set((menus !== null && menus !== void 0 ? menus : []).map((menu) => String(menu !== null && menu !== void 0 ? menu : '').trim().toUpperCase()).filter(Boolean)));
924
+ for (const menu of normalized) {
925
+ yield this.assertMenuExists(menu);
926
+ }
927
+ const queries = [
928
+ { query: 'DELETE FROM MENU_SCOPES WHERE CODICE_SCOPE = ?', params: [scope] },
929
+ ...normalized.map((menu) => ({
930
+ query: 'INSERT INTO MENU_SCOPES (CODICE_MENU, CODICE_SCOPE) VALUES (?, ?)',
931
+ params: [menu, scope],
932
+ })),
933
+ ];
934
+ yield Orm_1.Orm.executeMultiple(this.accessiOptions.databaseOptions, queries);
935
+ });
936
+ }
784
937
  };
785
938
  exports.PermissionService = PermissionService;
786
939
  exports.PermissionService = PermissionService = __decorate([