@friggframework/core 2.0.0-next.45 → 2.0.0-next.46

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 (163) hide show
  1. package/README.md +28 -0
  2. package/application/commands/integration-commands.js +19 -0
  3. package/core/Worker.js +8 -21
  4. package/credential/repositories/credential-repository-mongo.js +14 -8
  5. package/credential/repositories/credential-repository-postgres.js +14 -8
  6. package/credential/repositories/credential-repository.js +3 -8
  7. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  8. package/database/adapters/lambda-invoker.js +97 -0
  9. package/database/config.js +11 -2
  10. package/database/models/WebsocketConnection.js +11 -10
  11. package/database/prisma.js +63 -3
  12. package/database/repositories/health-check-repository-mongodb.js +3 -0
  13. package/database/repositories/migration-status-repository-s3.js +137 -0
  14. package/database/use-cases/check-database-state-use-case.js +81 -0
  15. package/database/use-cases/check-encryption-health-use-case.js +3 -2
  16. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  17. package/database/use-cases/get-migration-status-use-case.js +93 -0
  18. package/database/use-cases/run-database-migration-use-case.js +137 -0
  19. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  20. package/database/utils/mongodb-collection-utils.js +91 -0
  21. package/database/utils/mongodb-schema-init.js +106 -0
  22. package/database/utils/prisma-runner.js +400 -0
  23. package/database/utils/prisma-schema-parser.js +182 -0
  24. package/encrypt/Cryptor.js +14 -16
  25. package/generated/prisma-mongodb/client.d.ts +1 -0
  26. package/generated/prisma-mongodb/client.js +4 -0
  27. package/generated/prisma-mongodb/default.d.ts +1 -0
  28. package/generated/prisma-mongodb/default.js +4 -0
  29. package/generated/prisma-mongodb/edge.d.ts +1 -0
  30. package/generated/prisma-mongodb/edge.js +334 -0
  31. package/generated/prisma-mongodb/index-browser.js +316 -0
  32. package/generated/prisma-mongodb/index.d.ts +22897 -0
  33. package/generated/prisma-mongodb/index.js +359 -0
  34. package/generated/prisma-mongodb/package.json +183 -0
  35. package/generated/prisma-mongodb/query-engine-debian-openssl-3.0.x +0 -0
  36. package/generated/prisma-mongodb/query-engine-rhel-openssl-3.0.x +0 -0
  37. package/generated/prisma-mongodb/runtime/binary.d.ts +1 -0
  38. package/generated/prisma-mongodb/runtime/binary.js +289 -0
  39. package/generated/prisma-mongodb/runtime/edge-esm.js +34 -0
  40. package/generated/prisma-mongodb/runtime/edge.js +34 -0
  41. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  42. package/generated/prisma-mongodb/runtime/index-browser.js +16 -0
  43. package/generated/prisma-mongodb/runtime/library.d.ts +3977 -0
  44. package/generated/prisma-mongodb/runtime/react-native.js +83 -0
  45. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +84 -0
  46. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +36 -0
  47. package/generated/prisma-mongodb/schema.prisma +362 -0
  48. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +4 -0
  49. package/generated/prisma-mongodb/wasm-worker-loader.mjs +4 -0
  50. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  51. package/generated/prisma-mongodb/wasm.js +341 -0
  52. package/generated/prisma-postgresql/client.d.ts +1 -0
  53. package/generated/prisma-postgresql/client.js +4 -0
  54. package/generated/prisma-postgresql/default.d.ts +1 -0
  55. package/generated/prisma-postgresql/default.js +4 -0
  56. package/generated/prisma-postgresql/edge.d.ts +1 -0
  57. package/generated/prisma-postgresql/edge.js +356 -0
  58. package/generated/prisma-postgresql/index-browser.js +338 -0
  59. package/generated/prisma-postgresql/index.d.ts +25071 -0
  60. package/generated/prisma-postgresql/index.js +381 -0
  61. package/generated/prisma-postgresql/package.json +183 -0
  62. package/generated/prisma-postgresql/query-engine-debian-openssl-3.0.x +0 -0
  63. package/generated/prisma-postgresql/query-engine-rhel-openssl-3.0.x +0 -0
  64. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  65. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  66. package/generated/prisma-postgresql/runtime/binary.d.ts +1 -0
  67. package/generated/prisma-postgresql/runtime/binary.js +289 -0
  68. package/generated/prisma-postgresql/runtime/edge-esm.js +34 -0
  69. package/generated/prisma-postgresql/runtime/edge.js +34 -0
  70. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  71. package/generated/prisma-postgresql/runtime/index-browser.js +16 -0
  72. package/generated/prisma-postgresql/runtime/library.d.ts +3977 -0
  73. package/generated/prisma-postgresql/runtime/react-native.js +83 -0
  74. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +84 -0
  75. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +36 -0
  76. package/generated/prisma-postgresql/schema.prisma +345 -0
  77. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +4 -0
  78. package/generated/prisma-postgresql/wasm-worker-loader.mjs +4 -0
  79. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  80. package/generated/prisma-postgresql/wasm.js +363 -0
  81. package/handlers/database-migration-handler.js +227 -0
  82. package/handlers/routers/auth.js +1 -1
  83. package/handlers/routers/db-migration.handler.js +29 -0
  84. package/handlers/routers/db-migration.js +256 -0
  85. package/handlers/routers/health.js +41 -6
  86. package/handlers/routers/integration-webhook-routers.js +2 -2
  87. package/handlers/use-cases/check-integrations-health-use-case.js +22 -10
  88. package/handlers/workers/db-migration.js +352 -0
  89. package/index.js +12 -0
  90. package/integrations/integration-router.js +60 -70
  91. package/integrations/repositories/integration-repository-interface.js +12 -0
  92. package/integrations/repositories/integration-repository-mongo.js +32 -0
  93. package/integrations/repositories/integration-repository-postgres.js +33 -0
  94. package/integrations/repositories/process-repository-postgres.js +2 -2
  95. package/integrations/tests/doubles/test-integration-repository.js +2 -2
  96. package/logs/logger.js +0 -4
  97. package/modules/entity.js +0 -1
  98. package/modules/repositories/module-repository-mongo.js +3 -12
  99. package/modules/repositories/module-repository-postgres.js +0 -11
  100. package/modules/repositories/module-repository.js +1 -12
  101. package/modules/use-cases/get-entity-options-by-id.js +1 -1
  102. package/modules/use-cases/get-module.js +1 -2
  103. package/modules/use-cases/refresh-entity-options.js +1 -1
  104. package/modules/use-cases/test-module-auth.js +1 -1
  105. package/package.json +82 -66
  106. package/prisma-mongodb/schema.prisma +21 -21
  107. package/prisma-postgresql/schema.prisma +15 -15
  108. package/queues/queuer-util.js +24 -21
  109. package/types/core/index.d.ts +2 -2
  110. package/types/module-plugin/index.d.ts +0 -2
  111. package/user/use-cases/authenticate-user.js +127 -0
  112. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  113. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  114. package/user/use-cases/get-user-from-x-frigg-headers.js +106 -0
  115. package/user/user.js +16 -0
  116. package/websocket/repositories/websocket-connection-repository-mongo.js +11 -10
  117. package/websocket/repositories/websocket-connection-repository-postgres.js +11 -10
  118. package/websocket/repositories/websocket-connection-repository.js +11 -10
  119. package/application/commands/integration-commands.test.js +0 -123
  120. package/database/encryption/encryption-integration.test.js +0 -553
  121. package/database/encryption/encryption-schema-registry.test.js +0 -392
  122. package/database/encryption/field-encryption-service.test.js +0 -525
  123. package/database/encryption/mongo-decryption-fix-verification.test.js +0 -348
  124. package/database/encryption/postgres-decryption-fix-verification.test.js +0 -371
  125. package/database/encryption/postgres-relation-decryption.test.js +0 -245
  126. package/database/encryption/prisma-encryption-extension.test.js +0 -439
  127. package/errors/base-error.test.js +0 -32
  128. package/errors/fetch-error.test.js +0 -79
  129. package/errors/halt-error.test.js +0 -11
  130. package/errors/validation-errors.test.js +0 -120
  131. package/handlers/auth-flow.integration.test.js +0 -147
  132. package/handlers/integration-event-dispatcher.test.js +0 -209
  133. package/handlers/routers/health.test.js +0 -210
  134. package/handlers/routers/integration-webhook-routers.test.js +0 -126
  135. package/handlers/webhook-flow.integration.test.js +0 -356
  136. package/handlers/workers/integration-defined-workers.test.js +0 -184
  137. package/integrations/tests/use-cases/create-integration.test.js +0 -131
  138. package/integrations/tests/use-cases/delete-integration-for-user.test.js +0 -150
  139. package/integrations/tests/use-cases/find-integration-context-by-external-entity-id.test.js +0 -92
  140. package/integrations/tests/use-cases/get-integration-for-user.test.js +0 -150
  141. package/integrations/tests/use-cases/get-integration-instance.test.js +0 -176
  142. package/integrations/tests/use-cases/get-integrations-for-user.test.js +0 -176
  143. package/integrations/tests/use-cases/get-possible-integrations.test.js +0 -188
  144. package/integrations/tests/use-cases/update-integration-messages.test.js +0 -142
  145. package/integrations/tests/use-cases/update-integration-status.test.js +0 -103
  146. package/integrations/tests/use-cases/update-integration.test.js +0 -141
  147. package/integrations/use-cases/create-process.test.js +0 -178
  148. package/integrations/use-cases/get-process.test.js +0 -190
  149. package/integrations/use-cases/load-integration-context-full.test.js +0 -329
  150. package/integrations/use-cases/load-integration-context.test.js +0 -114
  151. package/integrations/use-cases/update-process-metrics.test.js +0 -308
  152. package/integrations/use-cases/update-process-state.test.js +0 -256
  153. package/lambda/TimeoutCatcher.test.js +0 -68
  154. package/logs/logger.test.js +0 -76
  155. package/modules/module-hydration.test.js +0 -205
  156. package/modules/requester/requester.test.js +0 -28
  157. package/user/tests/use-cases/create-individual-user.test.js +0 -24
  158. package/user/tests/use-cases/create-organization-user.test.js +0 -28
  159. package/user/tests/use-cases/create-token-for-user-id.test.js +0 -19
  160. package/user/tests/use-cases/get-user-from-bearer-token.test.js +0 -64
  161. package/user/tests/use-cases/login-user.test.js +0 -220
  162. package/user/tests/user-password-encryption-isolation.test.js +0 -237
  163. package/user/tests/user-password-hashing.test.js +0 -235
