@volcanicminds/backend 2.3.2 → 3.0.1

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 (173) hide show
  1. package/README.md +221 -28
  2. package/dist/index.d.ts +3 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +24 -36
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/api/auth/controller/auth.d.ts.map +1 -1
  7. package/dist/lib/api/auth/controller/auth.js +14 -7
  8. package/dist/lib/api/auth/controller/auth.js.map +1 -1
  9. package/dist/lib/api/health/controller/health.d.ts +1 -1
  10. package/dist/lib/api/health/controller/health.d.ts.map +1 -1
  11. package/dist/lib/api/health/controller/health.js +1 -1
  12. package/dist/lib/api/health/controller/health.js.map +1 -1
  13. package/dist/lib/api/health/routes.d.ts +1 -0
  14. package/dist/lib/api/health/routes.d.ts.map +1 -1
  15. package/dist/lib/api/health/routes.js +1 -0
  16. package/dist/lib/api/health/routes.js.map +1 -1
  17. package/dist/lib/api/tenants/controller/tenants.d.ts +17 -0
  18. package/dist/lib/api/tenants/controller/tenants.d.ts.map +1 -0
  19. package/dist/lib/api/tenants/controller/tenants.js +150 -0
  20. package/dist/lib/api/tenants/controller/tenants.js.map +1 -0
  21. package/dist/lib/api/tenants/routes.d.ts +167 -0
  22. package/dist/lib/api/tenants/routes.d.ts.map +1 -0
  23. package/dist/lib/api/tenants/routes.js +143 -0
  24. package/dist/lib/api/tenants/routes.js.map +1 -0
  25. package/dist/lib/config/plugins.js +1 -1
  26. package/dist/lib/config/plugins.js.map +1 -1
  27. package/dist/lib/database/typeorm/entities/change.d.ts +11 -0
  28. package/dist/lib/database/typeorm/entities/change.d.ts.map +1 -0
  29. package/dist/lib/database/typeorm/entities/change.js +4 -0
  30. package/dist/lib/database/typeorm/entities/change.js.map +1 -0
  31. package/dist/lib/database/typeorm/entities/tenant.d.ts +13 -0
  32. package/dist/lib/database/typeorm/entities/tenant.d.ts.map +1 -0
  33. package/dist/lib/database/typeorm/entities/tenant.js +4 -0
  34. package/dist/lib/database/typeorm/entities/tenant.js.map +1 -0
  35. package/dist/lib/database/typeorm/entities/token.d.ts +16 -0
  36. package/dist/lib/database/typeorm/entities/token.d.ts.map +1 -0
  37. package/dist/lib/database/typeorm/entities/token.js +4 -0
  38. package/dist/lib/database/typeorm/entities/token.js.map +1 -0
  39. package/dist/lib/database/typeorm/entities/user.d.ts +28 -0
  40. package/dist/lib/database/typeorm/entities/user.d.ts.map +1 -0
  41. package/dist/lib/database/typeorm/entities/user.js +4 -0
  42. package/dist/lib/database/typeorm/entities/user.js.map +1 -0
  43. package/dist/lib/database/typeorm/loader/dataBaseManager.d.ts +6 -0
  44. package/dist/lib/database/typeorm/loader/dataBaseManager.d.ts.map +1 -0
  45. package/dist/lib/database/typeorm/loader/dataBaseManager.js +73 -0
  46. package/dist/lib/database/typeorm/loader/dataBaseManager.js.map +1 -0
  47. package/dist/lib/database/typeorm/loader/entities.d.ts +6 -0
  48. package/dist/lib/database/typeorm/loader/entities.d.ts.map +1 -0
  49. package/dist/lib/database/typeorm/loader/entities.js +37 -0
  50. package/dist/lib/database/typeorm/loader/entities.js.map +1 -0
  51. package/dist/lib/database/typeorm/loader/tenantManager.d.ts +17 -0
  52. package/dist/lib/database/typeorm/loader/tenantManager.d.ts.map +1 -0
  53. package/dist/lib/database/typeorm/loader/tenantManager.js +193 -0
  54. package/dist/lib/database/typeorm/loader/tenantManager.js.map +1 -0
  55. package/dist/lib/database/typeorm/loader/tokenManager.d.ts +23 -0
  56. package/dist/lib/database/typeorm/loader/tokenManager.d.ts.map +1 -0
  57. package/dist/lib/database/typeorm/loader/tokenManager.js +131 -0
  58. package/dist/lib/database/typeorm/loader/tokenManager.js.map +1 -0
  59. package/dist/lib/database/typeorm/loader/userManager.d.ts +39 -0
  60. package/dist/lib/database/typeorm/loader/userManager.d.ts.map +1 -0
  61. package/dist/lib/database/typeorm/loader/userManager.js +358 -0
  62. package/dist/lib/database/typeorm/loader/userManager.js.map +1 -0
  63. package/dist/lib/database/typeorm/query/builder.d.ts +2 -0
  64. package/dist/lib/database/typeorm/query/builder.d.ts.map +1 -0
  65. package/dist/lib/database/typeorm/query/builder.js +33 -0
  66. package/dist/lib/database/typeorm/query/builder.js.map +1 -0
  67. package/dist/lib/database/typeorm/query/parser.d.ts +2 -0
  68. package/dist/lib/database/typeorm/query/parser.d.ts.map +1 -0
  69. package/dist/lib/database/typeorm/query/parser.js +27 -0
  70. package/dist/lib/database/typeorm/query/parser.js.map +1 -0
  71. package/dist/lib/database/typeorm/query.d.ts +36 -0
  72. package/dist/lib/database/typeorm/query.d.ts.map +1 -0
  73. package/dist/lib/database/typeorm/query.js +259 -0
  74. package/dist/lib/database/typeorm/query.js.map +1 -0
  75. package/dist/lib/database/typeorm/util/crypto.d.ts +3 -0
  76. package/dist/lib/database/typeorm/util/crypto.d.ts.map +1 -0
  77. package/dist/lib/database/typeorm/util/crypto.js +46 -0
  78. package/dist/lib/database/typeorm/util/crypto.js.map +1 -0
  79. package/dist/lib/database/typeorm/util/error.d.ts +5 -0
  80. package/dist/lib/database/typeorm/util/error.d.ts.map +1 -0
  81. package/dist/lib/database/typeorm/util/error.js +8 -0
  82. package/dist/lib/database/typeorm/util/error.js.map +1 -0
  83. package/dist/lib/database/typeorm/util/logger.d.ts +7 -0
  84. package/dist/lib/database/typeorm/util/logger.d.ts.map +1 -0
  85. package/dist/lib/database/typeorm/util/logger.js +31 -0
  86. package/dist/lib/database/typeorm/util/logger.js.map +1 -0
  87. package/dist/lib/database/typeorm/util/yn.d.ts +2 -0
  88. package/dist/lib/database/typeorm/util/yn.d.ts.map +1 -0
  89. package/dist/lib/database/typeorm/util/yn.js +15 -0
  90. package/dist/lib/database/typeorm/util/yn.js.map +1 -0
  91. package/dist/lib/defaults/managers.d.ts.map +1 -1
  92. package/dist/lib/defaults/managers.js +186 -58
  93. package/dist/lib/defaults/managers.js.map +1 -1
  94. package/dist/lib/hooks/onRequest.d.ts.map +1 -1
  95. package/dist/lib/hooks/onRequest.js +11 -48
  96. package/dist/lib/hooks/onRequest.js.map +1 -1
  97. package/dist/lib/loader/router.d.ts.map +1 -1
  98. package/dist/lib/loader/router.js +92 -83
  99. package/dist/lib/loader/router.js.map +1 -1
  100. package/dist/lib/loader/tenant.d.ts.map +1 -1
  101. package/dist/lib/loader/tenant.js +18 -1
  102. package/dist/lib/loader/tenant.js.map +1 -1
  103. package/dist/lib/locales/en.json +12 -0
  104. package/dist/lib/locales/it.json +12 -0
  105. package/dist/lib/schemas/tenant.d.ts +88 -0
  106. package/dist/lib/schemas/tenant.d.ts.map +1 -0
  107. package/dist/lib/schemas/tenant.js +45 -0
  108. package/dist/lib/schemas/tenant.js.map +1 -0
  109. package/dist/lib/util/regexp.d.ts +2 -0
  110. package/dist/lib/util/regexp.d.ts.map +1 -1
  111. package/dist/lib/util/regexp.js +5 -3
  112. package/dist/lib/util/regexp.js.map +1 -1
  113. package/dist/lib/util/secret.d.ts +11 -0
  114. package/dist/lib/util/secret.d.ts.map +1 -0
  115. package/dist/lib/util/secret.js +70 -0
  116. package/dist/lib/util/secret.js.map +1 -0
  117. package/dist/server.js +4 -1
  118. package/dist/server.js.map +1 -1
  119. package/dist/typeorm.d.ts +15 -0
  120. package/dist/typeorm.d.ts.map +1 -0
  121. package/dist/typeorm.js +86 -0
  122. package/dist/typeorm.js.map +1 -0
  123. package/dist/types/database/typeorm/global.d.ts +56 -0
  124. package/dist/types/database/typeorm/global.d.ts.map +1 -0
  125. package/dist/types/database/typeorm/global.js +2 -0
  126. package/dist/types/database/typeorm/global.js.map +1 -0
  127. package/dist/types/global.d.ts +318 -0
  128. package/dist/types/orm.d.ts +22 -0
  129. package/lib/api/auth/controller/auth.ts +28 -12
  130. package/lib/api/health/controller/health.ts +1 -1
  131. package/lib/api/health/routes.ts +1 -0
  132. package/lib/api/tenants/controller/tenants.ts +211 -0
  133. package/lib/api/tenants/routes.ts +145 -0
  134. package/lib/config/plugins.ts +1 -1
  135. package/lib/database/typeorm/entities/change.ts +11 -0
  136. package/lib/database/typeorm/entities/tenant.ts +20 -0
  137. package/lib/database/typeorm/entities/token.ts +18 -0
  138. package/lib/database/typeorm/entities/user.ts +33 -0
  139. package/lib/database/typeorm/loader/dataBaseManager.ts +89 -0
  140. package/lib/database/typeorm/loader/entities.ts +47 -0
  141. package/lib/database/typeorm/loader/tenantManager.ts +260 -0
  142. package/lib/database/typeorm/loader/tokenManager.ts +157 -0
  143. package/lib/database/typeorm/loader/userManager.ts +432 -0
  144. package/lib/database/typeorm/query/builder.ts +39 -0
  145. package/lib/database/typeorm/query/parser.ts +29 -0
  146. package/lib/database/typeorm/query.ts +326 -0
  147. package/lib/database/typeorm/util/crypto.ts +52 -0
  148. package/lib/database/typeorm/util/error.ts +7 -0
  149. package/lib/database/typeorm/util/logger.ts +35 -0
  150. package/lib/database/typeorm/util/yn.ts +20 -0
  151. package/lib/defaults/managers.ts +191 -64
  152. package/lib/hooks/onRequest.ts +12 -64
  153. package/lib/loader/router.ts +138 -112
  154. package/lib/loader/tenant.ts +29 -13
  155. package/lib/schemas/tenant.ts +49 -0
  156. package/lib/util/regexp.ts +31 -8
  157. package/lib/util/secret.ts +113 -0
  158. package/package.json +56 -15
  159. package/dist/lib/apollo/context.d.ts +0 -6
  160. package/dist/lib/apollo/context.d.ts.map +0 -1
  161. package/dist/lib/apollo/context.js +0 -5
  162. package/dist/lib/apollo/context.js.map +0 -1
  163. package/dist/lib/apollo/resolvers.d.ts +0 -8
  164. package/dist/lib/apollo/resolvers.d.ts.map +0 -1
  165. package/dist/lib/apollo/resolvers.js +0 -8
  166. package/dist/lib/apollo/resolvers.js.map +0 -1
  167. package/dist/lib/apollo/type-defs.d.ts +0 -3
  168. package/dist/lib/apollo/type-defs.d.ts.map +0 -1
  169. package/dist/lib/apollo/type-defs.js +0 -8
  170. package/dist/lib/apollo/type-defs.js.map +0 -1
  171. package/lib/apollo/context.ts +0 -11
  172. package/lib/apollo/resolvers.ts +0 -12
  173. package/lib/apollo/type-defs.ts +0 -9
