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

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
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Trigger Database Migration Use Case
3
+ *
4
+ * Business logic for triggering async database migrations via SQS queue.
5
+ * Creates a Process record for tracking and sends migration job to queue.
6
+ *
7
+ * This use case follows the Frigg hexagonal architecture pattern where:
8
+ * - Routers (adapters) call use cases
9
+ * - Use cases contain business logic and orchestration
10
+ * - Use cases call repositories for data access
11
+ * - Use cases delegate infrastructure concerns (SQS) to utilities
12
+ *
13
+ * Flow:
14
+ * 1. Validate migration parameters
15
+ * 2. Create Process record (state: INITIALIZING)
16
+ * 3. Send message to SQS queue (fire-and-forget)
17
+ * 4. Return process info immediately (async pattern)
18
+ */
19
+
20
+ const { QueuerUtil } = require('../../queues/queuer-util');
21
+
22
+ class TriggerDatabaseMigrationUseCase {
23
+ /**
24
+ * @param {Object} dependencies
25
+ * @param {Object} dependencies.migrationStatusRepository - Repository for migration status (S3)
26
+ * @param {Object} [dependencies.queuerUtil] - SQS utility (injectable for testing)
27
+ */
28
+ constructor({ migrationStatusRepository, queuerUtil = QueuerUtil }) {
29
+ if (!migrationStatusRepository) {
30
+ throw new Error('migrationStatusRepository dependency is required');
31
+ }
32
+ this.migrationStatusRepository = migrationStatusRepository;
33
+ this.queuerUtil = queuerUtil;
34
+ }
35
+
36
+ /**
37
+ * Execute database migration trigger
38
+ *
39
+ * @param {Object} params
40
+ * @param {string} params.userId - User ID triggering the migration
41
+ * @param {string} params.dbType - Database type ('postgresql' or 'mongodb')
42
+ * @param {string} params.stage - Deployment stage (determines migration command)
43
+ * @returns {Promise<Object>} Process info { success, processId, state, statusUrl, message }
44
+ * @throws {ValidationError} If parameters are invalid
45
+ * @throws {Error} If process creation or queue send fails
46
+ */
47
+ async execute({ userId, dbType, stage }) {
48
+ // Validation
49
+ this._validateParams({ userId, dbType, stage });
50
+
51
+ // Create migration status in S3 (no User table dependency)
52
+ const migrationStatus = await this.migrationStatusRepository.create({
53
+ stage: stage || process.env.STAGE || 'production',
54
+ triggeredBy: userId || 'system',
55
+ triggeredAt: new Date().toISOString(),
56
+ });
57
+
58
+ console.log(`Created migration status: ${migrationStatus.migrationId}`);
59
+
60
+ // Get queue URL from environment
61
+ const queueUrl = process.env.DB_MIGRATION_QUEUE_URL;
62
+ if (!queueUrl) {
63
+ throw new Error(
64
+ 'DB_MIGRATION_QUEUE_URL environment variable is not set. ' +
65
+ 'Cannot send migration to queue.'
66
+ );
67
+ }
68
+
69
+ // Send message to SQS queue (async fire-and-forget)
70
+ try {
71
+ await this.queuerUtil.send(
72
+ {
73
+ migrationId: migrationStatus.migrationId,
74
+ dbType,
75
+ stage,
76
+ },
77
+ queueUrl
78
+ );
79
+
80
+ console.log(`Sent migration job to queue: ${migrationStatus.migrationId}`);
81
+ } catch (error) {
82
+ console.error(`Failed to send migration to queue:`, error);
83
+
84
+ // Update migration status to FAILED
85
+ await this.migrationStatusRepository.update({
86
+ migrationId: migrationStatus.migrationId,
87
+ stage: migrationStatus.stage,
88
+ state: 'FAILED',
89
+ error: `Failed to queue migration: ${error.message}`,
90
+ });
91
+
92
+ throw new Error(
93
+ `Failed to queue migration: ${error.message}`
94
+ );
95
+ }
96
+
97
+ // Return migration info immediately (don't wait for migration completion)
98
+ return {
99
+ success: true,
100
+ migrationId: migrationStatus.migrationId,
101
+ state: migrationStatus.state,
102
+ statusUrl: `/db-migrate/${migrationStatus.migrationId}`,
103
+ s3Key: `migrations/${migrationStatus.stage}/${migrationStatus.migrationId}.json`,
104
+ message: 'Database migration queued successfully',
105
+ };
106
+ }
107
+
108
+ /**
109
+ * Validate execution parameters
110
+ * @private
111
+ */
112
+ _validateParams({ userId, dbType, stage }) {
113
+ // userId is optional for system migrations
114
+ if (userId && typeof userId !== 'string') {
115
+ throw new ValidationError('userId must be a string');
116
+ }
117
+
118
+ if (!dbType) {
119
+ throw new ValidationError('dbType is required');
120
+ }
121
+
122
+ if (typeof dbType !== 'string') {
123
+ throw new ValidationError('dbType must be a string');
124
+ }
125
+
126
+ const validDbTypes = ['postgresql', 'mongodb'];
127
+ if (!validDbTypes.includes(dbType)) {
128
+ throw new ValidationError(
129
+ `Invalid dbType: "${dbType}". Must be one of: ${validDbTypes.join(', ')}`
130
+ );
131
+ }
132
+
133
+ if (!stage) {
134
+ throw new ValidationError('stage is required');
135
+ }
136
+
137
+ if (typeof stage !== 'string') {
138
+ throw new ValidationError('stage must be a string');
139
+ }
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Custom error for validation failures
145
+ */
146
+ class ValidationError extends Error {
147
+ constructor(message) {
148
+ super(message);
149
+ this.name = 'ValidationError';
150
+ }
151
+ }
152
+
153
+ module.exports = {
154
+ TriggerDatabaseMigrationUseCase,
155
+ ValidationError,
156
+ };
157
+
@@ -0,0 +1,91 @@
1
+ /**
2
+ * MongoDB Collection Utilities
3
+ *
4
+ * Provides utilities for managing MongoDB collections, particularly for
5
+ * handling the constraint that collections cannot be created inside
6
+ * multi-document transactions.
7
+ *
8
+ * @see https://github.com/prisma/prisma/issues/8305
9
+ * @see https://www.mongodb.com/docs/manual/core/transactions/#transactions-and-operations
10
+ */
11
+
12
+ const { mongoose } = require('../mongoose');
13
+
14
+ /**
15
+ * Ensures a MongoDB collection exists
16
+ *
17
+ * MongoDB doesn't allow creating collections (namespaces) inside multi-document
18
+ * transactions. This function checks if a collection exists and creates it if needed,
19
+ * preventing "Cannot create namespace in multi-document transaction" errors.
20
+ *
21
+ * @param {string} collectionName - Name of the collection to ensure exists
22
+ * @returns {Promise<void>}
23
+ *
24
+ * @example
25
+ * ```js
26
+ * await ensureCollectionExists('Credential');
27
+ * // Now safe to create documents in Credential collection
28
+ * await prisma.credential.create({ data: {...} });
29
+ * ```
30
+ */
31
+ async function ensureCollectionExists(collectionName) {
32
+ try {
33
+ const collections = await mongoose.connection.db
34
+ .listCollections({ name: collectionName })
35
+ .toArray();
36
+
37
+ if (collections.length === 0) {
38
+ // Collection doesn't exist, create it outside of any transaction
39
+ await mongoose.connection.db.createCollection(collectionName);
40
+ console.log(`Created MongoDB collection: ${collectionName}`);
41
+ }
42
+ } catch (error) {
43
+ // Collection might already exist due to race condition, or other error
44
+ // Log warning but don't fail - let subsequent operations handle errors
45
+ if (error.codeName === 'NamespaceExists') {
46
+ // This is expected in race conditions, silently continue
47
+ return;
48
+ }
49
+ console.warn(`Error ensuring collection ${collectionName} exists:`, error.message);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Ensures multiple MongoDB collections exist
55
+ *
56
+ * @param {string[]} collectionNames - Array of collection names to ensure exist
57
+ * @returns {Promise<void>}
58
+ *
59
+ * @example
60
+ * ```js
61
+ * await ensureCollectionsExist(['Credential', 'User', 'Token']);
62
+ * ```
63
+ */
64
+ async function ensureCollectionsExist(collectionNames) {
65
+ await Promise.all(collectionNames.map(name => ensureCollectionExists(name)));
66
+ }
67
+
68
+ /**
69
+ * Checks if a collection exists in MongoDB
70
+ *
71
+ * @param {string} collectionName - Name of the collection to check
72
+ * @returns {Promise<boolean>} True if collection exists, false otherwise
73
+ */
74
+ async function collectionExists(collectionName) {
75
+ try {
76
+ const collections = await mongoose.connection.db
77
+ .listCollections({ name: collectionName })
78
+ .toArray();
79
+
80
+ return collections.length > 0;
81
+ } catch (error) {
82
+ console.error(`Error checking if collection ${collectionName} exists:`, error.message);
83
+ return false;
84
+ }
85
+ }
86
+
87
+ module.exports = {
88
+ ensureCollectionExists,
89
+ ensureCollectionsExist,
90
+ collectionExists,
91
+ };
@@ -0,0 +1,106 @@
1
+ /**
2
+ * MongoDB Schema Initialization for Prisma
3
+ *
4
+ * Dynamically parses the Prisma schema and ensures all collections exist before
5
+ * the application starts handling requests. This prevents
6
+ * "Cannot create namespace in multi-document transaction" errors.
7
+ *
8
+ * MongoDB does not allow creating collections inside transactions.
9
+ * By pre-creating all collections at startup, we ensure all Prisma
10
+ * operations can safely use transactions without namespace creation errors.
11
+ *
12
+ * Collection names are extracted dynamically from the Prisma schema file,
13
+ * ensuring they stay in sync with schema changes without manual updates.
14
+ *
15
+ * @see https://github.com/prisma/prisma/issues/8305
16
+ * @see https://www.mongodb.com/docs/manual/core/transactions/#transactions-and-operations
17
+ */
18
+
19
+ const { mongoose } = require('../mongoose');
20
+ const { ensureCollectionsExist } = require('./mongodb-collection-utils');
21
+ const { getCollectionsFromSchemaSync } = require('./prisma-schema-parser');
22
+ const config = require('../config');
23
+
24
+ /**
25
+ * Initialize MongoDB schema by ensuring all collections exist
26
+ *
27
+ * This should be called once at application startup, after the database
28
+ * connection is established but before handling any requests.
29
+ *
30
+ * Dynamically parses the Prisma schema to extract collection names,
31
+ * ensuring automatic sync with schema changes.
32
+ *
33
+ * Benefits:
34
+ * - Prevents transaction namespace creation errors
35
+ * - Fails fast if there are database connection issues
36
+ * - Ensures consistent state across all instances
37
+ * - Idempotent - safe to run multiple times
38
+ * - Automatically syncs with Prisma schema changes
39
+ *
40
+ * @returns {Promise<void>}
41
+ *
42
+ * @example
43
+ * ```js
44
+ * await connectPrisma();
45
+ * await initializeMongoDBSchema(); // Run after connection
46
+ * // Now safe to handle requests
47
+ * ```
48
+ */
49
+ async function initializeMongoDBSchema() {
50
+ // Only run for MongoDB
51
+ if (config.DB_TYPE !== 'mongodb') {
52
+ console.log('Schema initialization skipped - not using MongoDB');
53
+ return;
54
+ }
55
+
56
+ // Check if database is connected
57
+ if (mongoose.connection.readyState !== 1) {
58
+ throw new Error(
59
+ 'Cannot initialize MongoDB schema - database not connected. ' +
60
+ 'Call connectPrisma() before initializeMongoDBSchema()'
61
+ );
62
+ }
63
+
64
+ console.log('Initializing MongoDB schema - ensuring all collections exist...');
65
+ const startTime = Date.now();
66
+
67
+ try {
68
+ // Dynamically parse Prisma schema to get collection names
69
+ const collections = getCollectionsFromSchemaSync();
70
+
71
+ if (collections.length === 0) {
72
+ console.warn('No collections found in Prisma schema - skipping initialization');
73
+ return;
74
+ }
75
+
76
+ await ensureCollectionsExist(collections);
77
+
78
+ const duration = Date.now() - startTime;
79
+ console.log(
80
+ `MongoDB schema initialization complete - ${collections.length} collections verified (${duration}ms)`
81
+ );
82
+ } catch (error) {
83
+ console.error('Failed to initialize MongoDB schema:', error.message);
84
+ throw error;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Get list of Prisma collection names by parsing the schema
90
+ * Useful for testing and introspection
91
+ *
92
+ * @returns {string[]} Array of collection names from Prisma schema
93
+ */
94
+ function getPrismaCollections() {
95
+ try {
96
+ return getCollectionsFromSchemaSync();
97
+ } catch (error) {
98
+ console.warn('Could not parse Prisma collections:', error.message);
99
+ return [];
100
+ }
101
+ }
102
+
103
+ module.exports = {
104
+ initializeMongoDBSchema,
105
+ getPrismaCollections,
106
+ };