@@ -1,348 +0,0 @@
1
- /**
2
- * Verification Test: Repository Fix for MongoDB Decryption Bug
3
- *
4
- * This test verifies that the fix in ModuleRepositoryMongo successfully
5
- * decrypts credentials when fetching entities (after removing `include`).
6
- *
7
- * Expected Behavior After Fix:
8
- * - All repository methods should return decrypted credentials
9
- * - No encrypted tokens should leak through to the application layer
10
- */
11
-
12
- process.env.DB_TYPE = 'mongodb';
13
- process.env.DATABASE_URL = process.env.DATABASE_URL || 'mongodb://localhost:27017/frigg?replicaSet=rs0';
14
- process.env.STAGE = 'integration-test';
15
- process.env.AES_KEY_ID = 'test-key-id';
16
- process.env.AES_KEY = 'test-aes-key-32-characters-long!';
17
-
18
- jest.mock('../config', () => ({
19
- DB_TYPE: 'mongodb',
20
- getDatabaseType: jest.fn(() => 'mongodb'),
21
- PRISMA_LOG_LEVEL: 'error,warn',
22
- PRISMA_QUERY_LOGGING: false,
23
- }));
24
-
25
- const { prisma, connectPrisma, disconnectPrisma } = require('../prisma');
26
- const { ModuleRepositoryMongo } = require('../../modules/repositories/module-repository-mongo');
27
-
28
- describe('Repository Fix Verification - MongoDB Decryption', () => {
29
- let repository;
30
- let testCredentialId;
31
- let testEntityId;
32
- let testUserId;
33
- const TEST_TOKEN = 'my-secret-access-token-12345';
34
- const TEST_REFRESH_TOKEN = 'my-secret-refresh-token-67890';
35
- const TEST_DOMAIN = 'example-test.com';
36
-
37
- beforeAll(async () => {
38
- await connectPrisma();
39
- repository = new ModuleRepositoryMongo();
40
- });
41
-
42
- afterAll(async () => {
43
- if (testEntityId) {
44
- await prisma.entity.deleteMany({
45
- where: { id: testEntityId }
46
- }).catch(() => {});
47
- }
48
- if (testCredentialId) {
49
- await prisma.credential.deleteMany({
50
- where: { id: testCredentialId }
51
- }).catch(() => {});
52
- }
53
- if (testUserId) {
54
- await prisma.user.deleteMany({
55
- where: { id: testUserId }
56
- }).catch(() => {});
57
- }
58
-
59
- await disconnectPrisma();
60
- });
61
-
62
- afterEach(async () => {
63
- if (testEntityId) {
64
- await prisma.entity.deleteMany({
65
- where: { id: testEntityId }
66
- }).catch(() => {});
67
- testEntityId = null;
68
- }
69
- if (testCredentialId) {
70
- await prisma.credential.deleteMany({
71
- where: { id: testCredentialId }
72
- }).catch(() => {});
73
- testCredentialId = null;
74
- }
75
- if (testUserId) {
76
- await prisma.user.deleteMany({
77
- where: { id: testUserId }
78
- }).catch(() => {});
79
- testUserId = null;
80
- }
81
- });
82
-
83
- test('✅ FIX VERIFICATION: findEntityById returns decrypted credential', async () => {
84
- const user = await prisma.user.create({
85
- data: {
86
- type: 'INDIVIDUAL',
87
- hashword: 'test-hash'
88
- }
89
- });
90
- testUserId = user.id;
91
-
92
- const credential = await prisma.credential.create({
93
- data: {
94
- userId: testUserId,
95
- externalId: 'test-cred-findEntityById',
96
- data: {
97
- access_token: TEST_TOKEN,
98
- refresh_token: TEST_REFRESH_TOKEN,
99
- domain: TEST_DOMAIN,
100
- },
101
- },
102
- });
103
- testCredentialId = credential.id;
104
-
105
- const entity = await prisma.entity.create({
106
- data: {
107
- userId: testUserId,
108
- credentialId: testCredentialId,
109
- moduleName: 'test-module',
110
- externalId: 'test-entity-findById',
111
- },
112
- });
113
- testEntityId = entity.id;
114
-
115
- const result = await repository.findEntityById(testEntityId);
116
-
117
- expect(result).toBeDefined();
118
- expect(result.credential).toBeDefined();
119
- expect(result.credential.data.access_token).toBe(TEST_TOKEN);
120
- expect(result.credential.data.refresh_token).toBe(TEST_REFRESH_TOKEN);
121
- expect(result.credential.data.domain).toBe(TEST_DOMAIN);
122
-
123
- expect(result.credential.data.access_token).not.toContain(':');
124
-
125
- console.log('✅ findEntityById: Credential successfully decrypted!');
126
- });
127
-
128
- test('✅ FIX VERIFICATION: findEntitiesByUserId returns decrypted credentials', async () => {
129
- const user = await prisma.user.create({
130
- data: {
131
- type: 'INDIVIDUAL',
132
- hashword: 'test-hash'
133
- }
134
- });
135
- testUserId = user.id;
136
-
137
- const credential = await prisma.credential.create({
138
- data: {
139
- userId: testUserId,
140
- externalId: 'test-cred-findByUserId',
141
- data: {
142
- access_token: TEST_TOKEN,
143
- domain: TEST_DOMAIN,
144
- },
145
- },
146
- });
147
- testCredentialId = credential.id;
148
-
149
- const entity = await prisma.entity.create({
150
- data: {
151
- userId: testUserId,
152
- credentialId: testCredentialId,
153
- moduleName: 'test-module',
154
- externalId: 'test-entity-findByUserId',
155
- },
156
- });
157
- testEntityId = entity.id;
158
-
159
- const results = await repository.findEntitiesByUserId(testUserId);
160
-
161
- expect(results).toBeDefined();
162
- expect(results.length).toBeGreaterThan(0);
163
- const firstEntity = results[0];
164
- expect(firstEntity.credential).toBeDefined();
165
- expect(firstEntity.credential.data.access_token).toBe(TEST_TOKEN);
166
- expect(firstEntity.credential.data.access_token).not.toContain(':');
167
-
168
- console.log('✅ findEntitiesByUserId: Credentials successfully decrypted!');
169
- });
170
-
171
- test('✅ FIX VERIFICATION: findEntitiesByIds returns decrypted credentials', async () => {
172
- const user = await prisma.user.create({
173
- data: {
174
- type: 'INDIVIDUAL',
175
- hashword: 'test-hash'
176
- }
177
- });
178
- testUserId = user.id;
179
-
180
- const credential = await prisma.credential.create({
181
- data: {
182
- userId: testUserId,
183
- externalId: 'test-cred-findByIds',
184
- data: {
185
- access_token: TEST_TOKEN,
186
- domain: TEST_DOMAIN,
187
- },
188
- },
189
- });
190
- testCredentialId = credential.id;
191
-
192
- const entity = await prisma.entity.create({
193
- data: {
194
- userId: testUserId,
195
- credentialId: testCredentialId,
196
- moduleName: 'test-module',
197
- externalId: 'test-entity-findByIds',
198
- },
199
- });
200
- testEntityId = entity.id;
201
-
202
- const results = await repository.findEntitiesByIds([testEntityId]);
203
-
204
- expect(results).toBeDefined();
205
- expect(results.length).toBe(1);
206
- expect(results[0].credential).toBeDefined();
207
- expect(results[0].credential.data.access_token).toBe(TEST_TOKEN);
208
- expect(results[0].credential.data.access_token).not.toContain(':');
209
-
210
- console.log('✅ findEntitiesByIds: Credentials successfully decrypted!');
211
- });
212
-
213
- test('✅ FIX VERIFICATION: createEntity returns decrypted credential', async () => {
214
- const user = await prisma.user.create({
215
- data: {
216
- type: 'INDIVIDUAL',
217
- hashword: 'test-hash'
218
- }
219
- });
220
- testUserId = user.id;
221
-
222
- const credential = await prisma.credential.create({
223
- data: {
224
- userId: testUserId,
225
- externalId: 'test-cred-create',
226
- data: {
227
- access_token: TEST_TOKEN,
228
- domain: TEST_DOMAIN,
229
- },
230
- },
231
- });
232
- testCredentialId = credential.id;
233
-
234
- const entity = await repository.createEntity({
235
- userId: testUserId,
236
- credentialId: testCredentialId,
237
- moduleName: 'test-module',
238
- externalId: 'test-entity-create',
239
- });
240
-
241
- testEntityId = entity.id;
242
-
243
- expect(entity).toBeDefined();
244
- expect(entity.credential).toBeDefined();
245
- expect(entity.credential.data.access_token).toBe(TEST_TOKEN);
246
- expect(entity.credential.data.access_token).not.toContain(':');
247
-
248
- console.log('✅ createEntity: Credential successfully decrypted!');
249
- });
250
-
251
- test('✅ FIX VERIFICATION: updateEntity returns decrypted credential', async () => {
252
- const user = await prisma.user.create({
253
- data: {
254
- type: 'INDIVIDUAL',
255
- hashword: 'test-hash'
256
- }
257
- });
258
- testUserId = user.id;
259
-
260
- const credential = await prisma.credential.create({
261
- data: {
262
- userId: testUserId,
263
- externalId: 'test-cred-update',
264
- data: {
265
- access_token: TEST_TOKEN,
266
- domain: TEST_DOMAIN,
267
- },
268
- },
269
- });
270
- testCredentialId = credential.id;
271
-
272
- const entity = await prisma.entity.create({
273
- data: {
274
- userId: testUserId,
275
- credentialId: testCredentialId,
276
- moduleName: 'test-module',
277
- externalId: 'test-entity-update',
278
- },
279
- });
280
- testEntityId = entity.id;
281
-
282
- const updated = await repository.updateEntity(testEntityId, {
283
- name: 'Updated Name',
284
- });
285
-
286
- expect(updated).toBeDefined();
287
- expect(updated.name).toBe('Updated Name');
288
- expect(updated.credential).toBeDefined();
289
- expect(updated.credential.data.access_token).toBe(TEST_TOKEN);
290
- expect(updated.credential.data.access_token).not.toContain(':');
291
-
292
- console.log('✅ updateEntity: Credential successfully decrypted!');
293
- });
294
-
295
- test('📊 COMPARISON: Verify tokens are encrypted in database but decrypted in repository', async () => {
296
- const user = await prisma.user.create({
297
- data: {
298
- type: 'INDIVIDUAL',
299
- hashword: 'test-hash'
300
- }
301
- });
302
- testUserId = user.id;
303
-
304
- const credential = await prisma.credential.create({
305
- data: {
306
- userId: testUserId,
307
- externalId: 'test-cred-comparison',
308
- data: {
309
- access_token: TEST_TOKEN,
310
- domain: TEST_DOMAIN,
311
- },
312
- },
313
- });
314
- testCredentialId = credential.id;
315
-
316
- const entity = await prisma.entity.create({
317
- data: {
318
- userId: testUserId,
319
- credentialId: testCredentialId,
320
- moduleName: 'test-module',
321
- externalId: 'test-entity-comparison',
322
- },
323
- });
324
- testEntityId = entity.id;
325
-
326
- const rawCred = await prisma.$runCommandRaw({
327
- find: 'Credential',
328
- filter: { _id: { $oid: testCredentialId } }
329
- });
330
- const rawDoc = rawCred.cursor.firstBatch[0];
331
- const rawToken = rawDoc.data.access_token;
332
-
333
- const repoEntity = await repository.findEntityById(testEntityId);
334
- const repoToken = repoEntity.credential.data.access_token;
335
-
336
- console.log('\n📊 COMPARISON RESULTS:');
337
- console.log('Raw DB token (encrypted):', rawToken.substring(0, 50) + '...');
338
- console.log('Repository token (decrypted):', repoToken);
339
-
340
- expect(rawToken).toContain(':');
341
- expect(rawToken.split(':')).toHaveLength(4);
342
-
343
- expect(repoToken).toBe(TEST_TOKEN);
344
- expect(repoToken).not.toContain(':');
345
-
346
- console.log('✅ Database stores encrypted, repository returns decrypted - FIX WORKS!');
347
- });
348
- });