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
@@ -1,213 +1,213 @@
1
- <!DOCTYPE html>
2
- <html lang="it">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Reset Password</title>
8
- <style>
9
- * {
10
- box-sizing: border-box;
11
- margin: 0;
12
- padding: 0;
13
- font-family: Arial, sans-serif;
14
- }
15
-
16
- body {
17
- display: flex;
18
- justify-content: center;
19
- align-items: center;
20
- height: 100vh;
21
- background: linear-gradient(135deg, #0068ae, #004e80, #002c50);
22
- color: #fff;
23
- }
24
-
25
- .container {
26
- background: rgba(255, 255, 255, 0.15);
27
- padding: 25px;
28
- border-radius: 12px;
29
- backdrop-filter: blur(12px);
30
- box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.3);
31
- width: 380px;
32
- text-align: center;
33
- border: 1px solid rgba(255, 255, 255, 0.2);
34
- }
35
-
36
- h1 {
37
- font-size: 24px;
38
- margin-bottom: 15px;
39
- color: #ffffff;
40
- }
41
-
42
- .form-group {
43
- margin: 12px 0;
44
- text-align: left;
45
- }
46
-
47
- label {
48
- font-size: 14px;
49
- font-weight: bold;
50
- display: block;
51
- margin-bottom: 5px;
52
- color: #ffffff;
53
- }
54
-
55
- input {
56
- width: 100%;
57
- padding: 12px;
58
- border: none;
59
- border-radius: 6px;
60
- font-size: 14px;
61
- margin-top: 5px;
62
- background: rgba(255, 255, 255, 0.15);
63
- color: #ffffff;
64
- border: 1px solid rgba(255, 255, 255, 0.3);
65
- }
66
-
67
- input:focus {
68
- outline: none;
69
- border: 2px solid #ffffff;
70
- background: rgba(255, 255, 255, 0.2);
71
- }
72
-
73
- .error {
74
- color: #ff6b6b;
75
- font-size: 12px;
76
- margin-top: 5px;
77
- display: none;
78
- }
79
-
80
- button {
81
- background: linear-gradient(90deg, #0080ff, #0068ae);
82
- border: none;
83
- padding: 12px;
84
- font-size: 16px;
85
- border-radius: 6px;
86
- width: 100%;
87
- color: #ffffff;
88
- cursor: pointer;
89
- font-weight: bold;
90
- transition: all 0.3s ease;
91
- box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2);
92
- }
93
-
94
- button:hover {
95
- background: linear-gradient(90deg, #0095ff, #0070c0);
96
- transform: scale(1.05);
97
- }
98
- </style>
99
- </head>
100
-
101
- <body>
102
- <div class="container">
103
- <h1>Reimposta la tua password</h1>
104
- <form id="resetForm">
105
- <input type="hidden" id="token" value="">
106
- <input type="hidden" id="returnUrl" value="">
107
- <input type="hidden" id="prefix" value="">
108
-
109
- <div class="form-group">
110
- <label for="password">Nuova Password:</label>
111
- <input type="password" id="password" required>
112
- <p class="error" id="passwordError">La password deve avere almeno 8 caratteri.</p>
113
- </div>
114
-
115
- <div class="form-group">
116
- <label for="confirmPassword">Conferma Password:</label>
117
- <input type="password" id="confirmPassword" required>
118
- <p class="error" id="confirmError">Le password non corrispondono.</p>
119
- </div>
120
-
121
- <button type="submit">Aggiorna password</button>
122
- </form>
123
- </div>
124
-
125
- <script>
126
- document.addEventListener("DOMContentLoaded", function () {
127
- function resolveSafeReturnUrl(rawReturnUrl) {
128
- if (!rawReturnUrl) {
129
- return "/";
130
- }
131
-
132
- if (rawReturnUrl.startsWith("/")) {
133
- return rawReturnUrl;
134
- }
135
-
136
- try {
137
- const parsed = new URL(rawReturnUrl, window.location.origin);
138
- if (parsed.origin === window.location.origin) {
139
- return `${parsed.pathname}${parsed.search}${parsed.hash}`;
140
- }
141
- } catch (error) {}
142
-
143
- return "/";
144
- }
145
-
146
- function resolveSafePrefix(rawPrefix) {
147
- if (!rawPrefix) {
148
- return "";
149
- }
150
-
151
- let normalizedPrefix = rawPrefix.trim();
152
- if (!normalizedPrefix.startsWith("/")) {
153
- normalizedPrefix = "/" + normalizedPrefix;
154
- }
155
-
156
- if (normalizedPrefix.endsWith("/")) {
157
- normalizedPrefix = normalizedPrefix.slice(0, -1);
158
- }
159
-
160
- return /^\/[A-Za-z0-9/_-]*$/.test(normalizedPrefix) ? normalizedPrefix : "";
161
- }
162
-
163
- const urlParams = new URLSearchParams(window.location.search);
164
- const token = window.location.pathname.split("/").pop();
165
- const returnUrl = resolveSafeReturnUrl(urlParams.get("returnUrl"));
166
- const prefix = resolveSafePrefix(urlParams.get("prefix"));
167
-
168
- document.getElementById("token").value = token;
169
- document.getElementById("returnUrl").value = returnUrl;
170
- document.getElementById("prefix").value = prefix;
171
-
172
- document.getElementById("resetForm").addEventListener("submit", async function (event) {
173
- event.preventDefault();
174
- const password = document.getElementById("password").value;
175
- const confirmPassword = document.getElementById("confirmPassword").value;
176
- const passwordError = document.getElementById("passwordError");
177
- const confirmError = document.getElementById("confirmError");
178
-
179
- passwordError.style.display = "none";
180
- confirmError.style.display = "none";
181
-
182
- if (password.length < 8) {
183
- passwordError.style.display = "block";
184
- return;
185
- }
186
-
187
- if (password !== confirmPassword) {
188
- confirmError.style.display = "block";
189
- return;
190
- }
191
-
192
- try {
193
- const response = await fetch(`${prefix}/api/accessi/auth/confirm-reset-password/${token}`, {
194
- method: "POST",
195
- headers: { "Content-Type": "application/json" },
196
- body: JSON.stringify({ newPassword: password })
197
- });
198
-
199
- const data = await response.json();
200
- alert(data.message || "Password aggiornata con successo!");
201
- } catch (error) {
202
- alert("Errore nel reset della password. Riprova piu tardi.");
203
- } finally {
204
- setTimeout(() => {
205
- window.location.href = returnUrl;
206
- }, 500);
207
- }
208
- });
209
- });
210
- </script>
211
- </body>
212
-
213
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="it">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Reset Password</title>
8
+ <style>
9
+ * {
10
+ box-sizing: border-box;
11
+ margin: 0;
12
+ padding: 0;
13
+ font-family: Arial, sans-serif;
14
+ }
15
+
16
+ body {
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: center;
20
+ height: 100vh;
21
+ background: linear-gradient(135deg, #0068ae, #004e80, #002c50);
22
+ color: #fff;
23
+ }
24
+
25
+ .container {
26
+ background: rgba(255, 255, 255, 0.15);
27
+ padding: 25px;
28
+ border-radius: 12px;
29
+ backdrop-filter: blur(12px);
30
+ box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.3);
31
+ width: 380px;
32
+ text-align: center;
33
+ border: 1px solid rgba(255, 255, 255, 0.2);
34
+ }
35
+
36
+ h1 {
37
+ font-size: 24px;
38
+ margin-bottom: 15px;
39
+ color: #ffffff;
40
+ }
41
+
42
+ .form-group {
43
+ margin: 12px 0;
44
+ text-align: left;
45
+ }
46
+
47
+ label {
48
+ font-size: 14px;
49
+ font-weight: bold;
50
+ display: block;
51
+ margin-bottom: 5px;
52
+ color: #ffffff;
53
+ }
54
+
55
+ input {
56
+ width: 100%;
57
+ padding: 12px;
58
+ border: none;
59
+ border-radius: 6px;
60
+ font-size: 14px;
61
+ margin-top: 5px;
62
+ background: rgba(255, 255, 255, 0.15);
63
+ color: #ffffff;
64
+ border: 1px solid rgba(255, 255, 255, 0.3);
65
+ }
66
+
67
+ input:focus {
68
+ outline: none;
69
+ border: 2px solid #ffffff;
70
+ background: rgba(255, 255, 255, 0.2);
71
+ }
72
+
73
+ .error {
74
+ color: #ff6b6b;
75
+ font-size: 12px;
76
+ margin-top: 5px;
77
+ display: none;
78
+ }
79
+
80
+ button {
81
+ background: linear-gradient(90deg, #0080ff, #0068ae);
82
+ border: none;
83
+ padding: 12px;
84
+ font-size: 16px;
85
+ border-radius: 6px;
86
+ width: 100%;
87
+ color: #ffffff;
88
+ cursor: pointer;
89
+ font-weight: bold;
90
+ transition: all 0.3s ease;
91
+ box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2);
92
+ }
93
+
94
+ button:hover {
95
+ background: linear-gradient(90deg, #0095ff, #0070c0);
96
+ transform: scale(1.05);
97
+ }
98
+ </style>
99
+ </head>
100
+
101
+ <body>
102
+ <div class="container">
103
+ <h1>Reimposta la tua password</h1>
104
+ <form id="resetForm">
105
+ <input type="hidden" id="token" value="">
106
+ <input type="hidden" id="returnUrl" value="">
107
+ <input type="hidden" id="prefix" value="">
108
+
109
+ <div class="form-group">
110
+ <label for="password">Nuova Password:</label>
111
+ <input type="password" id="password" required>
112
+ <p class="error" id="passwordError">La password deve avere almeno 8 caratteri.</p>
113
+ </div>
114
+
115
+ <div class="form-group">
116
+ <label for="confirmPassword">Conferma Password:</label>
117
+ <input type="password" id="confirmPassword" required>
118
+ <p class="error" id="confirmError">Le password non corrispondono.</p>
119
+ </div>
120
+
121
+ <button type="submit">Aggiorna password</button>
122
+ </form>
123
+ </div>
124
+
125
+ <script>
126
+ document.addEventListener("DOMContentLoaded", function () {
127
+ function resolveSafeReturnUrl(rawReturnUrl) {
128
+ if (!rawReturnUrl) {
129
+ return "/";
130
+ }
131
+
132
+ if (rawReturnUrl.startsWith("/")) {
133
+ return rawReturnUrl;
134
+ }
135
+
136
+ try {
137
+ const parsed = new URL(rawReturnUrl, window.location.origin);
138
+ if (parsed.origin === window.location.origin) {
139
+ return `${parsed.pathname}${parsed.search}${parsed.hash}`;
140
+ }
141
+ } catch (error) {}
142
+
143
+ return "/";
144
+ }
145
+
146
+ function resolveSafePrefix(rawPrefix) {
147
+ if (!rawPrefix) {
148
+ return "";
149
+ }
150
+
151
+ let normalizedPrefix = rawPrefix.trim();
152
+ if (!normalizedPrefix.startsWith("/")) {
153
+ normalizedPrefix = "/" + normalizedPrefix;
154
+ }
155
+
156
+ if (normalizedPrefix.endsWith("/")) {
157
+ normalizedPrefix = normalizedPrefix.slice(0, -1);
158
+ }
159
+
160
+ return /^\/[A-Za-z0-9/_-]*$/.test(normalizedPrefix) ? normalizedPrefix : "";
161
+ }
162
+
163
+ const urlParams = new URLSearchParams(window.location.search);
164
+ const token = window.location.pathname.split("/").pop();
165
+ const returnUrl = resolveSafeReturnUrl(urlParams.get("returnUrl"));
166
+ const prefix = resolveSafePrefix(urlParams.get("prefix"));
167
+
168
+ document.getElementById("token").value = token;
169
+ document.getElementById("returnUrl").value = returnUrl;
170
+ document.getElementById("prefix").value = prefix;
171
+
172
+ document.getElementById("resetForm").addEventListener("submit", async function (event) {
173
+ event.preventDefault();
174
+ const password = document.getElementById("password").value;
175
+ const confirmPassword = document.getElementById("confirmPassword").value;
176
+ const passwordError = document.getElementById("passwordError");
177
+ const confirmError = document.getElementById("confirmError");
178
+
179
+ passwordError.style.display = "none";
180
+ confirmError.style.display = "none";
181
+
182
+ if (password.length < 8) {
183
+ passwordError.style.display = "block";
184
+ return;
185
+ }
186
+
187
+ if (password !== confirmPassword) {
188
+ confirmError.style.display = "block";
189
+ return;
190
+ }
191
+
192
+ try {
193
+ const response = await fetch(`${prefix}/api/accessi/auth/confirm-reset-password/${token}`, {
194
+ method: "POST",
195
+ headers: { "Content-Type": "application/json" },
196
+ body: JSON.stringify({ newPassword: password })
197
+ });
198
+
199
+ const data = await response.json();
200
+ alert(data.message || "Password aggiornata con successo!");
201
+ } catch (error) {
202
+ alert("Errore nel reset della password. Riprova piu tardi.");
203
+ } finally {
204
+ setTimeout(() => {
205
+ window.location.href = returnUrl;
206
+ }, 500);
207
+ }
208
+ });
209
+ });
210
+ </script>
211
+ </body>
212
+
213
+ </html>
@@ -120,7 +120,7 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
120
120
  return __awaiter(this, void 0, void 0, function* () {
121
121
  const existing = yield Orm_1.Orm.query(options.databaseOptions, "SELECT CODMNU FROM MENU WHERE CODMNU = ?", [menu.CODMNU]);
122
122
  if (existing.length === 0) {
123
- yield Orm_1.Orm.execute(options.databaseOptions, `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU)
123
+ yield Orm_1.Orm.execute(options.databaseOptions, `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU)
124
124
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
125
125
  menu.CODMNU,
126
126
  menu.DESMNU,
@@ -134,15 +134,15 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
134
134
  ]);
135
135
  return;
136
136
  }
137
- yield Orm_1.Orm.execute(options.databaseOptions, `UPDATE MENU
138
- SET DESMNU = ?,
139
- CODGRP = ?,
140
- FLGENABLED = COALESCE(FLGENABLED, ?),
141
- ICON = ?,
142
- ORDINE = ?,
143
- CODTIP = ?,
144
- PAGINA = ?,
145
- RIFMENU = ?
137
+ yield Orm_1.Orm.execute(options.databaseOptions, `UPDATE MENU
138
+ SET DESMNU = ?,
139
+ CODGRP = ?,
140
+ FLGENABLED = COALESCE(FLGENABLED, ?),
141
+ ICON = ?,
142
+ ORDINE = ?,
143
+ CODTIP = ?,
144
+ PAGINA = ?,
145
+ RIFMENU = ?
146
146
  WHERE CODMNU = ?`, [
147
147
  menu.DESMNU,
148
148
  menu.CODGRP,
@@ -218,12 +218,12 @@ AccessiDatabaseUpdater.updates = [
218
218
  yield Orm_1.Orm.execute(options.databaseOptions, "CREATE SEQUENCE GEN_RUOLI_ID");
219
219
  }
220
220
  if (!(yield AccessiDatabaseUpdater_1.triggerExists(options.databaseOptions, "RUOLI_BI"))) {
221
- yield Orm_1.Orm.execute(options.databaseOptions, `CREATE TRIGGER RUOLI_BI FOR RUOLI
222
- ACTIVE BEFORE INSERT POSITION 0
223
- AS
224
- BEGIN
225
- IF (NEW.CODRUO IS NULL) THEN
226
- NEW.CODRUO = GEN_ID(GEN_RUOLI_ID,1);
221
+ yield Orm_1.Orm.execute(options.databaseOptions, `CREATE TRIGGER RUOLI_BI FOR RUOLI
222
+ ACTIVE BEFORE INSERT POSITION 0
223
+ AS
224
+ BEGIN
225
+ IF (NEW.CODRUO IS NULL) THEN
226
+ NEW.CODRUO = GEN_ID(GEN_RUOLI_ID,1);
227
227
  END`);
228
228
  }
229
229
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"AccessiDatabaseUpdater.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/AccessiDatabaseUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Inject, OnModuleInit } from \"@nestjs/common\";\r\nimport { DatabaseUpdater } from \"../../DatabaseUpdater\";\r\nimport { AccessiOptions } from \"../AccessiModule\";\r\nimport { Orm } from \"../../Orm\";\r\nimport { Logger } from \"../../Logger\";\r\n\r\ntype AccessiUpdateStep = {\r\n fromVersion: string;\r\n toVersion: string;\r\n description: string;\r\n apply: (options: AccessiOptions) => Promise<void>;\r\n};\r\n\r\n@Injectable()\r\nexport class AccessiDatabaseUpdater extends DatabaseUpdater implements OnModuleInit {\n protected static override logger: Logger = new Logger(AccessiDatabaseUpdater.name);\n\r\n private static readonly updates: AccessiUpdateStep[] = [\r\n {\r\n fromVersion: \"1.0.0\",\r\n toVersion: \"1.1.0\",\r\n description: \"Aggiunge filtro postazione, colonna IDXPOS e menu verifica RFID\",\r\n apply: async (options) => {\r\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 20, \"POSTAZIONE\", \"IDXPOS\", undefined);\r\n await AccessiDatabaseUpdater.ensureColumn(\r\n options,\r\n \"FILTRI\",\r\n \"IDXPOS SMALLINT\",\r\n \"IDXPOS\",\r\n \"idx della postazione nella tabella ANTENNE_POS di PROLAV\"\r\n );\r\n await AccessiDatabaseUpdater.upsertMenu(options, {\r\n CODMNU: \"MNUVERRFID\",\r\n DESMNU: \"Verifica RFID\",\r\n CODGRP: \"F\",\r\n FLGENABLED: 1,\r\n ICON: \"hardware-chip-outline\",\r\n ORDINE: 10,\r\n CODTIP: \"M\",\r\n PAGINA: \"/verifica-rfid\",\r\n RIFMENU: null,\r\n });\r\n },\r\n },\r\n {\r\n fromVersion: \"1.1.0\",\r\n toVersion: \"1.1.1\",\r\n description: \"Aggiunge FLGENABLED su FILTRI_TIPO\",\r\n apply: async (options) => {\r\n const columnCreated = await AccessiDatabaseUpdater.ensureColumn(\r\n options,\r\n \"FILTRI_TIPO\",\r\n \"FLGENABLED SMALLINT DEFAULT 1 NOT NULL\",\r\n \"FLGENABLED\"\r\n );\r\n\r\n if (!columnCreated) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n \"UPDATE FILTRI_TIPO SET FLGENABLED = 1 WHERE FLGENABLED IS NULL\"\r\n );\r\n }\r\n },\r\n },\r\n {\r\n fromVersion: \"1.1.1\",\r\n toVersion: \"1.1.2\",\r\n description: \"Aggiunge filtro vettore e colonna CODVET\",\r\n apply: async (options) => {\r\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 30, \"VETTORE\", \"CODVET\", 1);\r\n await AccessiDatabaseUpdater.ensureColumn(\r\n options,\r\n \"FILTRI\",\r\n \"CODVET INTEGER\",\r\n \"CODVET\",\r\n \"CODICE DEL VETTORE DA INSERIRE SE COME FILTRO HA 30\"\r\n );\r\n },\r\n },\r\n {\r\n fromVersion: \"1.1.2\",\r\n toVersion: \"1.1.3\",\r\n description: \"Aggiunge FLGADMINCONFIG e inizializza PARAMETRI\",\r\n apply: async (options) => {\r\n await AccessiDatabaseUpdater.ensureColumn(\r\n options,\r\n \"UTENTI_CONFIG\",\r\n \"FLGADMINCONFIG SMALLINT DEFAULT 0\",\r\n \"FLGADMINCONFIG\",\r\n \"flag utente configuratore dei menu amministratore\"\r\n );\r\n await AccessiDatabaseUpdater.createParametersTable(options.databaseOptions);\r\n },\r\n },\r\n {\r\n fromVersion: \"1.1.3\",\r\n toVersion: \"1.1.4\",\r\n description: \"Aggiunge sequence e trigger per RUOLI\",\r\n apply: async (options) => {\r\n if (!(await AccessiDatabaseUpdater.generatorExists(options.databaseOptions, \"GEN_RUOLI_ID\"))) {\r\n await Orm.execute(options.databaseOptions, \"CREATE SEQUENCE GEN_RUOLI_ID\");\r\n }\r\n\r\n if (!(await AccessiDatabaseUpdater.triggerExists(options.databaseOptions, \"RUOLI_BI\"))) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n `CREATE TRIGGER RUOLI_BI FOR RUOLI\r\nACTIVE BEFORE INSERT POSITION 0\r\nAS\r\nBEGIN\r\n IF (NEW.CODRUO IS NULL) THEN\r\n NEW.CODRUO = GEN_ID(GEN_RUOLI_ID,1);\r\nEND`\r\n );\r\n }\r\n },\r\n },\r\n {\r\n fromVersion: \"1.1.4\",\r\n toVersion: \"1.1.5\",\r\n description: \"Aggiunge NOTE su MENU\",\r\n apply: async (options) => {\r\n await AccessiDatabaseUpdater.ensureColumn(\r\n options,\r\n \"MENU\",\r\n \"NOTE VARCHAR(1000)\",\r\n \"NOTE\"\r\n );\r\n },\r\n },\r\n {\r\n fromVersion: \"1.1.5\",\r\n toVersion: \"1.1.6\",\r\n description: \"Aggiunge NUMMAC su UTENTI_CONFIG\",\r\n apply: async (options) => {\r\n await AccessiDatabaseUpdater.ensureColumn(\r\n options,\r\n \"UTENTI_CONFIG\",\r\n \"NUMMAC INTEGER\",\r\n \"NUMMAC\",\r\n 'Numero macchina DESPOST PROLAV'\r\n );\r\n },\r\n },\r\n ];\r\n\r\n constructor(\r\n @Inject(\"ACCESSI_OPTIONS\") private readonly accessiOptions: AccessiOptions\r\n ) {\r\n super();\r\n }\r\n\r\n async onModuleInit(): Promise<void> {\n if (this.accessiOptions.autoUpdateDatabase === false) {\n AccessiDatabaseUpdater.logger.info(\"Aggiornamento automatico database accessi disabilitato da configurazione.\");\n return;\n }\n\n AccessiDatabaseUpdater.logger.info(\"Avvio updater database accessi.\");\n await AccessiDatabaseUpdater.run(this.accessiOptions);\n AccessiDatabaseUpdater.logger.info(\"Updater database accessi completato.\");\n }\n\n static async run(options: AccessiOptions): Promise<void> {\n const startedAt = performance.now();\n this.logger.info(\n `Verifica schema accessi su ${options.databaseOptions.host ?? \"?\"}:${options.databaseOptions.port ?? \"?\"} -> ${options.databaseOptions.database ?? \"?\"}`\n );\n await this.createParametersTable(options.databaseOptions);\n this.logger.info(\"Tabella PARAMETRI verificata.\");\n\n const currentVersion = await this.getDatabaseVersion(options.databaseOptions);\n const currentIndex = this.updates.findIndex(\r\n (update) => update.toVersion === currentVersion\r\n );\r\n const startIndex = currentIndex >= 0 ? currentIndex + 1 : 0;\r\n\r\n if (currentVersion && currentIndex === this.updates.length - 1) {\r\n this.logger.info(`Database accessi gia' all'ultima versione disponibile (${currentVersion}).`);\r\n } else if (currentVersion && currentIndex >= 0) {\r\n this.logger.info(`Database accessi rilevato alla versione ${currentVersion}.`);\r\n } else if (currentVersion) {\r\n this.logger.warning(\r\n `Versione database accessi non riconosciuta (${currentVersion}). Verifico tutti gli update idempotenti.`\r\n );\r\n } else {\r\n this.logger.warning(\r\n \"Versione database accessi assente. Verifico tutti gli update idempotenti.\"\r\n );\r\n }\r\n\r\n for (let index = startIndex; index < this.updates.length; index++) {\n const update = this.updates[index];\n const stepStartedAt = performance.now();\n this.logger.info(\n `Applico aggiornamento accessi ${update.fromVersion} -> ${update.toVersion}: ${update.description}`\n );\n await update.apply(options);\n await this.setDatabaseVersion(options.databaseOptions, update.toVersion);\n this.logger.info(\n `Aggiornamento accessi ${update.toVersion} completato in ${(performance.now() - stepStartedAt).toFixed(2)} ms`\n );\n }\n\n this.logger.info(\n `Verifica/aggiornamento database accessi completato in ${(performance.now() - startedAt).toFixed(2)} ms`\n );\n }\n\r\n static async getCurrentVersion(options: AccessiOptions): Promise<string | null> {\r\n return await this.getDatabaseVersion(options.databaseOptions);\r\n }\r\n\r\n static getLatestVersion(): string {\r\n return this.updates[this.updates.length - 1]?.toVersion ?? \"0.0.0\";\r\n }\r\n\r\n private static async ensureColumn(\r\n options: AccessiOptions,\r\n tableName: string,\r\n columnDefinition: string,\r\n columnName: string,\r\n comment?: string\r\n ): Promise<boolean> {\r\n const exists = await this.columnExists(\r\n options.databaseOptions,\r\n tableName,\r\n columnName\r\n );\r\n\r\n if (!exists) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n `ALTER TABLE ${tableName} ADD ${columnDefinition}`\r\n );\r\n }\r\n\r\n if (comment) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n `COMMENT ON COLUMN ${tableName}.${columnName} IS '${comment.replace(/'/g, \"''\")}'`\r\n );\r\n }\r\n\r\n return !exists;\r\n }\r\n\r\n private static async upsertFiltroTipo(\r\n options: AccessiOptions,\r\n tipfil: number,\r\n desfil: string,\r\n fldfil: string,\r\n flgEnabled?: number\r\n ): Promise<void> {\r\n const hasEnabledColumn = await this.columnExists(\r\n options.databaseOptions,\r\n \"FILTRI_TIPO\",\r\n \"FLGENABLED\"\r\n );\r\n\r\n const existing = await Orm.query(\r\n options.databaseOptions,\r\n \"SELECT TIPFIL FROM FILTRI_TIPO WHERE TIPFIL = ?\",\r\n [tipfil]\r\n );\r\n\r\n if (existing.length === 0) {\r\n if (hasEnabledColumn && flgEnabled !== undefined) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL, FLGENABLED) VALUES (?, ?, ?, ?)\",\r\n [tipfil, desfil, fldfil, flgEnabled]\r\n );\r\n return;\r\n }\r\n\r\n await Orm.execute(\r\n options.databaseOptions,\r\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL) VALUES (?, ?, ?)\",\r\n [tipfil, desfil, fldfil]\r\n );\r\n return;\r\n }\r\n\r\n if (hasEnabledColumn && flgEnabled !== undefined) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ?, FLGENABLED = COALESCE(FLGENABLED, ?) WHERE TIPFIL = ?\",\r\n [desfil, fldfil, flgEnabled, tipfil]\r\n );\r\n return;\r\n }\r\n\r\n await Orm.execute(\r\n options.databaseOptions,\r\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ? WHERE TIPFIL = ?\",\r\n [desfil, fldfil, tipfil]\r\n );\r\n }\r\n\r\n private static async upsertMenu(\r\n options: AccessiOptions,\r\n menu: {\r\n CODMNU: string;\r\n DESMNU: string;\r\n CODGRP: string;\r\n FLGENABLED: number;\r\n ICON: string;\r\n ORDINE: number;\r\n CODTIP: string;\r\n PAGINA: string;\r\n RIFMENU: string | null;\r\n }\r\n ): Promise<void> {\r\n const existing = await Orm.query(\r\n options.databaseOptions,\r\n \"SELECT CODMNU FROM MENU WHERE CODMNU = ?\",\r\n [menu.CODMNU]\r\n );\r\n\r\n if (existing.length === 0) {\r\n await Orm.execute(\r\n options.databaseOptions,\r\n `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n menu.CODMNU,\r\n menu.DESMNU,\r\n menu.CODGRP,\r\n menu.FLGENABLED,\r\n menu.ICON,\r\n menu.ORDINE,\r\n menu.CODTIP,\r\n menu.PAGINA,\r\n menu.RIFMENU,\r\n ]\r\n );\r\n return;\r\n }\r\n\r\n await Orm.execute(\r\n options.databaseOptions,\r\n `UPDATE MENU\r\n SET DESMNU = ?,\r\n CODGRP = ?,\r\n FLGENABLED = COALESCE(FLGENABLED, ?),\r\n ICON = ?,\r\n ORDINE = ?,\r\n CODTIP = ?,\r\n PAGINA = ?,\r\n RIFMENU = ?\r\n WHERE CODMNU = ?`,\r\n [\r\n menu.DESMNU,\r\n menu.CODGRP,\r\n menu.FLGENABLED,\r\n menu.ICON,\r\n menu.ORDINE,\r\n menu.CODTIP,\r\n menu.PAGINA,\r\n menu.RIFMENU,\r\n menu.CODMNU,\r\n ]\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AccessiDatabaseUpdater.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/AccessiDatabaseUpdater.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAkE;AAClE,2DAAwD;AAExD,mCAAgC;AAChC,yCAAsC;AAU/B,IAAM,sBAAsB,8BAA5B,MAAM,sBAAuB,SAAQ,iCAAe;IAoIzD,YAC8C,cAA8B;QAE1E,KAAK,EAAE,CAAC;QAFoC,mBAAc,GAAd,cAAc,CAAgB;IAG5E,CAAC;IAEK,YAAY;;YAChB,IAAI,IAAI,CAAC,cAAc,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;gBACrD,wBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;gBAChH,OAAO;YACT,CAAC;YAED,wBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACtE,MAAM,wBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtD,wBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC7E,CAAC;KAAA;IAED,MAAM,CAAO,GAAG,CAAC,OAAuB;;;YACtC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,8BAA8B,MAAA,OAAO,CAAC,eAAe,CAAC,IAAI,mCAAI,GAAG,IAAI,MAAA,OAAO,CAAC,eAAe,CAAC,IAAI,mCAAI,GAAG,OAAO,MAAA,OAAO,CAAC,eAAe,CAAC,QAAQ,mCAAI,GAAG,EAAE,CACzJ,CAAC;YACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAElD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CACzC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,cAAc,CAChD,CAAC;YACF,MAAM,UAAU,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5D,IAAI,cAAc,IAAI,YAAY,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0DAA0D,cAAc,IAAI,CAAC,CAAC;YACjG,CAAC;iBAAM,IAAI,cAAc,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,cAAc,GAAG,CAAC,CAAC;YACjF,CAAC;iBAAM,IAAI,cAAc,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,+CAA+C,cAAc,2CAA2C,CACzG,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,2EAA2E,CAC5E,CAAC;YACJ,CAAC;YAED,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,iCAAiC,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,WAAW,EAAE,CACpG,CAAC;gBACF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBACzE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,yBAAyB,MAAM,CAAC,SAAS,kBAAkB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/G,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,yDAAyD,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACzG,CAAC;QACJ,CAAC;KAAA;IAED,MAAM,CAAO,iBAAiB,CAAC,OAAuB;;YACpD,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChE,CAAC;KAAA;IAED,MAAM,CAAC,gBAAgB;;QACrB,OAAO,MAAA,MAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,SAAS,mCAAI,OAAO,CAAC;IACrE,CAAC;IAEO,MAAM,CAAO,YAAY,CAC/B,OAAuB,EACvB,SAAiB,EACjB,gBAAwB,EACxB,UAAkB,EAClB,OAAgB;;YAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC,OAAO,CAAC,eAAe,EACvB,SAAS,EACT,UAAU,CACX,CAAC;YAEF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,eAAe,SAAS,QAAQ,gBAAgB,EAAE,CACnD,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,qBAAqB,SAAS,IAAI,UAAU,QAAQ,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CACnF,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,MAAM,CAAC;QACjB,CAAC;KAAA;IAEO,MAAM,CAAO,gBAAgB,CACnC,OAAuB,EACvB,MAAc,EACd,MAAc,EACd,MAAc,EACd,UAAmB;;YAEnB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,YAAY,CAC9C,OAAO,CAAC,eAAe,EACvB,aAAa,EACb,YAAY,CACb,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,SAAG,CAAC,KAAK,CAC9B,OAAO,CAAC,eAAe,EACvB,iDAAiD,EACjD,CAAC,MAAM,CAAC,CACT,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,gBAAgB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBACjD,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,kFAAkF,EAClF,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CACrC,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,mEAAmE,EACnE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CACzB,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,gBAAgB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBACjD,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,sGAAsG,EACtG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CACrC,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,gEAAgE,EAChE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CACzB,CAAC;QACJ,CAAC;KAAA;IAEO,MAAM,CAAO,UAAU,CAC7B,OAAuB,EACvB,IAUC;;YAED,MAAM,QAAQ,GAAG,MAAM,SAAG,CAAC,KAAK,CAC9B,OAAO,CAAC,eAAe,EACvB,0CAA0C,EAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,CACd,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB;4CACoC,EACpC;oBACE,IAAI,CAAC,MAAM;oBACX,IAAI,CAAC,MAAM;oBACX,IAAI,CAAC,MAAM;oBACX,IAAI,CAAC,UAAU;oBACf,IAAI,CAAC,IAAI;oBACT,IAAI,CAAC,MAAM;oBACX,IAAI,CAAC,MAAM;oBACX,IAAI,CAAC,MAAM;oBACX,IAAI,CAAC,OAAO;iBACb,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB;;;;;;;;;wBASkB,EAClB;gBACE,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,UAAU;gBACf,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,MAAM;aACZ,CACF,CAAC;QACJ,CAAC;KAAA;;AA9VU,wDAAsB;AACP,6BAAM,GAAW,IAAI,eAAM,CAAC,wBAAsB,CAAC,IAAI,CAAC,AAAlD,CAAmD;AAE3D,8BAAO,GAAwB;IACrD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,iEAAiE;QAC9E,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,MAAM,wBAAsB,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9F,MAAM,wBAAsB,CAAC,YAAY,CACvC,OAAO,EACP,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,0DAA0D,CAC3D,CAAC;YACF,MAAM,wBAAsB,CAAC,UAAU,CAAC,OAAO,EAAE;gBAC/C,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,gBAAgB;gBACxB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC,CAAA;KACF;IACD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,oCAAoC;QACjD,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,MAAM,aAAa,GAAG,MAAM,wBAAsB,CAAC,YAAY,CAC7D,OAAO,EACP,aAAa,EACb,wCAAwC,EACxC,YAAY,CACb,CAAC;YAEF,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB,gEAAgE,CACjE,CAAC;YACJ,CAAC;QACH,CAAC,CAAA;KACF;IACD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,0CAA0C;QACvD,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,MAAM,wBAAsB,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,wBAAsB,CAAC,YAAY,CACvC,OAAO,EACP,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,qDAAqD,CACtD,CAAC;QACJ,CAAC,CAAA;KACF;IACD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,iDAAiD;QAC9D,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,MAAM,wBAAsB,CAAC,YAAY,CACvC,OAAO,EACP,eAAe,EACf,mCAAmC,EACnC,gBAAgB,EAChB,mDAAmD,CACpD,CAAC;YACF,MAAM,wBAAsB,CAAC,qBAAqB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9E,CAAC,CAAA;KACF;IACD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,uCAAuC;QACpD,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,IAAI,CAAC,CAAC,MAAM,wBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBAC7F,MAAM,SAAG,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,wBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBACvF,MAAM,SAAG,CAAC,OAAO,CACf,OAAO,CAAC,eAAe,EACvB;;;;;;IAMR,CACO,CAAC;YACJ,CAAC;QACH,CAAC,CAAA;KACF;IACD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,MAAM,wBAAsB,CAAC,YAAY,CACvC,OAAO,EACP,MAAM,EACN,oBAAoB,EACpB,MAAM,CACP,CAAC;QACJ,CAAC,CAAA;KACF;IACD;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,kCAAkC;QAC/C,KAAK,EAAE,CAAO,OAAO,EAAE,EAAE;YACvB,MAAM,wBAAsB,CAAC,YAAY,CACvC,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAA;KACF;CACF,AA/H8B,CA+H7B;iCAlIS,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAsIR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;;GArIjB,sBAAsB,CA+VlC","sourcesContent":["import { Injectable, Inject, OnModuleInit } from \"@nestjs/common\";\nimport { DatabaseUpdater } from \"../../DatabaseUpdater\";\nimport { AccessiOptions } from \"../AccessiModule\";\nimport { Orm } from \"../../Orm\";\nimport { Logger } from \"../../Logger\";\n\ntype AccessiUpdateStep = {\n fromVersion: string;\n toVersion: string;\n description: string;\n apply: (options: AccessiOptions) => Promise<void>;\n};\n\n@Injectable()\nexport class AccessiDatabaseUpdater extends DatabaseUpdater implements OnModuleInit {\n protected static override logger: Logger = new Logger(AccessiDatabaseUpdater.name);\n\n private static readonly updates: AccessiUpdateStep[] = [\n {\n fromVersion: \"1.0.0\",\n toVersion: \"1.1.0\",\n description: \"Aggiunge filtro postazione, colonna IDXPOS e menu verifica RFID\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 20, \"POSTAZIONE\", \"IDXPOS\", undefined);\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI\",\n \"IDXPOS SMALLINT\",\n \"IDXPOS\",\n \"idx della postazione nella tabella ANTENNE_POS di PROLAV\"\n );\n await AccessiDatabaseUpdater.upsertMenu(options, {\n CODMNU: \"MNUVERRFID\",\n DESMNU: \"Verifica RFID\",\n CODGRP: \"F\",\n FLGENABLED: 1,\n ICON: \"hardware-chip-outline\",\n ORDINE: 10,\n CODTIP: \"M\",\n PAGINA: \"/verifica-rfid\",\n RIFMENU: null,\n });\n },\n },\n {\n fromVersion: \"1.1.0\",\n toVersion: \"1.1.1\",\n description: \"Aggiunge FLGENABLED su FILTRI_TIPO\",\n apply: async (options) => {\n const columnCreated = await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI_TIPO\",\n \"FLGENABLED SMALLINT DEFAULT 1 NOT NULL\",\n \"FLGENABLED\"\n );\n\n if (!columnCreated) {\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET FLGENABLED = 1 WHERE FLGENABLED IS NULL\"\n );\n }\n },\n },\n {\n fromVersion: \"1.1.1\",\n toVersion: \"1.1.2\",\n description: \"Aggiunge filtro vettore e colonna CODVET\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 30, \"VETTORE\", \"CODVET\", 1);\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI\",\n \"CODVET INTEGER\",\n \"CODVET\",\n \"CODICE DEL VETTORE DA INSERIRE SE COME FILTRO HA 30\"\n );\n },\n },\n {\n fromVersion: \"1.1.2\",\n toVersion: \"1.1.3\",\n description: \"Aggiunge FLGADMINCONFIG e inizializza PARAMETRI\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"UTENTI_CONFIG\",\n \"FLGADMINCONFIG SMALLINT DEFAULT 0\",\n \"FLGADMINCONFIG\",\n \"flag utente configuratore dei menu amministratore\"\n );\n await AccessiDatabaseUpdater.createParametersTable(options.databaseOptions);\n },\n },\n {\n fromVersion: \"1.1.3\",\n toVersion: \"1.1.4\",\n description: \"Aggiunge sequence e trigger per RUOLI\",\n apply: async (options) => {\n if (!(await AccessiDatabaseUpdater.generatorExists(options.databaseOptions, \"GEN_RUOLI_ID\"))) {\n await Orm.execute(options.databaseOptions, \"CREATE SEQUENCE GEN_RUOLI_ID\");\n }\n\n if (!(await AccessiDatabaseUpdater.triggerExists(options.databaseOptions, \"RUOLI_BI\"))) {\n await Orm.execute(\n options.databaseOptions,\n `CREATE TRIGGER RUOLI_BI FOR RUOLI\nACTIVE BEFORE INSERT POSITION 0\nAS\nBEGIN\n IF (NEW.CODRUO IS NULL) THEN\n NEW.CODRUO = GEN_ID(GEN_RUOLI_ID,1);\nEND`\n );\n }\n },\n },\n {\n fromVersion: \"1.1.4\",\n toVersion: \"1.1.5\",\n description: \"Aggiunge NOTE su MENU\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"MENU\",\n \"NOTE VARCHAR(1000)\",\n \"NOTE\"\n );\n },\n },\n {\n fromVersion: \"1.1.5\",\n toVersion: \"1.1.6\",\n description: \"Aggiunge NUMMAC su UTENTI_CONFIG\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"UTENTI_CONFIG\",\n \"NUMMAC INTEGER\",\n \"NUMMAC\",\n 'Numero macchina DESPOST PROLAV'\n );\n },\n },\n ];\n\n constructor(\n @Inject(\"ACCESSI_OPTIONS\") private readonly accessiOptions: AccessiOptions\n ) {\n super();\n }\n\n async onModuleInit(): Promise<void> {\n if (this.accessiOptions.autoUpdateDatabase === false) {\n AccessiDatabaseUpdater.logger.info(\"Aggiornamento automatico database accessi disabilitato da configurazione.\");\n return;\n }\n\n AccessiDatabaseUpdater.logger.info(\"Avvio updater database accessi.\");\n await AccessiDatabaseUpdater.run(this.accessiOptions);\n AccessiDatabaseUpdater.logger.info(\"Updater database accessi completato.\");\n }\n\n static async run(options: AccessiOptions): Promise<void> {\n const startedAt = performance.now();\n this.logger.info(\n `Verifica schema accessi su ${options.databaseOptions.host ?? \"?\"}:${options.databaseOptions.port ?? \"?\"} -> ${options.databaseOptions.database ?? \"?\"}`\n );\n await this.createParametersTable(options.databaseOptions);\n this.logger.info(\"Tabella PARAMETRI verificata.\");\n\n const currentVersion = await this.getDatabaseVersion(options.databaseOptions);\n const currentIndex = this.updates.findIndex(\n (update) => update.toVersion === currentVersion\n );\n const startIndex = currentIndex >= 0 ? currentIndex + 1 : 0;\n\n if (currentVersion && currentIndex === this.updates.length - 1) {\n this.logger.info(`Database accessi gia' all'ultima versione disponibile (${currentVersion}).`);\n } else if (currentVersion && currentIndex >= 0) {\n this.logger.info(`Database accessi rilevato alla versione ${currentVersion}.`);\n } else if (currentVersion) {\n this.logger.warning(\n `Versione database accessi non riconosciuta (${currentVersion}). Verifico tutti gli update idempotenti.`\n );\n } else {\n this.logger.warning(\n \"Versione database accessi assente. Verifico tutti gli update idempotenti.\"\n );\n }\n\n for (let index = startIndex; index < this.updates.length; index++) {\n const update = this.updates[index];\n const stepStartedAt = performance.now();\n this.logger.info(\n `Applico aggiornamento accessi ${update.fromVersion} -> ${update.toVersion}: ${update.description}`\n );\n await update.apply(options);\n await this.setDatabaseVersion(options.databaseOptions, update.toVersion);\n this.logger.info(\n `Aggiornamento accessi ${update.toVersion} completato in ${(performance.now() - stepStartedAt).toFixed(2)} ms`\n );\n }\n\n this.logger.info(\n `Verifica/aggiornamento database accessi completato in ${(performance.now() - startedAt).toFixed(2)} ms`\n );\n }\n\n static async getCurrentVersion(options: AccessiOptions): Promise<string | null> {\n return await this.getDatabaseVersion(options.databaseOptions);\n }\n\n static getLatestVersion(): string {\n return this.updates[this.updates.length - 1]?.toVersion ?? \"0.0.0\";\n }\n\n private static async ensureColumn(\n options: AccessiOptions,\n tableName: string,\n columnDefinition: string,\n columnName: string,\n comment?: string\n ): Promise<boolean> {\n const exists = await this.columnExists(\n options.databaseOptions,\n tableName,\n columnName\n );\n\n if (!exists) {\n await Orm.execute(\n options.databaseOptions,\n `ALTER TABLE ${tableName} ADD ${columnDefinition}`\n );\n }\n\n if (comment) {\n await Orm.execute(\n options.databaseOptions,\n `COMMENT ON COLUMN ${tableName}.${columnName} IS '${comment.replace(/'/g, \"''\")}'`\n );\n }\n\n return !exists;\n }\n\n private static async upsertFiltroTipo(\n options: AccessiOptions,\n tipfil: number,\n desfil: string,\n fldfil: string,\n flgEnabled?: number\n ): Promise<void> {\n const hasEnabledColumn = await this.columnExists(\n options.databaseOptions,\n \"FILTRI_TIPO\",\n \"FLGENABLED\"\n );\n\n const existing = await Orm.query(\n options.databaseOptions,\n \"SELECT TIPFIL FROM FILTRI_TIPO WHERE TIPFIL = ?\",\n [tipfil]\n );\n\n if (existing.length === 0) {\n if (hasEnabledColumn && flgEnabled !== undefined) {\n await Orm.execute(\n options.databaseOptions,\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL, FLGENABLED) VALUES (?, ?, ?, ?)\",\n [tipfil, desfil, fldfil, flgEnabled]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL) VALUES (?, ?, ?)\",\n [tipfil, desfil, fldfil]\n );\n return;\n }\n\n if (hasEnabledColumn && flgEnabled !== undefined) {\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ?, FLGENABLED = COALESCE(FLGENABLED, ?) WHERE TIPFIL = ?\",\n [desfil, fldfil, flgEnabled, tipfil]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ? WHERE TIPFIL = ?\",\n [desfil, fldfil, tipfil]\n );\n }\n\n private static async upsertMenu(\n options: AccessiOptions,\n menu: {\n CODMNU: string;\n DESMNU: string;\n CODGRP: string;\n FLGENABLED: number;\n ICON: string;\n ORDINE: number;\n CODTIP: string;\n PAGINA: string;\n RIFMENU: string | null;\n }\n ): Promise<void> {\n const existing = await Orm.query(\n options.databaseOptions,\n \"SELECT CODMNU FROM MENU WHERE CODMNU = ?\",\n [menu.CODMNU]\n );\n\n if (existing.length === 0) {\n await Orm.execute(\n options.databaseOptions,\n `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n menu.CODMNU,\n menu.DESMNU,\n menu.CODGRP,\n menu.FLGENABLED,\n menu.ICON,\n menu.ORDINE,\n menu.CODTIP,\n menu.PAGINA,\n menu.RIFMENU,\n ]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n `UPDATE MENU\n SET DESMNU = ?,\n CODGRP = ?,\n FLGENABLED = COALESCE(FLGENABLED, ?),\n ICON = ?,\n ORDINE = ?,\n CODTIP = ?,\n PAGINA = ?,\n RIFMENU = ?\n WHERE CODMNU = ?`,\n [\n menu.DESMNU,\n menu.CODGRP,\n menu.FLGENABLED,\n menu.ICON,\n menu.ORDINE,\n menu.CODTIP,\n menu.PAGINA,\n menu.RIFMENU,\n menu.CODMNU,\n ]\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runAccessiDbUpdate.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/runAccessiDbUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccessiOptions } from \"../AccessiModule\";\r\nimport { AccessiDatabaseUpdater } from \"./AccessiDatabaseUpdater\";\r\nimport { DatabaseUtilities } from \"../../Utilities\";\r\n\r\nfunction getEnv(name: string, fallback?: string): string {\r\n const value = process.env[name] ?? fallback;\r\n if (!value) {\r\n throw new Error(`Variabile ambiente mancante: ${name}`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction getOptionalBoolean(name: string, fallback: boolean): boolean {\r\n const value = process.env[name];\r\n if (value === undefined) {\r\n return fallback;\r\n }\r\n\r\n return value.toLowerCase() === \"true\";\r\n}\r\n\r\nfunction createAccessiOptionsFromEnv(): AccessiOptions {\r\n return {\r\n databaseOptions: DatabaseUtilities.createOption(\r\n getEnv(\"ACCESSI_DB_HOST\"),\r\n Number(getEnv(\"ACCESSI_DB_PORT\", \"3050\")),\r\n getEnv(\"ACCESSI_DB_DATABASE\"),\r\n getEnv(\"ACCESSI_DB_USER\", \"SYSDBA\"),\r\n getEnv(\"ACCESSI_DB_PASSWORD\", \"masterkey\")\r\n ),\r\n confirmationEmailUrl: getEnv(\"ACCESSI_CONFIRMATION_EMAIL_URL\", \"http://localhost\"),\r\n confirmationEmailReturnUrl: getEnv(\"ACCESSI_CONFIRMATION_RETURN_EMAIL_URL\", \"http://localhost\"),\r\n confirmationEmailPrefix: process.env.ACCESSI_CONFIRMATION_EMAIL_PREFIX,\r\n customResetPage: process.env.ACCESSI_CUSTOM_RESET_PAGE,\r\n encryptionKey: getEnv(\"ACCESSI_ENCRYPTION_KEY\", \"1234567890ABCDEF\"),\r\n mockDemoUser: getOptionalBoolean(\"ACCESSI_MOCK_DEMO_USER\", false),\r\n passwordExpiration: getOptionalBoolean(\"ACCESSI_PASSWORD_EXPIRATION\", false),\r\n autoUpdateDatabase: true,\r\n jwtOptions: {\r\n secret: getEnv(\"ACCESSI_JWT_SECRET\", \"local-accessi-update\"),\r\n expiresIn: getEnv(\"ACCESSI_JWT_EXPIRES\", \"24h\"),\r\n },\r\n emailOptions: {\r\n host: getEnv(\"ACCESSI_EMAIL_HOST\", \"localhost\"),\r\n port: Number(getEnv(\"ACCESSI_EMAIL_PORT\", \"25\")),\r\n secure: getOptionalBoolean(\"ACCESSI_EMAIL_SECURE\", false),\r\n requireTLS: getOptionalBoolean(\"ACCESSI_EMAIL_REQUIRE_TLS\", false),\r\n tls: {\r\n rejectUnauthorized: getOptionalBoolean(\"ACCESSI_EMAIL_TLS_REJECT_UNAUTHORIZED\", false),\r\n },\r\n from: getEnv(\"ACCESSI_EMAIL_FROM\", \"noreply@example.local\"),\r\n auth: {\r\n user: getEnv(\"ACCESSI_EMAIL_USER\", \"local-user\"),\r\n pass: getEnv(\"ACCESSI_EMAIL_PASSWORD\", \"local-password\"),\r\n },\r\n },\r\n extensionFieldsOptions: [],\r\n };\r\n}\r\n\r\nasync function main(): Promise<void> {\r\n const options = createAccessiOptionsFromEnv();\r\n\r\n console.log(\"[Accessi DB Update] Avvio aggiornamento database...\");\r\n console.log(\r\n `[Accessi DB Update] Target: ${options.databaseOptions.host}:${options.databaseOptions.port} -> ${options.databaseOptions.database}`\r\n );\r\n\r\n await AccessiDatabaseUpdater.run(options);\r\n\r\n const currentVersion = await AccessiDatabaseUpdater.getCurrentVersion(options);\r\n console.log(\r\n `[Accessi DB Update] Completato. Versione corrente: ${currentVersion ?? \"N/D\"} | Ultima disponibile: ${AccessiDatabaseUpdater.getLatestVersion()}`\r\n );\r\n}\r\n\r\nmain().catch((error) => {\r\n console.error(\"[Accessi DB Update] Errore durante l'aggiornamento:\", error);\r\n process.exit(1);\r\n});\r\n"]}
1
+ {"version":3,"file":"runAccessiDbUpdate.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/runAccessiDbUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccessiOptions } from \"../AccessiModule\";\nimport { AccessiDatabaseUpdater } from \"./AccessiDatabaseUpdater\";\nimport { DatabaseUtilities } from \"../../Utilities\";\n\nfunction getEnv(name: string, fallback?: string): string {\n const value = process.env[name] ?? fallback;\n if (!value) {\n throw new Error(`Variabile ambiente mancante: ${name}`);\n }\n return value;\n}\n\nfunction getOptionalBoolean(name: string, fallback: boolean): boolean {\n const value = process.env[name];\n if (value === undefined) {\n return fallback;\n }\n\n return value.toLowerCase() === \"true\";\n}\n\nfunction createAccessiOptionsFromEnv(): AccessiOptions {\n return {\n databaseOptions: DatabaseUtilities.createOption(\n getEnv(\"ACCESSI_DB_HOST\"),\n Number(getEnv(\"ACCESSI_DB_PORT\", \"3050\")),\n getEnv(\"ACCESSI_DB_DATABASE\"),\n getEnv(\"ACCESSI_DB_USER\", \"SYSDBA\"),\n getEnv(\"ACCESSI_DB_PASSWORD\", \"masterkey\")\n ),\n confirmationEmailUrl: getEnv(\"ACCESSI_CONFIRMATION_EMAIL_URL\", \"http://localhost\"),\n confirmationEmailReturnUrl: getEnv(\"ACCESSI_CONFIRMATION_RETURN_EMAIL_URL\", \"http://localhost\"),\n confirmationEmailPrefix: process.env.ACCESSI_CONFIRMATION_EMAIL_PREFIX,\n customResetPage: process.env.ACCESSI_CUSTOM_RESET_PAGE,\n encryptionKey: getEnv(\"ACCESSI_ENCRYPTION_KEY\", \"1234567890ABCDEF\"),\n mockDemoUser: getOptionalBoolean(\"ACCESSI_MOCK_DEMO_USER\", false),\n passwordExpiration: getOptionalBoolean(\"ACCESSI_PASSWORD_EXPIRATION\", false),\n autoUpdateDatabase: true,\n jwtOptions: {\n secret: getEnv(\"ACCESSI_JWT_SECRET\", \"local-accessi-update\"),\n expiresIn: getEnv(\"ACCESSI_JWT_EXPIRES\", \"24h\"),\n },\n emailOptions: {\n host: getEnv(\"ACCESSI_EMAIL_HOST\", \"localhost\"),\n port: Number(getEnv(\"ACCESSI_EMAIL_PORT\", \"25\")),\n secure: getOptionalBoolean(\"ACCESSI_EMAIL_SECURE\", false),\n requireTLS: getOptionalBoolean(\"ACCESSI_EMAIL_REQUIRE_TLS\", false),\n tls: {\n rejectUnauthorized: getOptionalBoolean(\"ACCESSI_EMAIL_TLS_REJECT_UNAUTHORIZED\", false),\n },\n from: getEnv(\"ACCESSI_EMAIL_FROM\", \"noreply@example.local\"),\n auth: {\n user: getEnv(\"ACCESSI_EMAIL_USER\", \"local-user\"),\n pass: getEnv(\"ACCESSI_EMAIL_PASSWORD\", \"local-password\"),\n },\n },\n extensionFieldsOptions: [],\n };\n}\n\nasync function main(): Promise<void> {\n const options = createAccessiOptionsFromEnv();\n\n console.log(\"[Accessi DB Update] Avvio aggiornamento database...\");\n console.log(\n `[Accessi DB Update] Target: ${options.databaseOptions.host}:${options.databaseOptions.port} -> ${options.databaseOptions.database}`\n );\n\n await AccessiDatabaseUpdater.run(options);\n\n const currentVersion = await AccessiDatabaseUpdater.getCurrentVersion(options);\n console.log(\n `[Accessi DB Update] Completato. Versione corrente: ${currentVersion ?? \"N/D\"} | Ultima disponibile: ${AccessiDatabaseUpdater.getLatestVersion()}`\n );\n}\n\nmain().catch((error) => {\n console.error(\"[Accessi DB Update] Errore durante l'aggiornamento:\", error);\n process.exit(1);\n});\n"]}
@@ -3,6 +3,7 @@ import { AccessiOptions } from "./AccessiModule";
3
3
  export declare function initializeAccessiModule(app: Application, options: AccessiOptions): Promise<void>;
4
4
  export { AccessiModule } from "./AccessiModule";
5
5
  export { AccessiDatabaseUpdater } from "./database-updates/AccessiDatabaseUpdater";
6
+ export type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from "./AccessiModule";
6
7
  export * from "./Dtos";
7
8
  export { authorizeAccessi, authenticateGen } from "./middleware/authenticateGen";
8
9
  export { accessiRequirement } from "./middleware/accessiRequirements";