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

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 (119) hide show
  1. package/README.MD +38 -34
  2. package/dist/ContractGenerator.js.map +1 -1
  3. package/dist/DatabaseUpdater.js +24 -24
  4. package/dist/DatabaseUpdater.js.map +1 -1
  5. package/dist/EmilsoftwareModule.js.map +1 -1
  6. package/dist/ExecutionTimeLogger.js.map +1 -1
  7. package/dist/Logger.js.map +1 -1
  8. package/dist/Orm.js.map +1 -1
  9. package/dist/RoutesLoggerMiddleware.js.map +1 -1
  10. package/dist/Utilities.d.ts +18 -0
  11. package/dist/Utilities.js +90 -1
  12. package/dist/Utilities.js.map +1 -1
  13. package/dist/accessi-module/AccessiModule.d.ts +15 -0
  14. package/dist/accessi-module/AccessiModule.js.map +1 -1
  15. package/dist/accessi-module/Controllers/AuthController.d.ts +4 -4
  16. package/dist/accessi-module/Controllers/AuthController.js +36 -21
  17. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  18. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  19. package/dist/accessi-module/Controllers/EmailController.d.ts +3 -3
  20. package/dist/accessi-module/Controllers/EmailController.js +15 -15
  21. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  22. package/dist/accessi-module/Controllers/FiltriController.d.ts +3 -3
  23. package/dist/accessi-module/Controllers/FiltriController.js +32 -15
  24. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  25. package/dist/accessi-module/Controllers/PermissionController.d.ts +12 -17
  26. package/dist/accessi-module/Controllers/PermissionController.js +140 -124
  27. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  28. package/dist/accessi-module/Controllers/UserController.d.ts +12 -11
  29. package/dist/accessi-module/Controllers/UserController.js +112 -79
  30. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  31. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  32. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  33. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js +6 -0
  34. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  35. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +6 -0
  36. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  37. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  38. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  39. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  40. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  41. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  42. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  43. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  44. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  45. package/dist/accessi-module/Dtos/Permission.js +5 -0
  46. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  47. package/dist/accessi-module/Dtos/RegisterRequest.js +37 -1
  48. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  49. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  50. package/dist/accessi-module/Dtos/Role.js +13 -2
  51. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  52. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  53. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js +6 -0
  54. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  55. package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
  56. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
  57. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  58. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  59. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  60. package/dist/accessi-module/Dtos/UserDto.js +59 -1
  61. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  62. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  63. package/dist/accessi-module/Dtos/index.js.map +1 -1
  64. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -3
  65. package/dist/accessi-module/Services/AuthService/AuthService.js +159 -27
  66. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  67. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
  68. package/dist/accessi-module/Services/EmailService/EmailService.js +44 -21
  69. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  70. package/dist/accessi-module/Services/FiltriService/FiltriService.js +1 -1
  71. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  72. package/dist/accessi-module/Services/PermissionService/PermissionService.js +87 -87
  73. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  74. package/dist/accessi-module/Services/UserService/UserService.d.ts +15 -6
  75. package/dist/accessi-module/Services/UserService/UserService.js +165 -139
  76. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  77. package/dist/accessi-module/Views/reset-password.html +213 -195
  78. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +25 -16
  79. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  80. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  81. package/dist/accessi-module/index.js +33 -4
  82. package/dist/accessi-module/index.js.map +1 -1
  83. package/dist/accessi-module/jwt/jwt.strategy.d.ts +4 -2
  84. package/dist/accessi-module/jwt/jwt.strategy.js +47 -19
  85. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  86. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  87. package/dist/accessi-module/middleware/authenticateGen.d.ts +3 -1
  88. package/dist/accessi-module/middleware/authenticateGen.js +17 -11
  89. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  90. package/dist/accessi-module/security/accessControl.d.ts +17 -0
  91. package/dist/accessi-module/security/accessControl.js +44 -0
  92. package/dist/accessi-module/security/accessControl.js.map +1 -0
  93. package/dist/accessi-module/security/authenticatedToken.d.ts +11 -0
  94. package/dist/accessi-module/security/authenticatedToken.js +39 -0
  95. package/dist/accessi-module/security/authenticatedToken.js.map +1 -0
  96. package/dist/accessi-module/security/passwordResetToken.d.ts +8 -0
  97. package/dist/accessi-module/security/passwordResetToken.js +73 -0
  98. package/dist/accessi-module/security/passwordResetToken.js.map +1 -0
  99. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +10 -0
  100. package/dist/accessi-module/security/publicAuthRateLimit.js +105 -0
  101. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -0
  102. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  103. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  104. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  105. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  106. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  107. package/dist/allegati-module/Dtos/index.js.map +1 -1
  108. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  109. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  110. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  111. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +49 -49
  112. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  113. package/dist/allegati-module/index.js.map +1 -1
  114. package/dist/autobind.js.map +1 -1
  115. package/dist/index.js.map +1 -1
  116. package/dist/initEmilsoftwareModule.js.map +1 -1
  117. package/dist/swagger/SwaggerConfig.js.map +1 -1
  118. package/package.json +83 -83
  119. package/dist/emilsoftware-utilities-1.8.0-dev.2.tgz +0 -0