@@ -0,0 +1,358 @@
1
+ import * as bcrypt from 'bcrypt';
2
+ import * as Crypto from 'crypto';
3
+ import { ServiceError } from '../util/error.js';
4
+ import { executeCountQuery, executeFindQuery } from '../query.js';
5
+ import { encrypt, decrypt } from '../util/crypto.js';
6
+ function getUserRepo(context) {
7
+ const { multi_tenant } = global.config?.options || {};
8
+ if (multi_tenant?.enabled && !context) {
9
+ const errorMsg = '[UserManager] ⛔️ CRITICAL: Missing DB Context (Runner/Manager) in Multi-Tenant Environment! Implicit fallback to public schema forbidden.';
10
+ console.error(errorMsg);
11
+ throw new Error(errorMsg);
12
+ }
13
+ if (!context) {
14
+ return global.connection.getRepository(global.entity.User);
15
+ }
16
+ if (context.manager) {
17
+ return context.manager.getRepository(global.entity.User);
18
+ }
19
+ return context.getRepository(global.entity.User);
20
+ }
21
+ export function isImplemented() {
22
+ return true;
23
+ }
24
+ export async function isValidUser(data) {
25
+ return !!data && (!!data._id || !!data.id) && !!data.externalId && !!data.email && !!data.password;
26
+ }
27
+ export async function createUser(data, runner) {
28
+ const { username, email, password } = data;
29
+ if (!email || !password) {
30
+ throw new ServiceError('Invalid parameters', 400);
31
+ }
32
+ const salt = await bcrypt.genSalt(12);
33
+ const hashedPassword = await bcrypt.hash(password, salt);
34
+ try {
35
+ const repo = getUserRepo(runner);
36
+ let externalId, user;
37
+ do {
38
+ externalId = Crypto.randomUUID({ disableEntropyCache: true });
39
+ user = await repo.findOneBy({ externalId: externalId });
40
+ } while (user != null);
41
+ const newUser = repo.create({
42
+ ...data,
43
+ passwordChangedAt: new Date(),
44
+ confirmed: false,
45
+ confirmationToken: Crypto.randomBytes(64).toString('hex'),
46
+ blocked: false,
47
+ blockedReason: null,
48
+ externalId: externalId,
49
+ email: email,
50
+ username: username || email,
51
+ password: hashedPassword,
52
+ mfaEnabled: false,
53
+ mfaSecret: null,
54
+ mfaType: 'TOTP',
55
+ mfaRecoveryCodes: []
56
+ });
57
+ return getUserRepo(runner).save(newUser);
58
+ }
59
+ catch (error) {
60
+ if (error?.code == 23505) {
61
+ throw new ServiceError('Email or username already registered', 409);
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ export async function deleteUser(id, runner) {
67
+ if (!id) {
68
+ throw new ServiceError('Invalid parameters', 400);
69
+ }
70
+ try {
71
+ const userEx = await retrieveUserById(id, runner);
72
+ if (!userEx) {
73
+ throw new ServiceError('User not found', 404);
74
+ }
75
+ return getUserRepo(runner).delete(id);
76
+ }
77
+ catch (error) {
78
+ throw error;
79
+ }
80
+ }
81
+ export async function resetExternalId(id, runner) {
82
+ if (!id) {
83
+ throw new ServiceError('Invalid parameters', 400);
84
+ }
85
+ try {
86
+ let externalId, user;
87
+ do {
88
+ externalId = Crypto.randomUUID({ disableEntropyCache: true });
89
+ user = await getUserRepo(runner).findOneBy({ externalId: externalId });
90
+ } while (user != null);
91
+ return await updateUserById(id, { externalId: externalId }, runner);
92
+ }
93
+ catch (error) {
94
+ if (error?.code == 23505) {
95
+ throw new ServiceError('External ID not changed', 409);
96
+ }
97
+ throw error;
98
+ }
99
+ }
100
+ export async function updateUserById(id, user, runner) {
101
+ if (!id || !user) {
102
+ throw new ServiceError('Invalid parameters', 400);
103
+ }
104
+ try {
105
+ const repo = getUserRepo(runner);
106
+ const userEx = await retrieveUserById(id, runner);
107
+ if (!userEx) {
108
+ throw new ServiceError('User not found', 404);
109
+ }
110
+ const merged = repo.merge(userEx, user);
111
+ return repo.save(merged);
112
+ }
113
+ catch (error) {
114
+ throw error;
115
+ }
116
+ }
117
+ export async function retrieveUserById(id, runner) {
118
+ if (!id) {
119
+ throw new ServiceError('Invalid parameters', 400);
120
+ }
121
+ try {
122
+ return await getUserRepo(runner).findOneBy({ id: id });
123
+ }
124
+ catch (error) {
125
+ throw error;
126
+ }
127
+ }
128
+ export async function retrieveUserByEmail(email, runner) {
129
+ if (!email) {
130
+ throw new ServiceError('Invalid parameters', 400);
131
+ }
132
+ try {
133
+ return await getUserRepo(runner).findOneBy({ email: email });
134
+ }
135
+ catch (error) {
136
+ throw error;
137
+ }
138
+ }
139
+ export async function retrieveUserByUsername(username, runner) {
140
+ if (!username) {
141
+ throw new ServiceError('Invalid parameters', 400);
142
+ }
143
+ try {
144
+ return await getUserRepo(runner).findOneBy({ username });
145
+ }
146
+ catch (error) {
147
+ throw error;
148
+ }
149
+ }
150
+ export async function retrieveUserByConfirmationToken(code, runner) {
151
+ if (!code) {
152
+ throw new ServiceError('Invalid parameters', 400);
153
+ }
154
+ try {
155
+ return await getUserRepo(runner).findOneBy({ confirmationToken: code });
156
+ }
157
+ catch (error) {
158
+ throw error;
159
+ }
160
+ }
161
+ export async function retrieveUserByResetPasswordToken(code, runner) {
162
+ if (!code) {
163
+ throw new ServiceError('Invalid parameters', 400);
164
+ }
165
+ try {
166
+ return await getUserRepo(runner).findOneBy({ resetPasswordToken: code });
167
+ }
168
+ catch (error) {
169
+ throw error;
170
+ }
171
+ }
172
+ export async function retrieveUserByExternalId(externalId, runner) {
173
+ if (!externalId) {
174
+ throw new ServiceError('Invalid parameters', 400);
175
+ }
176
+ try {
177
+ return await getUserRepo(runner).findOne({
178
+ where: { externalId: externalId },
179
+ cache: global.cacheTimeout
180
+ });
181
+ }
182
+ catch (error) {
183
+ throw error;
184
+ }
185
+ }
186
+ const DUMMY_PASSWORD_HASH = '$2b$12$4sLKI6Ag4n6KjUBPqA4oJuAthEdYgbwUj7oIR8yj7IekjUCzUFRD2';
187
+ export async function retrieveUserByPassword(email, password, runner) {
188
+ if (!email || !password) {
189
+ throw new ServiceError('Invalid parameters', 400);
190
+ }
191
+ const user = await getUserRepo(runner).findOneBy({ email: email });
192
+ const match = await bcrypt.compare(password, user?.password || DUMMY_PASSWORD_HASH);
193
+ return user && match ? user : null;
194
+ }
195
+ export async function changePassword(email, password, oldPassword, runner) {
196
+ if (!email || !password || !oldPassword) {
197
+ throw new ServiceError('Invalid parameters', 400);
198
+ }
199
+ try {
200
+ const repo = getUserRepo(runner);
201
+ const user = await repo.findOneBy({ email: email });
202
+ const match = await bcrypt.compare(oldPassword, user?.password || DUMMY_PASSWORD_HASH);
203
+ if (user && match) {
204
+ const salt = await bcrypt.genSalt(12);
205
+ const hashedPassword = await bcrypt.hash(password, salt);
206
+ return repo.save({ ...user, passwordChangedAt: new Date(), password: hashedPassword });
207
+ }
208
+ throw new ServiceError('Password not changed', 400);
209
+ }
210
+ catch (error) {
211
+ throw error;
212
+ }
213
+ }
214
+ export async function forgotPassword(email, runner) {
215
+ if (!email) {
216
+ throw new ServiceError('Invalid parameters', 400);
217
+ }
218
+ try {
219
+ const repo = getUserRepo(runner);
220
+ const user = await repo.findOneBy({ email: email });
221
+ if (user) {
222
+ return repo.save({
223
+ ...user,
224
+ resetPasswordTokenAt: new Date(),
225
+ resetPasswordToken: Crypto.randomBytes(64).toString('hex')
226
+ });
227
+ }
228
+ throw new ServiceError('Password not changed', 400);
229
+ }
230
+ catch (error) {
231
+ throw error;
232
+ }
233
+ }
234
+ export async function resetPassword(user, password, runner) {
235
+ if (!user || !password || !user?.email) {
236
+ throw new ServiceError('Invalid parameters', 400);
237
+ }
238
+ try {
239
+ const repo = getUserRepo(runner);
240
+ const userEx = await repo.findOneBy({ email: user.email });
241
+ if (!userEx) {
242
+ throw new Error('Wrong credentials');
243
+ }
244
+ const salt = await bcrypt.genSalt(12);
245
+ const hashedPassword = await bcrypt.hash(password, salt);
246
+ return repo.save({
247
+ ...userEx,
248
+ passwordChangedAt: new Date(),
249
+ confirmed: true,
250
+ confirmedAt: new Date(),
251
+ resetPasswordToken: null,
252
+ password: hashedPassword
253
+ });
254
+ }
255
+ catch (error) {
256
+ throw error;
257
+ }
258
+ }
259
+ export async function userConfirmation(user, runner) {
260
+ if (!user) {
261
+ throw new ServiceError('Invalid parameters', 400);
262
+ }
263
+ try {
264
+ return getUserRepo(runner).save({ ...user, confirmed: true, confirmedAt: new Date(), confirmationToken: null });
265
+ }
266
+ catch (error) {
267
+ throw error;
268
+ }
269
+ }
270
+ export async function blockUserById(id, reason, runner) {
271
+ return updateUserById(id, { blocked: true, blockedAt: new Date(), blockedReason: reason }, runner);
272
+ }
273
+ export async function unblockUserById(id, runner) {
274
+ return updateUserById(id, { blocked: false, blockedAt: new Date(), blockedReason: null }, runner);
275
+ }
276
+ export function isPasswordToBeChanged(user) {
277
+ if (process.env.PASSWORD_EXPIRATION_DAYS != null) {
278
+ let passwordExpirationDays = -1;
279
+ try {
280
+ passwordExpirationDays = Number(process.env.PASSWORD_EXPIRATION_DAYS);
281
+ if (passwordExpirationDays <= 0) {
282
+ throw new Error('PASSWORD_EXPIRATION_DAYS_ENV_INVALID');
283
+ }
284
+ }
285
+ catch (e) {
286
+ throw e;
287
+ }
288
+ const { passwordChangedAt } = user;
289
+ const date1 = new Date(passwordChangedAt);
290
+ const date2 = new Date();
291
+ const differenceInTime = date2.getTime() - date1.getTime();
292
+ const differenceInDays = differenceInTime / (1000 * 3600 * 24);
293
+ return differenceInDays >= passwordExpirationDays;
294
+ }
295
+ return false;
296
+ }
297
+ export async function countQuery(data, runner) {
298
+ return await executeCountQuery(getUserRepo(runner), data);
299
+ }
300
+ export async function findQuery(data, runner) {
301
+ return await executeFindQuery(getUserRepo(runner), {}, data);
302
+ }
303
+ export async function disableUserById(id, runner) {
304
+ await updateUserById(id, { blocked: true, blockedAt: new Date(), blockedReason: 'User disabled to unregister' }, runner);
305
+ return resetExternalId(id, runner);
306
+ }
307
+ export async function saveMfaSecret(userId, secret, runner) {
308
+ if (!userId || !secret) {
309
+ throw new ServiceError('Invalid parameters', 400);
310
+ }
311
+ const encryptedSecret = encrypt(secret);
312
+ await updateUserById(userId, {
313
+ mfaSecret: encryptedSecret,
314
+ mfaType: 'TOTP'
315
+ }, runner);
316
+ return true;
317
+ }
318
+ export async function retrieveMfaSecret(userId, runner) {
319
+ if (!userId)
320
+ throw new ServiceError('Invalid parameters', 400);
321
+ const user = await getUserRepo(runner)
322
+ .createQueryBuilder('user')
323
+ .addSelect('user.mfaSecret')
324
+ .where('user.id = :id', { id: userId })
325
+ .getOne();
326
+ if (!user || !user.mfaSecret)
327
+ return null;
328
+ return decrypt(user.mfaSecret);
329
+ }
330
+ export async function enableMfa(userId, runner) {
331
+ if (!userId)
332
+ throw new ServiceError('Invalid parameters', 400);
333
+ return await updateUserById(userId, { mfaEnabled: true }, runner);
334
+ }
335
+ export async function disableMfa(userId, runner) {
336
+ if (!userId)
337
+ throw new ServiceError('Invalid parameters', 400);
338
+ return await updateUserById(userId, { mfaEnabled: false, mfaSecret: null, mfaRecoveryCodes: [] }, runner);
339
+ }
340
+ export async function forceDisableMfaForAdmin(email, runner) {
341
+ if (!email)
342
+ return false;
343
+ const user = await getUserRepo(runner).findOneBy({ email: email });
344
+ if (!user) {
345
+ return false;
346
+ }
347
+ const hasAdmin = user.roles && (user.roles.includes('admin') || user.roles.some((r) => r === 'admin' || r.code === 'admin'));
348
+ if (!hasAdmin) {
349
+ return false;
350
+ }
351
+ await updateUserById(user.id, {
352
+ mfaEnabled: false,
353
+ mfaSecret: null,
354
+ mfaRecoveryCodes: []
355
+ }, runner);
356
+ return true;
357
+ }
358
+ //# sourceMappingURL=userManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userManager.js","sourceRoot":"","sources":["../../../../../lib/database/typeorm/loader/userManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const buildWhereFromAst: (ast: any, aliasMap: Map<string, any>, isMongo: boolean) => any;
2
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../lib/database/typeorm/query/builder.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,GAAI,KAAK,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,OAAO,QA8BvF,CAAA"}
@@ -0,0 +1,33 @@
1
+ const combineSqlAnd = (left, right) => {
2
+ if (Array.isArray(left) || Array.isArray(right)) {
3
+ throw new Error('Combining OR conditions with AND is not supported in this simplified SQL builder.');
4
+ }
5
+ return { ...left, ...right };
6
+ };
7
+ export const buildWhereFromAst = (ast, aliasMap, isMongo) => {
8
+ if (!ast) {
9
+ return {};
10
+ }
11
+ if (ast.type === 'operand') {
12
+ if (!aliasMap.has(ast.value)) {
13
+ throw new Error(`Alias "${ast.value}" used in _logic not found in query parameters.`);
14
+ }
15
+ return aliasMap.get(ast.value);
16
+ }
17
+ const left = buildWhereFromAst(ast.left, aliasMap, isMongo);
18
+ const right = buildWhereFromAst(ast.right, aliasMap, isMongo);
19
+ if (ast.type === 'AND') {
20
+ if (isMongo) {
21
+ return { $and: [left, right].flat() };
22
+ }
23
+ return combineSqlAnd(left, right);
24
+ }
25
+ if (ast.type === 'OR') {
26
+ if (isMongo) {
27
+ return { $or: [left, right].flat() };
28
+ }
29
+ return [left, right].flat();
30
+ }
31
+ return {};
32
+ };
33
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../../lib/database/typeorm/query/builder.ts"],"names":[],"mappings":"AACA,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtG,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAAE,QAA0B,EAAE,OAAgB,EAAE,EAAE;IAC1F,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,iDAAiD,CAAC,CAAA;QACvF,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE7D,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;QACvC,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;QACtC,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const parseLogicExpression: (logic: string) => any;
2
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../lib/database/typeorm/query/parser.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,QA4BjD,CAAA"}
@@ -0,0 +1,27 @@
1
+ export const parseLogicExpression = (logic) => {
2
+ const tokens = logic.match(/\(|\)|[A-Za-z0-9_:]+|\s*(AND|OR)\s*/g)?.filter((t) => t.trim()) || [];
3
+ let pos = 0;
4
+ const parseExpression = () => {
5
+ let left = parseTerm();
6
+ while (pos < tokens.length && (tokens[pos].trim() === 'OR' || tokens[pos].trim() === 'AND')) {
7
+ const operator = tokens[pos++].trim();
8
+ const right = parseTerm();
9
+ left = { type: operator, left, right };
10
+ }
11
+ return left;
12
+ };
13
+ const parseTerm = () => {
14
+ if (tokens[pos] === '(') {
15
+ pos++;
16
+ const node = parseExpression();
17
+ if (tokens[pos] !== ')') {
18
+ throw new Error('Mismatched parentheses in _logic expression');
19
+ }
20
+ pos++;
21
+ return node;
22
+ }
23
+ return { type: 'operand', value: tokens[pos++] };
24
+ };
25
+ return parseExpression();
26
+ };
27
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../lib/database/typeorm/query/parser.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;IACjG,IAAI,GAAG,GAAG,CAAC,CAAA;IAEX,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,IAAI,GAAG,SAAS,EAAE,CAAA;QACtB,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACrC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAA;YACzB,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QACxC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;YACxB,GAAG,EAAE,CAAA;YACL,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;YAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAChE,CAAC;YACD,GAAG,EAAE,CAAA;YACL,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAA;IAClD,CAAC,CAAA;IAED,OAAO,eAAe,EAAE,CAAA;AAC1B,CAAC,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { QueryRunner } from 'typeorm';
2
+ export declare const configureSensitiveFields: (fields: string[]) => void;
3
+ export declare const useOrder: (order?: string[]) => {};
4
+ export declare const useWhere: (where: any, repo?: any) => {
5
+ allConditions: {};
6
+ aliasMap: Map<string, any>;
7
+ };
8
+ export declare function applyQuery(data: any, extraWhere: any, repo: any): {
9
+ skip?: number;
10
+ take?: number;
11
+ order?: object;
12
+ where?: object | object[];
13
+ };
14
+ export declare function executeFindQuery(repo: any, relations?: any, data?: any, extraWhere?: any, extraOptions?: any): Promise<{
15
+ records: any;
16
+ headers: {
17
+ 'v-count': any;
18
+ 'v-total': any;
19
+ 'v-page': any;
20
+ 'v-pageSize': number | undefined;
21
+ 'v-pageCount': number;
22
+ };
23
+ }>;
24
+ export declare function executeFindView(viewEntity: any, data?: any, extraWhere?: any, extraOptions?: any, runner?: QueryRunner): Promise<{
25
+ records: any;
26
+ headers: {
27
+ 'v-count': any;
28
+ 'v-total': any;
29
+ 'v-page': any;
30
+ 'v-pageSize': number | undefined;
31
+ 'v-pageCount': number;
32
+ };
33
+ }>;
34
+ export declare function executeCountQuery(repo: any, data?: {}, extraWhere?: any): Promise<any>;
35
+ export declare function executeCountView(viewEntity: any, data?: {}, extraWhere?: any, runner?: QueryRunner): Promise<any>;
36
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../lib/database/typeorm/query.ts"],"names":[],"mappings":"AAEA,OAAO,EAaL,WAAW,EACZ,MAAM,SAAS,CAAA;AAQhB,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,EAAE,SAKxD,CAAA;AAYD,eAAO,MAAM,QAAQ,GAAI,QAAO,MAAM,EAAO,OAmC5C,CAAA;AAWD,eAAO,MAAM,QAAQ,GAAI,OAAO,GAAG,EAAE,OAAO,GAAG;;;CA8G9C,CAAA;AAED,wBAAgB,UAAU,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,IAAI,KAAA;WAQtC,MAAM;WACN,MAAM;YACL,MAAM;YACN,MAAM,GAAG,MAAM,EAAE;EA0C5B;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,GAAG,EACT,SAAS,GAAE,GAAQ,EACnB,IAAI,GAAE,GAAQ,EACd,UAAU,GAAE,GAAQ,EACpB,YAAY,GAAE,GAAQ;;;;;;;;;GAoBvB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,GAAG,EACf,IAAI,GAAE,GAAQ,EACd,UAAU,GAAE,GAAQ,EACpB,YAAY,GAAE,GAAQ,EACtB,MAAM,CAAC,EAAE,WAAW;;;;;;;;;GAoBrB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,UAAU,GAAE,GAAQ,gBAGjF;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,UAAU,GAAE,GAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,gBAI5G"}