@@ -26,11 +26,11 @@ const common_1 = require("@nestjs/common");
26
26
  const autobind_1 = require("../../../autobind");
27
27
  const Orm_1 = require("../../../Orm");
28
28
  const Utilities_1 = require("../../../Utilities");
29
+ const FiltriUtente_1 = require("../../Dtos/FiltriUtente");
29
30
  const StatoRegistrazione_1 = require("../../Dtos/StatoRegistrazione");
30
31
  const EmailService_1 = require("../EmailService/EmailService");
31
- const FiltriUtente_1 = require("../../Dtos/FiltriUtente");
32
- const PermissionService_1 = require("../PermissionService/PermissionService");
33
32
  const FiltriService_1 = require("../FiltriService/FiltriService");
33
+ const PermissionService_1 = require("../PermissionService/PermissionService");
34
34
  let UserService = class UserService {
35
35
  constructor(accessiOptions, emailService, permissionService, filtriService) {
36
36
  this.accessiOptions = accessiOptions;
@@ -38,6 +38,25 @@ let UserService = class UserService {
38
38
  this.permissionService = permissionService;
39
39
  this.filtriService = filtriService;
40
40
  }
41
+ normalizeDatabaseBoolean(value) {
42
+ return value === true || value === 1 || value === '1';
43
+ }
44
+ normalizeEmail(email) {
45
+ if (typeof email !== 'string' || email.trim() === '') {
46
+ throw new Error("L'email e' obbligatoria.");
47
+ }
48
+ return email.trim().toLowerCase();
49
+ }
50
+ ensureEmailIsAvailable(email, currentUserCode) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT FIRST 1 CODUTE as codice_utente FROM UTENTI WHERE LOWER(USRNAME) = ?', [email]);
53
+ const existingUser = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase)[0];
54
+ if ((existingUser === null || existingUser === void 0 ? void 0 : existingUser.codiceUtente) &&
55
+ (!currentUserCode || existingUser.codiceUtente !== currentUserCode)) {
56
+ throw new Error("Questa e-mail e' gia stata utilizzata!");
57
+ }
58
+ });
59
+ }
41
60
  isAdminConfigurator(codiceUtente) {
42
61
  return __awaiter(this, void 0, void 0, function* () {
43
62
  var _a;
@@ -57,78 +76,104 @@ let UserService = class UserService {
57
76
  return flagValue === 1;
58
77
  });
59
78
  }
79
+ getAuthenticatedUserSnapshot(codiceUtente) {
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ if (!codiceUtente || codiceUtente <= 0) {
82
+ return null;
83
+ }
84
+ const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, `
85
+ SELECT
86
+ U.CODUTE AS codice_utente,
87
+ U.USRNAME AS email,
88
+ U.STAREG AS stato_registrazione,
89
+ C.FLGSUPER AS flag_super,
90
+ C.FLGADMINCONFIG AS flag_admin_configurator
91
+ FROM UTENTI U
92
+ LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE
93
+ WHERE U.CODUTE = ?
94
+ `, [codiceUtente]);
95
+ const user = result.map(Utilities_1.RestUtilities.convertKeysToCamelCase)[0];
96
+ if (!(user === null || user === void 0 ? void 0 : user.codiceUtente)) {
97
+ return null;
98
+ }
99
+ return {
100
+ codiceUtente: Number(user.codiceUtente),
101
+ email: typeof user.email === 'string' ? user.email : undefined,
102
+ statoRegistrazione: Number(user.statoRegistrazione),
103
+ flagSuper: this.normalizeDatabaseBoolean(user.flagSuper),
104
+ flagAdminConfigurator: this.normalizeDatabaseBoolean(user.flagAdminConfigurator),
105
+ };
106
+ });
107
+ }
60
108
  getUsers(filters, options) {
61
109
  return __awaiter(this, void 0, void 0, function* () {
62
110
  try {
63
- let query = `
64
- SELECT
65
- U.CODUTE as codice_utente,
66
- U.USRNAME as email,
67
- U.FLGGDPR as flag_gdpr,
68
- U.DATGDPR as data_gdpr,
69
- U.DATINS as data_inserimento,
70
- U.DATSCAPWD as data_scadenza_password,
71
- U.DATLASTLOGIN as data_last_login,
72
- U.STAREG as stato_registrazione,
73
- G.COGNOME as cognome,
74
- G.NOME as nome,
75
- G.AVATAR as avatar,
76
- G.FLG2FATT as flag_due_fattori,
77
- G.CODLINGUA as codice_lingua,
78
- G.CELLULARE as cellulare,
79
- G.FLGSUPER as flag_super,
80
- G.FLGADMINCONFIG as flag_admin_configurator,
81
- G.PAGDEF as pagina_default,
82
- G.JSON_METADATA as json_metadata,
83
- G.RAGSOCCLI as rag_soc_cli,
84
- G.NUMMAC as nummac,
85
- F.NUMREP AS num_rep,
86
- F.IDXPERS AS idx_pers,
87
- F.CODCLISUPER AS cod_cli_super,
88
- F.CODAGE AS cod_age,
89
- F.CODCLICOL AS cod_cli_col,
90
- F.CODCLIENTI AS cod_clienti,
91
- F.TIPFIL AS tip_fil,
92
- F.IDXPOS AS idx_postazione
93
- FROM UTENTI U
94
- INNER JOIN UTENTI_CONFIG G ON U.CODUTE = G.CODUTE
95
- LEFT JOIN FILTRI F ON F.CODUTE = U.CODUTE
96
- WHERE 1=1
111
+ let query = `
112
+ SELECT
113
+ U.CODUTE as codice_utente,
114
+ U.USRNAME as email,
115
+ U.FLGGDPR as flag_gdpr,
116
+ U.DATGDPR as data_gdpr,
117
+ U.DATINS as data_inserimento,
118
+ U.DATSCAPWD as data_scadenza_password,
119
+ U.DATLASTLOGIN as data_last_login,
120
+ U.STAREG as stato_registrazione,
121
+ G.COGNOME as cognome,
122
+ G.NOME as nome,
123
+ G.AVATAR as avatar,
124
+ G.FLG2FATT as flag_due_fattori,
125
+ G.CODLINGUA as codice_lingua,
126
+ G.CELLULARE as cellulare,
127
+ G.FLGSUPER as flag_super,
128
+ G.FLGADMINCONFIG as flag_admin_configurator,
129
+ G.PAGDEF as pagina_default,
130
+ G.JSON_METADATA as json_metadata,
131
+ G.RAGSOCCLI as rag_soc_cli,
132
+ G.NUMMAC as nummac,
133
+ F.NUMREP AS num_rep,
134
+ F.IDXPERS AS idx_pers,
135
+ F.CODCLISUPER AS cod_cli_super,
136
+ F.CODAGE AS cod_age,
137
+ F.CODCLICOL AS cod_cli_col,
138
+ F.CODCLIENTI AS cod_clienti,
139
+ F.TIPFIL AS tip_fil,
140
+ F.IDXPOS AS idx_postazione
141
+ FROM UTENTI U
142
+ INNER JOIN UTENTI_CONFIG G ON U.CODUTE = G.CODUTE
143
+ LEFT JOIN FILTRI F ON F.CODUTE = U.CODUTE
144
+ WHERE 1=1
97
145
  `;
98
- let queryParams = [];
99
- if (filters.email) {
146
+ const queryParams = [];
147
+ if (filters === null || filters === void 0 ? void 0 : filters.email) {
100
148
  query += ` AND LOWER(U.USRNAME) = ? `;
101
149
  queryParams.push(filters.email.trim().toLowerCase());
102
150
  }
103
- if (filters.codiceUtente) {
151
+ if (filters === null || filters === void 0 ? void 0 : filters.codiceUtente) {
104
152
  query += ` AND U.CODUTE = ? `;
105
153
  queryParams.push(filters.codiceUtente);
106
154
  }
107
155
  query += ` ORDER BY U.CODUTE DESC `;
108
156
  let users = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, queryParams));
109
157
  users = users.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
110
- let usersResponse = [];
111
- console.log('OPTIONS: ', options);
158
+ const usersResponse = [];
112
159
  for (const user of users) {
113
160
  let userGrants = null;
114
- if (options.includeGrants)
161
+ if (options === null || options === void 0 ? void 0 : options.includeGrants) {
115
162
  userGrants = yield this.permissionService.getUserRolesAndGrants(user.codiceUtente);
116
- let extensionFields = options.includeExtensionFields ? {} : null;
117
- //todo: se non è prendente extensionFieldOptions va in errore. Risolvere il problema
118
- if (options.includeExtensionFields) {
163
+ }
164
+ let extensionFields = (options === null || options === void 0 ? void 0 : options.includeExtensionFields) ? {} : null;
165
+ if ((options === null || options === void 0 ? void 0 : options.includeExtensionFields) && this.accessiOptions.extensionFieldsOptions) {
119
166
  for (const ext of this.accessiOptions.extensionFieldsOptions) {
120
167
  const values = (yield Orm_1.Orm.query(ext.databaseOptions, `SELECT ${ext.tableFields.join(',')} FROM ${ext.tableName} WHERE ${ext.tableJoinFieldName} = ?`, [user.codiceUtente])).map(Utilities_1.RestUtilities.convertKeysToCamelCase);
121
168
  extensionFields[ext.objectKey] = values;
122
169
  }
123
170
  }
124
- let userResult = {
171
+ usersResponse.push({
125
172
  utente: user,
126
- userGrants: userGrants,
127
- extensionFields: extensionFields,
128
- };
129
- usersResponse.push(userResult);
173
+ userGrants,
174
+ extensionFields,
175
+ });
130
176
  }
131
- console.log('OPTIONS: ', options);
132
177
  return usersResponse;
133
178
  }
134
179
  catch (error) {
@@ -153,27 +198,27 @@ let UserService = class UserService {
153
198
  getUserByEmail(email) {
154
199
  return __awaiter(this, void 0, void 0, function* () {
155
200
  var _a;
156
- const query = `
157
- SELECT
158
- U.CODUTE AS codice_utente,
159
- U.USRNAME AS email,
160
- U.FLGGDPR AS flag_gdpr,
161
- U.DATSCAPWD as data_scadenza_password,
162
- U.STAREG AS stato_registrazione,
163
- C.COGNOME AS cognome,
164
- C.NOME AS nome,
165
- C.AVATAR AS avatar,
166
- C.FLG2FATT AS flag_due_fattori,
167
- C.CODLINGUA AS codice_lingua,
168
- C.CELLULARE AS cellulare,
169
- C.FLGSUPER AS flag_super,
170
- C.FLGADMINCONFIG AS flag_admin_configurator,
171
- C.PAGDEF AS pagina_default,
172
- C.NUMMAC AS nummac,
173
- C.RAGSOCCLI AS rag_soc_cli
174
- FROM UTENTI U
175
- INNER JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE
176
- WHERE LOWER(U.USRNAME) = ?
201
+ const query = `
202
+ SELECT
203
+ U.CODUTE AS codice_utente,
204
+ U.USRNAME AS email,
205
+ U.FLGGDPR AS flag_gdpr,
206
+ U.DATSCAPWD as data_scadenza_password,
207
+ U.STAREG AS stato_registrazione,
208
+ C.COGNOME AS cognome,
209
+ C.NOME AS nome,
210
+ C.AVATAR AS avatar,
211
+ C.FLG2FATT AS flag_due_fattori,
212
+ C.CODLINGUA AS codice_lingua,
213
+ C.CELLULARE AS cellulare,
214
+ C.FLGSUPER AS flag_super,
215
+ C.FLGADMINCONFIG AS flag_admin_configurator,
216
+ C.PAGDEF AS pagina_default,
217
+ C.NUMMAC AS nummac,
218
+ C.RAGSOCCLI AS rag_soc_cli
219
+ FROM UTENTI U
220
+ INNER JOIN UTENTI_CONFIG C ON C.CODUTE = U.CODUTE
221
+ WHERE LOWER(U.USRNAME) = ?
177
222
  `;
178
223
  const utenti = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, [email]).then((results) => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase)));
179
224
  const filtriUtente = yield this.filtriService.getFiltriUser((_a = utenti[0]) === null || _a === void 0 ? void 0 : _a.codiceUtente);
@@ -183,7 +228,6 @@ let UserService = class UserService {
183
228
  if (utenti.length > 0 && filtriUtente.length > 0) {
184
229
  const user = utenti[0];
185
230
  const filtro = filtriUtente[0];
186
- // Type-safe mapping using type assertion
187
231
  Object.entries(FiltriUtente_1.FILTRI_UTENTE_DB_MAPPING).forEach(([key]) => {
188
232
  if (key in filtro) {
189
233
  user[key] = filtro[key];
@@ -193,25 +237,6 @@ let UserService = class UserService {
193
237
  return utenti.length > 0 ? utenti[0] : null;
194
238
  });
195
239
  }
196
- // async getUserFilters(codiceUtente: number): Promise<FiltriUtente[]> {
197
- // const query = `
198
- // SELECT
199
- // F.PROG AS progressivo,
200
- // F.NUMREP AS numero_report,
201
- // F.IDXPERS AS indice_personale,
202
- // F.CODCLISUPER AS codice_cliente_super,
203
- // F.CODAGE AS cod_age,
204
- // F.CODCLICOL AS codice_cliente_collegato,
205
- // F.CODCLIENTI AS codice_clienti,
206
- // F.TIPFIL AS tipo_filtro,
207
- // F.IDXPOS AS idx_postazione
208
- // FROM FILTRI F
209
- // WHERE F.CODUTE = ?
210
- // `;
211
- // return (await Orm.query(this.accessiOptions.databaseOptions, query, [codiceUtente]).then(
212
- // (results) => results.map(RestUtilities.convertKeysToCamelCase),
213
- // )) as FiltriUtente[];
214
- // }
215
240
  insertUserFilters(codiceUtente, filterData) {
216
241
  return __awaiter(this, void 0, void 0, function* () {
217
242
  try {
@@ -265,18 +290,24 @@ let UserService = class UserService {
265
290
  yield operation();
266
291
  });
267
292
  }
268
- register(registrationData) {
293
+ register(registrationData, options) {
269
294
  return __awaiter(this, void 0, void 0, function* () {
270
295
  var _a, _b, _c;
271
296
  try {
272
- const existingUser = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT CODUTE FROM UTENTI WHERE USRNAME = ?', [registrationData.email]);
273
- if (existingUser.length > 0) {
274
- throw new Error('Questa e-mail è già stata utilizzata!');
297
+ const allowPrivilegedFields = (options === null || options === void 0 ? void 0 : options.allowPrivilegedFields) === true;
298
+ const normalizedEmail = this.normalizeEmail(registrationData.email);
299
+ if (!allowPrivilegedFields &&
300
+ (registrationData.flagSuper !== undefined ||
301
+ registrationData.flagAdminConfigurator !== undefined ||
302
+ registrationData.roles !== undefined ||
303
+ registrationData.permissions !== undefined)) {
304
+ throw new Error('I campi privilegiati non sono consentiti nella registrazione pubblica.');
275
305
  }
306
+ yield this.ensureEmailIsAvailable(normalizedEmail);
276
307
  const queryUtenti = `INSERT INTO UTENTI (USRNAME, STAREG) VALUES (?,?)`;
277
- const paramsUtenti = [registrationData.email, StatoRegistrazione_1.StatoRegistrazione.INVIO];
308
+ const paramsUtenti = [normalizedEmail, StatoRegistrazione_1.StatoRegistrazione.INVIO];
278
309
  yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, queryUtenti, paramsUtenti);
279
- const codiceUtenteResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT FIRST 1 CODUTE FROM UTENTI WHERE USRNAME = ? ORDER BY CODUTE DESC', [registrationData.email]);
310
+ const codiceUtenteResult = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, 'SELECT FIRST 1 CODUTE FROM UTENTI WHERE USRNAME = ? ORDER BY CODUTE DESC', [normalizedEmail]);
280
311
  const codiceUtente = Number((_b = (_a = codiceUtenteResult === null || codiceUtenteResult === void 0 ? void 0 : codiceUtenteResult[0]) === null || _a === void 0 ? void 0 : _a.CODUTE) !== null && _b !== void 0 ? _b : (_c = codiceUtenteResult === null || codiceUtenteResult === void 0 ? void 0 : codiceUtenteResult[0]) === null || _c === void 0 ? void 0 : _c.codute);
281
312
  if (!codiceUtente) {
282
313
  throw new Error('Creazione utente non riuscita: impossibile recuperare CODUTE.');
@@ -284,32 +315,12 @@ let UserService = class UserService {
284
315
  const utentiConfigFields = ['CODUTE', 'COGNOME', 'NOME'];
285
316
  const utentiConfigPlaceholders = ['?', '?', '?'];
286
317
  const utentiConfigParams = [codiceUtente, registrationData.cognome, registrationData.nome];
287
- // Mapping dei campi opzionali
288
- // const optionalFields: [keyof typeof registrationData, string][] = [
289
- // ['cellulare', 'CELLULARE'],
290
- // ['flagSuper', 'FLGSUPER'],
291
- // ['flagAdminConfigurator', 'FLGADMINCONFIG'],
292
- // ['avatar', 'AVATAR'],
293
- // ['flagDueFattori', 'FLG2FATT'],
294
- // ['paginaDefault', 'PAGDEF'],
295
- // ['ragSocCli', 'RAGSOCCLI'],
296
- // ];
297
318
  const optionalFields = [
298
319
  {
299
320
  key: 'cellulare',
300
321
  dbField: 'CELLULARE',
301
322
  transform: (v) => String(v),
302
323
  },
303
- {
304
- key: 'flagSuper',
305
- dbField: 'FLGSUPER',
306
- transform: (v) => (v ? 1 : 0),
307
- },
308
- {
309
- key: 'flagAdminConfigurator',
310
- dbField: 'FLGADMINCONFIG',
311
- transform: (v) => (v ? 1 : 0),
312
- },
313
324
  {
314
325
  key: 'avatar',
315
326
  dbField: 'AVATAR',
@@ -336,6 +347,17 @@ let UserService = class UserService {
336
347
  transform: (v) => String(v),
337
348
  },
338
349
  ];
350
+ if (allowPrivilegedFields) {
351
+ optionalFields.push({
352
+ key: 'flagSuper',
353
+ dbField: 'FLGSUPER',
354
+ transform: (v) => (v ? 1 : 0),
355
+ }, {
356
+ key: 'flagAdminConfigurator',
357
+ dbField: 'FLGADMINCONFIG',
358
+ transform: (v) => (v ? 1 : 0),
359
+ });
360
+ }
339
361
  for (const field of optionalFields) {
340
362
  const value = registrationData[field.key];
341
363
  if (value !== undefined && value !== null) {
@@ -346,12 +368,13 @@ let UserService = class UserService {
346
368
  }
347
369
  const queryUtentiConfig = `INSERT INTO UTENTI_CONFIG (${utentiConfigFields.join(', ')}) VALUES (${utentiConfigPlaceholders.join(', ')})`;
348
370
  yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, queryUtentiConfig, utentiConfigParams);
349
- //await this.insertUserFilters(codiceUtente, registrationData);
350
371
  yield this.filtriService.upsertFiltriUtente(codiceUtente, registrationData);
351
- if (!!registrationData.roles && registrationData.roles.length > 0) {
372
+ if (allowPrivilegedFields && !!registrationData.roles && registrationData.roles.length > 0) {
352
373
  yield this.permissionService.assignRolesToUser(codiceUtente, registrationData.roles);
353
374
  }
354
- if (!!registrationData.permissions && registrationData.permissions.length > 0) {
375
+ if (allowPrivilegedFields &&
376
+ !!registrationData.permissions &&
377
+ registrationData.permissions.length > 0) {
355
378
  yield this.permissionService.assignPermissionsToUser(codiceUtente, registrationData.permissions);
356
379
  }
357
380
  return codiceUtente;
@@ -361,23 +384,33 @@ let UserService = class UserService {
361
384
  }
362
385
  });
363
386
  }
364
- updateUser(codiceUtente, user) {
387
+ updateUser(codiceUtente, user, options) {
365
388
  return __awaiter(this, void 0, void 0, function* () {
366
389
  try {
367
390
  if (!codiceUtente)
368
391
  throw new Error('Impossibile aggiornare senza codice utente.');
369
- // Costruzione dinamica della query per UTENTI
392
+ const allowPrivilegedChanges = (options === null || options === void 0 ? void 0 : options.allowPrivilegedChanges) === true;
393
+ if (!allowPrivilegedChanges &&
394
+ (user.statoRegistrazione !== undefined ||
395
+ user.flagSuper !== undefined ||
396
+ user.flagAdminConfigurator !== undefined ||
397
+ user.roles !== undefined ||
398
+ user.permissions !== undefined)) {
399
+ throw new Error('Non e consentito modificare campi privilegiati.');
400
+ }
370
401
  const utentiUpdates = [];
371
402
  const utentiParams = [];
372
403
  if (user.email !== undefined) {
404
+ const normalizedEmail = this.normalizeEmail(user.email);
405
+ yield this.ensureEmailIsAvailable(normalizedEmail, codiceUtente);
373
406
  utentiUpdates.push('usrname = ?');
374
- utentiParams.push(user.email);
407
+ utentiParams.push(normalizedEmail);
375
408
  }
376
409
  if (user.flagGdpr !== undefined) {
377
410
  utentiUpdates.push('flggdpr = ?');
378
411
  utentiParams.push(user.flagGdpr);
379
412
  }
380
- if (user.statoRegistrazione !== undefined) {
413
+ if (allowPrivilegedChanges && user.statoRegistrazione !== undefined) {
381
414
  utentiUpdates.push('stareg = ?');
382
415
  utentiParams.push(user.statoRegistrazione);
383
416
  }
@@ -386,7 +419,6 @@ let UserService = class UserService {
386
419
  utentiParams.push(codiceUtente);
387
420
  yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, queryUtenti, utentiParams);
388
421
  }
389
- // Costruzione dinamica della query per UTENTI_CONFIG
390
422
  const utentiConfigUpdates = [];
391
423
  const utentiConfigParams = [];
392
424
  if (user.cognome !== undefined) {
@@ -413,11 +445,11 @@ let UserService = class UserService {
413
445
  utentiConfigUpdates.push('cellulare = ?');
414
446
  utentiConfigParams.push(user.cellulare);
415
447
  }
416
- if (user.flagSuper !== undefined) {
448
+ if (allowPrivilegedChanges && user.flagSuper !== undefined) {
417
449
  utentiConfigUpdates.push('flgsuper = ?');
418
450
  utentiConfigParams.push(user.flagSuper);
419
451
  }
420
- if (user.flagAdminConfigurator !== undefined) {
452
+ if (allowPrivilegedChanges && user.flagAdminConfigurator !== undefined) {
421
453
  utentiConfigUpdates.push('flgadminconfig = ?');
422
454
  utentiConfigParams.push(user.flagAdminConfigurator);
423
455
  }
@@ -438,13 +470,12 @@ let UserService = class UserService {
438
470
  utentiConfigParams.push(codiceUtente);
439
471
  yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, queryUtentiConfig, utentiConfigParams);
440
472
  }
441
- if (!!user.roles && user.roles.length > 0) {
473
+ if (allowPrivilegedChanges && !!user.roles && user.roles.length > 0) {
442
474
  yield this.permissionService.assignRolesToUser(codiceUtente, user.roles);
443
475
  }
444
- if (!!user.permissions && user.permissions.length > 0) {
476
+ if (allowPrivilegedChanges && !!user.permissions && user.permissions.length > 0) {
445
477
  yield this.permissionService.assignPermissionsToUser(codiceUtente, user.permissions);
446
478
  }
447
- //await this.updateUserFilters(codiceUtente, user);
448
479
  yield this.filtriService.upsertFiltriUtente(codiceUtente, user);
449
480
  }
450
481
  catch (error) {
@@ -471,7 +502,6 @@ let UserService = class UserService {
471
502
  const fieldsToUpdate = Object.entries(fieldMapping)
472
503
  .filter(([tsField]) => {
473
504
  const value = user[tsField];
474
- // Includiamo il campo se è definito (anche se è una stringa vuota)
475
505
  return value !== undefined && value !== null;
476
506
  })
477
507
  .map(([tsField, config]) => {
@@ -488,21 +518,18 @@ let UserService = class UserService {
488
518
  return;
489
519
  }
490
520
  yield this.executeInTransaction(() => __awaiter(this, void 0, void 0, function* () {
491
- // Prima verifichiamo se esiste il record
492
521
  const checkQuery = `SELECT COUNT(*) as CNT FROM FILTRI WHERE CODUTE = ?`;
493
522
  const existingRecord = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, checkQuery, [
494
523
  codiceUtente,
495
524
  ]);
496
525
  const exists = existingRecord[0].CNT > 0;
497
526
  if (exists) {
498
- // Se esiste, facciamo l'UPDATE
499
527
  const updates = fieldsToUpdate.map((f) => `${f.dbField} = ?`).join(', ');
500
528
  const values = [...fieldsToUpdate.map((f) => f.value), codiceUtente];
501
529
  const updateQuery = `UPDATE FILTRI SET ${updates} WHERE CODUTE = ?`;
502
530
  yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, updateQuery, values);
503
531
  }
504
532
  else {
505
- // Se non esiste, facciamo l'INSERT
506
533
  const dbFields = ['CODUTE', ...fieldsToUpdate.map((f) => f.dbField)];
507
534
  const placeholders = dbFields.map(() => '?');
508
535
  const insertValues = [codiceUtente, ...fieldsToUpdate.map((f) => f.value)];
@@ -547,10 +574,9 @@ let UserService = class UserService {
547
574
  setGdpr(codiceUtente) {
548
575
  return __awaiter(this, void 0, void 0, function* () {
549
576
  try {
550
- let query = ` UPDATE OR INSERT UTENTI_GDPR SET CODUTE = ?, GDPR = ? `;
551
- let params = [codiceUtente, true];
552
- let result = yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, query, params);
553
- return result;
577
+ const query = ` UPDATE OR INSERT UTENTI_GDPR SET CODUTE = ?, GDPR = ? `;
578
+ const params = [codiceUtente, true];
579
+ return yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, query, params);
554
580
  }
555
581
  catch (error) {
556
582
  throw error;