@friggframework/core 2.0.0--canary.548.c8ae0ca.0 → 2.0.0--canary.545.c40eca4.0

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 (237) hide show
  1. package/CHANGELOG.md +66 -67
  2. package/CLAUDE.md +148 -124
  3. package/README.md +165 -130
  4. package/admin-scripts/index.js +52 -0
  5. package/admin-scripts/repositories/admin-api-key-repository-documentdb.js +21 -0
  6. package/admin-scripts/repositories/admin-api-key-repository-factory.js +51 -0
  7. package/admin-scripts/repositories/admin-api-key-repository-interface.js +121 -0
  8. package/admin-scripts/repositories/admin-api-key-repository-mongo.js +155 -0
  9. package/admin-scripts/repositories/admin-api-key-repository-postgres.js +189 -0
  10. package/admin-scripts/repositories/admin-process-repository-documentdb.js +21 -0
  11. package/admin-scripts/repositories/admin-process-repository-factory.js +49 -0
  12. package/admin-scripts/repositories/admin-process-repository-interface.js +150 -0
  13. package/admin-scripts/repositories/admin-process-repository-mongo.js +213 -0
  14. package/admin-scripts/repositories/admin-process-repository-postgres.js +251 -0
  15. package/admin-scripts/repositories/script-execution-repository-documentdb.js +21 -0
  16. package/admin-scripts/repositories/script-execution-repository-factory.js +51 -0
  17. package/admin-scripts/repositories/script-execution-repository-interface.js +193 -0
  18. package/admin-scripts/repositories/script-execution-repository-mongo.js +278 -0
  19. package/admin-scripts/repositories/script-execution-repository-postgres.js +320 -0
  20. package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
  21. package/admin-scripts/repositories/script-schedule-repository-factory.js +49 -0
  22. package/admin-scripts/repositories/script-schedule-repository-interface.js +108 -0
  23. package/admin-scripts/repositories/script-schedule-repository-mongo.js +179 -0
  24. package/admin-scripts/repositories/script-schedule-repository-postgres.js +210 -0
  25. package/application/commands/admin-script-commands.js +348 -0
  26. package/application/commands/integration-commands.js +12 -6
  27. package/application/index.js +5 -3
  28. package/assertions/get.js +17 -7
  29. package/associations/association.js +59 -57
  30. package/core/CLAUDE.md +222 -156
  31. package/core/Worker.js +33 -12
  32. package/credential/credential-router.js +262 -0
  33. package/credential/repositories/credential-repository-documentdb.js +71 -1
  34. package/credential/repositories/credential-repository-factory.js +4 -6
  35. package/credential/repositories/credential-repository-interface.js +8 -2
  36. package/credential/repositories/credential-repository-mongo.js +45 -4
  37. package/credential/repositories/credential-repository-postgres.js +44 -3
  38. package/credential/repositories/credential-repository.js +3 -1
  39. package/credential/use-cases/delete-credential-for-user.js +50 -0
  40. package/credential/use-cases/get-credential-for-user.js +21 -3
  41. package/credential/use-cases/list-credentials-for-user.js +31 -0
  42. package/credential/use-cases/reauthorize-credential.js +103 -0
  43. package/credential/use-cases/update-authentication-status.js +5 -2
  44. package/database/MONGODB_TRANSACTION_FIX.md +72 -52
  45. package/database/config.js +13 -59
  46. package/database/documentdb-encryption-service.js +29 -13
  47. package/database/documentdb-utils.js +21 -12
  48. package/database/encryption/README.md +53 -36
  49. package/database/encryption/encryption-schema-registry.js +29 -23
  50. package/database/encryption/field-encryption-service.js +15 -4
  51. package/database/encryption/logger.js +3 -2
  52. package/database/encryption/prisma-encryption-extension.js +5 -8
  53. package/database/prisma.js +22 -14
  54. package/database/repositories/health-check-repository-factory.js +7 -5
  55. package/database/repositories/health-check-repository-interface.js +15 -5
  56. package/database/repositories/health-check-repository-postgres.js +1 -1
  57. package/database/use-cases/check-database-health-use-case.js +3 -2
  58. package/database/use-cases/check-database-state-use-case.js +8 -7
  59. package/database/use-cases/get-database-state-via-worker-use-case.js +15 -12
  60. package/database/use-cases/get-migration-status-use-case.js +4 -2
  61. package/database/use-cases/run-database-migration-use-case.js +41 -9
  62. package/database/use-cases/test-encryption-use-case.js +4 -5
  63. package/database/use-cases/trigger-database-migration-use-case.js +9 -8
  64. package/database/utils/mongodb-collection-utils.js +11 -3
  65. package/database/utils/mongodb-schema-init.js +10 -4
  66. package/database/utils/prisma-runner.js +144 -74
  67. package/database/utils/prisma-schema-parser.js +2 -2
  68. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +135 -80
  69. package/encrypt/Cryptor.js +54 -49
  70. package/encrypt/aes-encryption-key-provider.js +82 -0
  71. package/encrypt/encryption-key-provider-interface.js +50 -0
  72. package/errors/fetch-error.js +1 -1
  73. package/generated/prisma-mongodb/edge.js +59 -4
  74. package/generated/prisma-mongodb/index-browser.js +49 -1
  75. package/generated/prisma-mongodb/index.d.ts +4023 -61
  76. package/generated/prisma-mongodb/index.js +59 -4
  77. package/generated/prisma-mongodb/package.json +1 -1
  78. package/generated/prisma-mongodb/schema.prisma +87 -0
  79. package/generated/prisma-mongodb/wasm.js +59 -4
  80. package/generated/prisma-postgresql/edge.js +58 -4
  81. package/generated/prisma-postgresql/index-browser.js +48 -1
  82. package/generated/prisma-postgresql/index.d.ts +4738 -54
  83. package/generated/prisma-postgresql/index.js +58 -4
  84. package/generated/prisma-postgresql/package.json +1 -1
  85. package/generated/prisma-postgresql/schema.prisma +85 -0
  86. package/generated/prisma-postgresql/wasm.js +58 -4
  87. package/handlers/WEBHOOKS.md +104 -81
  88. package/handlers/app-definition-loader.js +53 -10
  89. package/handlers/app-handler-helpers.js +14 -3
  90. package/handlers/backend-utils.js +0 -1
  91. package/handlers/database-migration-handler.js +64 -45
  92. package/handlers/middleware/admin-auth.js +53 -0
  93. package/handlers/routers/HEALTHCHECK.md +170 -135
  94. package/handlers/routers/admin.js +474 -0
  95. package/handlers/routers/auth.js +51 -9
  96. package/handlers/routers/db-migration.handler.js +2 -3
  97. package/handlers/routers/db-migration.js +102 -66
  98. package/handlers/routers/docs.js +180 -0
  99. package/handlers/routers/health.js +84 -283
  100. package/handlers/routers/integration-defined-routers.js +44 -33
  101. package/handlers/routers/integration-webhook-routers.js +73 -52
  102. package/handlers/routers/middleware/loadUser.js +39 -0
  103. package/handlers/routers/middleware/requireAdmin.js +43 -0
  104. package/handlers/routers/middleware/requireLoggedInUser.js +19 -0
  105. package/handlers/routers/user.js +30 -14
  106. package/handlers/routers/websocket.js +18 -4
  107. package/handlers/use-cases/check-integrations-health-use-case.js +13 -6
  108. package/handlers/workers/db-migration.js +74 -35
  109. package/handlers/workers/integration-defined-workers.js +31 -20
  110. package/index.js +50 -16
  111. package/infrastructure/scheduler/index.js +15 -11
  112. package/infrastructure/scheduler/netlify-scheduler-adapter.js +185 -0
  113. package/infrastructure/scheduler/scheduler-service-factory.js +38 -31
  114. package/integrations/WEBHOOK-QUICKSTART.md +21 -14
  115. package/integrations/index.js +4 -0
  116. package/integrations/integration-base.js +9 -6
  117. package/integrations/integration-router.js +1828 -157
  118. package/integrations/options.js +47 -20
  119. package/integrations/repositories/integration-mapping-repository-factory.js +4 -8
  120. package/integrations/repositories/integration-repository-documentdb.js +53 -24
  121. package/integrations/repositories/integration-repository-factory.js +6 -6
  122. package/integrations/repositories/integration-repository-interface.js +27 -9
  123. package/integrations/repositories/integration-repository-postgres.js +3 -3
  124. package/integrations/repositories/process-repository-factory.js +4 -7
  125. package/integrations/repositories/process-repository-interface.js +9 -5
  126. package/integrations/repositories/process-repository-mongo.js +7 -3
  127. package/integrations/repositories/process-repository-postgres.js +2 -2
  128. package/integrations/tests/doubles/config-capturing-integration.js +9 -8
  129. package/integrations/tests/doubles/dummy-integration-class.js +81 -8
  130. package/integrations/tests/doubles/test-integration-repository.js +51 -11
  131. package/integrations/use-cases/create-integration.js +36 -32
  132. package/integrations/use-cases/create-process.js +20 -9
  133. package/integrations/use-cases/delete-integration-for-user.js +5 -4
  134. package/integrations/use-cases/execute-proxy-request.js +564 -0
  135. package/integrations/use-cases/get-integration-for-user.js +25 -10
  136. package/integrations/use-cases/get-integration-instance-by-definition.js +13 -7
  137. package/integrations/use-cases/get-integrations-for-user.js +4 -1
  138. package/integrations/use-cases/get-possible-integrations.js +1 -1
  139. package/integrations/use-cases/get-process.js +5 -6
  140. package/integrations/use-cases/index.js +3 -1
  141. package/integrations/use-cases/load-integration-context.js +1 -5
  142. package/integrations/use-cases/update-process-state.js +10 -8
  143. package/integrations/utils/map-integration-dto.js +9 -3
  144. package/jest-setup.js +1 -1
  145. package/jest-teardown.js +1 -1
  146. package/lambda/TimeoutCatcher.js +32 -30
  147. package/lambda/index.js +1 -1
  148. package/logs/index.js +3 -3
  149. package/modules/domain/entities/AuthorizationSession.js +131 -0
  150. package/modules/domain/entities/index.js +10 -0
  151. package/modules/module.js +4 -9
  152. package/modules/repositories/authorization-session-repository-factory.js +53 -0
  153. package/modules/repositories/authorization-session-repository-interface.js +75 -0
  154. package/modules/repositories/authorization-session-repository-mongo.js +169 -0
  155. package/modules/repositories/authorization-session-repository-postgres.js +170 -0
  156. package/modules/repositories/module-repository-documentdb.js +89 -41
  157. package/modules/repositories/module-repository-factory.js +4 -6
  158. package/modules/repositories/module-repository-interface.js +13 -0
  159. package/modules/repositories/module-repository-mongo.js +40 -5
  160. package/modules/repositories/module-repository-postgres.js +42 -5
  161. package/modules/repositories/module-repository.js +28 -0
  162. package/modules/requester/api-key.js +0 -2
  163. package/modules/requester/basic.js +0 -1
  164. package/modules/requester/oauth-2.js +3 -14
  165. package/modules/test/mock-api/definition.js +15 -10
  166. package/modules/test/mock-api/mocks/hubspot.js +36 -36
  167. package/modules/tests/doubles/test-module-factory.js +10 -4
  168. package/modules/tests/doubles/test-module-repository.js +1 -1
  169. package/modules/use-cases/delete-module-entity.js +23 -0
  170. package/modules/use-cases/get-authorization-requirements.js +110 -0
  171. package/modules/use-cases/get-entities-for-user.js +1 -1
  172. package/modules/use-cases/get-entity-options-by-id.js +8 -6
  173. package/modules/use-cases/get-module-entity-by-id.js +16 -0
  174. package/modules/use-cases/get-module.js +12 -9
  175. package/modules/use-cases/process-authorization-callback.js +12 -6
  176. package/modules/use-cases/process-authorization-step.js +160 -0
  177. package/modules/use-cases/refresh-entity-options.js +8 -6
  178. package/modules/use-cases/start-authorization-session.js +86 -0
  179. package/modules/use-cases/test-module-auth.js +8 -6
  180. package/modules/use-cases/update-module-entity.js +27 -0
  181. package/modules/utils/map-module-dto.js +2 -2
  182. package/openapi/openapi-spec-generator.js +370 -0
  183. package/openapi/openapi-v1.yaml +1360 -0
  184. package/openapi/openapi-v2.yaml +1535 -0
  185. package/package.json +7 -9
  186. package/prisma-mongodb/schema.prisma +87 -0
  187. package/prisma-postgresql/migrations/20260222000000_add_admin_process_and_script_schedule/migration.sql +55 -0
  188. package/prisma-postgresql/schema.prisma +85 -0
  189. package/providers/index.js +13 -0
  190. package/providers/resolve-provider.js +93 -0
  191. package/queues/index.js +19 -0
  192. package/queues/providers/index.js +7 -0
  193. package/queues/providers/netlify-background-provider.js +76 -0
  194. package/queues/providers/qstash-queue-provider.js +122 -0
  195. package/queues/queue-client-interface.js +55 -0
  196. package/queues/queue-provider-factory.js +93 -0
  197. package/queues/queue-provider.js +46 -0
  198. package/queues/queuer-util.js +33 -25
  199. package/syncs/repositories/sync-repository-documentdb.js +39 -19
  200. package/syncs/repositories/sync-repository-factory.js +4 -4
  201. package/syncs/repositories/sync-repository-interface.js +6 -2
  202. package/syncs/repositories/sync-repository-postgres.js +19 -13
  203. package/syncs/sync.js +104 -100
  204. package/token/repositories/token-repository-factory.js +4 -6
  205. package/types/assertions/index.d.ts +72 -72
  206. package/types/core/index.d.ts +98 -53
  207. package/types/errors/index.d.ts +61 -54
  208. package/types/eslint-config/index.d.ts +40 -40
  209. package/types/lambda/index.d.ts +26 -26
  210. package/types/logs/index.d.ts +4 -4
  211. package/types/prettier-config/index.d.ts +5 -5
  212. package/types/test-environment/index.d.ts +14 -14
  213. package/types/tsconfig.json +95 -93
  214. package/user/repositories/user-repository-factory.js +4 -4
  215. package/user/tests/doubles/test-user-repository.js +5 -2
  216. package/user/use-cases/authenticate-user.js +2 -4
  217. package/user/use-cases/authenticate-with-shared-secret.js +1 -1
  218. package/user/use-cases/create-individual-user.js +8 -7
  219. package/user/use-cases/create-organization-user.js +1 -1
  220. package/user/use-cases/create-token-for-user-id.js +1 -1
  221. package/user/use-cases/delete-user.js +47 -0
  222. package/user/use-cases/get-user-from-adopter-jwt.js +0 -2
  223. package/user/use-cases/get-user-from-bearer-token.js +7 -3
  224. package/user/use-cases/get-user-from-x-frigg-headers.js +14 -11
  225. package/user/use-cases/login-user.js +8 -8
  226. package/user/user.js +18 -4
  227. package/utils/backend-path.js +2 -2
  228. package/utils/index.js +4 -1
  229. package/websocket/repositories/websocket-connection-repository-documentdb.js +46 -21
  230. package/websocket/repositories/websocket-connection-repository-factory.js +4 -8
  231. package/websocket/repositories/websocket-connection-repository-mongo.js +26 -16
  232. package/websocket/repositories/websocket-connection-repository-postgres.js +26 -15
  233. package/websocket/repositories/websocket-connection-repository.js +26 -20
  234. package/websocket/websocket-message-sender-interface.js +38 -0
  235. package/database/adapters/lambda-invoker.js +0 -97
  236. package/database/repositories/migration-status-repository-s3.js +0 -137
  237. package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +0 -184
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Check Database State Use Case
3
- *
3
+ *
4
4
  * Domain logic for checking database state (pending migrations, errors, etc).
5
5
  * Does NOT trigger migrations, just reports current state.
6
- *
6
+ *
7
7
  * Architecture: Hexagonal/Clean
8
8
  * - Use Case (Domain Layer)
9
9
  * - Depends on prismaRunner (Infrastructure abstraction)
@@ -31,7 +31,7 @@ class CheckDatabaseStateUseCase {
31
31
 
32
32
  /**
33
33
  * Execute check migration status
34
- *
34
+ *
35
35
  * @param {string} dbType - Database type (postgresql, mongodb, or documentdb)
36
36
  * @param {string} stage - Deployment stage (default: 'production')
37
37
  * @returns {Promise<Object>} Migration status
@@ -43,7 +43,9 @@ class CheckDatabaseStateUseCase {
43
43
  }
44
44
 
45
45
  if (!['postgresql', 'mongodb', 'documentdb'].includes(dbType)) {
46
- throw new ValidationError('dbType must be postgresql, mongodb, or documentdb');
46
+ throw new ValidationError(
47
+ 'dbType must be postgresql, mongodb, or documentdb'
48
+ );
47
49
  }
48
50
 
49
51
  console.log(`Checking migration status for ${dbType} in ${stage}`);
@@ -62,12 +64,12 @@ class CheckDatabaseStateUseCase {
62
64
  // Add error if present
63
65
  if (state.error) {
64
66
  response.error = state.error;
65
- response.recommendation = 'Run POST /db-migrate to initialize database';
67
+ response.recommendation = 'Run POST /admin/db-migrate to initialize database';
66
68
  }
67
69
 
68
70
  // Add recommendation if migrations pending
69
71
  if (!state.upToDate && state.pendingMigrations > 0) {
70
- response.recommendation = `Run POST /db-migrate to apply ${state.pendingMigrations} pending migration(s)`;
72
+ response.recommendation = `Run POST /admin/db-migrate to apply ${state.pendingMigrations} pending migration(s)`;
71
73
  }
72
74
 
73
75
  return response;
@@ -78,4 +80,3 @@ module.exports = {
78
80
  CheckDatabaseStateUseCase,
79
81
  ValidationError,
80
82
  };
81
-
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Get Database State Via Worker Use Case
3
- *
3
+ *
4
4
  * Domain logic for getting database state by invoking the worker Lambda.
5
5
  * This use case delegates to the worker Lambda which has Prisma CLI installed,
6
6
  * keeping the router Lambda lightweight.
7
- *
7
+ *
8
8
  * Architecture: Hexagonal/Clean
9
9
  * - Use Case (Domain Layer)
10
10
  * - Depends on LambdaInvoker (Infrastructure abstraction)
@@ -13,7 +13,7 @@
13
13
 
14
14
  /**
15
15
  * Domain Use Case: Get database state by invoking worker Lambda
16
- *
16
+ *
17
17
  * This use case delegates database state checking to the worker Lambda,
18
18
  * which has Prisma CLI installed. Keeps the router Lambda lightweight.
19
19
  */
@@ -36,26 +36,29 @@ class GetDatabaseStateViaWorkerUseCase {
36
36
 
37
37
  /**
38
38
  * Execute database state check via worker Lambda
39
- *
39
+ *
40
40
  * @param {string} stage - Deployment stage (prod, dev, etc)
41
41
  * @returns {Promise<Object>} Database state result
42
42
  */
43
43
  async execute(stage = 'production') {
44
44
  const dbType = process.env.DB_TYPE || 'postgresql';
45
45
 
46
- console.log(`Invoking worker Lambda to check database state: ${this.workerFunctionName}`);
46
+ console.log(
47
+ `Invoking worker Lambda to check database state: ${this.workerFunctionName}`
48
+ );
47
49
 
48
50
  // Invoke worker Lambda with checkStatus action
49
- const result = await this.lambdaInvoker.invoke(this.workerFunctionName, {
50
- action: 'checkStatus',
51
- dbType,
52
- stage,
53
- });
51
+ const result = await this.lambdaInvoker.invoke(
52
+ this.workerFunctionName,
53
+ {
54
+ action: 'checkStatus',
55
+ dbType,
56
+ stage,
57
+ }
58
+ );
54
59
 
55
60
  return result;
56
61
  }
57
62
  }
58
63
 
59
64
  module.exports = { GetDatabaseStateViaWorkerUseCase };
60
-
61
-
@@ -39,7 +39,10 @@ class GetMigrationStatusUseCase {
39
39
 
40
40
  // Get migration status from S3
41
41
  try {
42
- const migrationStatus = await this.migrationStatusRepository.get(migrationId, effectiveStage);
42
+ const migrationStatus = await this.migrationStatusRepository.get(
43
+ migrationId,
44
+ effectiveStage
45
+ );
43
46
  return migrationStatus;
44
47
  } catch (error) {
45
48
  if (error.message.includes('not found')) {
@@ -90,4 +93,3 @@ module.exports = {
90
93
  ValidationError,
91
94
  NotFoundError,
92
95
  };
93
-
@@ -38,12 +38,22 @@ class RunDatabaseMigrationUseCase {
38
38
  this._validateParams({ dbType, stage });
39
39
 
40
40
  // Step 1: Generate Prisma client
41
- const generateResult = await this.prismaRunner.runPrismaGenerate(dbType, verbose);
41
+ const generateResult = await this.prismaRunner.runPrismaGenerate(
42
+ dbType,
43
+ verbose
44
+ );
42
45
 
43
46
  if (!generateResult.success) {
44
47
  throw new MigrationError(
45
- `Failed to generate Prisma client: ${generateResult.error || 'Unknown error'}`,
46
- { dbType, stage, step: 'generate', output: generateResult.output }
48
+ `Failed to generate Prisma client: ${
49
+ generateResult.error || 'Unknown error'
50
+ }`,
51
+ {
52
+ dbType,
53
+ stage,
54
+ step: 'generate',
55
+ output: generateResult.output,
56
+ }
47
57
  );
48
58
  }
49
59
 
@@ -53,23 +63,45 @@ class RunDatabaseMigrationUseCase {
53
63
 
54
64
  if (dbType === 'postgresql') {
55
65
  migrationCommand = this.prismaRunner.getMigrationCommand(stage);
56
- migrationResult = await this.prismaRunner.runPrismaMigrate(migrationCommand, verbose);
66
+ migrationResult = await this.prismaRunner.runPrismaMigrate(
67
+ migrationCommand,
68
+ verbose
69
+ );
57
70
 
58
71
  if (!migrationResult.success) {
59
72
  throw new MigrationError(
60
- `PostgreSQL migration failed: ${migrationResult.error || 'Unknown error'}`,
61
- { dbType, stage, command: migrationCommand, step: 'migrate', output: migrationResult.output }
73
+ `PostgreSQL migration failed: ${
74
+ migrationResult.error || 'Unknown error'
75
+ }`,
76
+ {
77
+ dbType,
78
+ stage,
79
+ command: migrationCommand,
80
+ step: 'migrate',
81
+ output: migrationResult.output,
82
+ }
62
83
  );
63
84
  }
64
85
  } else if (dbType === 'mongodb' || dbType === 'documentdb') {
65
86
  migrationCommand = 'db push';
66
87
  // Use non-interactive mode for automated/Lambda environments
67
- migrationResult = await this.prismaRunner.runPrismaDbPush(verbose, true);
88
+ migrationResult = await this.prismaRunner.runPrismaDbPush(
89
+ verbose,
90
+ true
91
+ );
68
92
 
69
93
  if (!migrationResult.success) {
70
94
  throw new MigrationError(
71
- `Mongo-compatible push failed: ${migrationResult.error || 'Unknown error'}`,
72
- { dbType, stage, command: migrationCommand, step: 'push', output: migrationResult.output }
95
+ `Mongo-compatible push failed: ${
96
+ migrationResult.error || 'Unknown error'
97
+ }`,
98
+ {
99
+ dbType,
100
+ stage,
101
+ command: migrationCommand,
102
+ step: 'push',
103
+ output: migrationResult.output,
104
+ }
73
105
  );
74
106
  }
75
107
  } else {
@@ -88,9 +88,9 @@ class TestEncryptionUseCase {
88
88
  return {
89
89
  externalId: 'test-encryption-entity',
90
90
  data: {
91
- access_token: testData.testSecret, // Encrypted field
91
+ access_token: testData.testSecret, // Encrypted field
92
92
  refresh_token: testData.nestedSecret?.value, // Encrypted field
93
- domain: testData.normalField, // Not encrypted
93
+ domain: testData.normalField, // Not encrypted
94
94
  },
95
95
  };
96
96
  }
@@ -203,8 +203,7 @@ class TestEncryptionUseCase {
203
203
  ) {
204
204
  return {
205
205
  status: 'enabled',
206
- testResult:
207
- 'Encryption and decryption verified successfully',
206
+ testResult: 'Encryption and decryption verified successfully',
208
207
  encryptionWorks: true,
209
208
  };
210
209
  }
@@ -250,4 +249,4 @@ class TestEncryptionUseCase {
250
249
  }
251
250
  }
252
251
 
253
- module.exports = { TestEncryptionUseCase };
252
+ module.exports = { TestEncryptionUseCase };
@@ -62,7 +62,7 @@ class TriggerDatabaseMigrationUseCase {
62
62
  if (!queueUrl) {
63
63
  throw new Error(
64
64
  'DB_MIGRATION_QUEUE_URL environment variable is not set. ' +
65
- 'Cannot send migration to queue.'
65
+ 'Cannot send migration to queue.'
66
66
  );
67
67
  }
68
68
 
@@ -77,7 +77,9 @@ class TriggerDatabaseMigrationUseCase {
77
77
  queueUrl
78
78
  );
79
79
 
80
- console.log(`Sent migration job to queue: ${migrationStatus.migrationId}`);
80
+ console.log(
81
+ `Sent migration job to queue: ${migrationStatus.migrationId}`
82
+ );
81
83
  } catch (error) {
82
84
  console.error(`Failed to send migration to queue:`, error);
83
85
 
@@ -89,9 +91,7 @@ class TriggerDatabaseMigrationUseCase {
89
91
  error: `Failed to queue migration: ${error.message}`,
90
92
  });
91
93
 
92
- throw new Error(
93
- `Failed to queue migration: ${error.message}`
94
- );
94
+ throw new Error(`Failed to queue migration: ${error.message}`);
95
95
  }
96
96
 
97
97
  // Return migration info immediately (don't wait for migration completion)
@@ -99,7 +99,7 @@ class TriggerDatabaseMigrationUseCase {
99
99
  success: true,
100
100
  migrationId: migrationStatus.migrationId,
101
101
  state: migrationStatus.state,
102
- statusUrl: `/db-migrate/${migrationStatus.migrationId}`,
102
+ statusUrl: `/admin/db-migrate/${migrationStatus.migrationId}`,
103
103
  s3Key: `migrations/${migrationStatus.stage}/${migrationStatus.migrationId}.json`,
104
104
  message: 'Database migration queued successfully',
105
105
  };
@@ -126,7 +126,9 @@ class TriggerDatabaseMigrationUseCase {
126
126
  const validDbTypes = ['postgresql', 'mongodb', 'documentdb'];
127
127
  if (!validDbTypes.includes(dbType)) {
128
128
  throw new ValidationError(
129
- `Invalid dbType: "${dbType}". Must be one of: ${validDbTypes.join(', ')}`
129
+ `Invalid dbType: "${dbType}". Must be one of: ${validDbTypes.join(
130
+ ', '
131
+ )}`
130
132
  );
131
133
  }
132
134
 
@@ -154,4 +156,3 @@ module.exports = {
154
156
  TriggerDatabaseMigrationUseCase,
155
157
  ValidationError,
156
158
  };
157
-
@@ -47,7 +47,10 @@ async function ensureCollectionExists(collectionName) {
47
47
  if (error.codeName === 'NamespaceExists') {
48
48
  return;
49
49
  }
50
- console.warn(`Error ensuring collection ${collectionName} exists:`, error.message);
50
+ console.warn(
51
+ `Error ensuring collection ${collectionName} exists:`,
52
+ error.message
53
+ );
51
54
  }
52
55
  }
53
56
 
@@ -63,7 +66,9 @@ async function ensureCollectionExists(collectionName) {
63
66
  * ```
64
67
  */
65
68
  async function ensureCollectionsExist(collectionNames) {
66
- await Promise.all(collectionNames.map(name => ensureCollectionExists(name)));
69
+ await Promise.all(
70
+ collectionNames.map((name) => ensureCollectionExists(name))
71
+ );
67
72
  }
68
73
 
69
74
  /**
@@ -82,7 +87,10 @@ async function collectionExists(collectionName) {
82
87
  const collections = result.cursor?.firstBatch || [];
83
88
  return collections.length > 0;
84
89
  } catch (error) {
85
- console.error(`Error checking if collection ${collectionName} exists:`, error.message);
90
+ console.error(
91
+ `Error checking if collection ${collectionName} exists:`,
92
+ error.message
93
+ );
86
94
  return false;
87
95
  }
88
96
  }
@@ -49,7 +49,9 @@ const config = require('../config');
49
49
  async function initializeMongoDBSchema() {
50
50
  // Only run for MongoDB-compatible databases
51
51
  if (config.DB_TYPE !== 'mongodb' && config.DB_TYPE !== 'documentdb') {
52
- console.log('Schema initialization skipped - not using MongoDB-compatible database');
52
+ console.log(
53
+ 'Schema initialization skipped - not using MongoDB-compatible database'
54
+ );
53
55
  return;
54
56
  }
55
57
 
@@ -59,11 +61,13 @@ async function initializeMongoDBSchema() {
59
61
  } catch (error) {
60
62
  throw new Error(
61
63
  'Cannot initialize MongoDB schema - database not connected. ' +
62
- 'Call connectPrisma() before initializeMongoDBSchema()'
64
+ 'Call connectPrisma() before initializeMongoDBSchema()'
63
65
  );
64
66
  }
65
67
 
66
- console.log('Initializing MongoDB-compatible schema - ensuring all collections exist...');
68
+ console.log(
69
+ 'Initializing MongoDB-compatible schema - ensuring all collections exist...'
70
+ );
67
71
  const startTime = Date.now();
68
72
 
69
73
  try {
@@ -71,7 +75,9 @@ async function initializeMongoDBSchema() {
71
75
  const collections = getCollectionsFromSchemaSync();
72
76
 
73
77
  if (collections.length === 0) {
74
- console.warn('No collections found in Prisma schema - skipping initialization');
78
+ console.warn(
79
+ 'No collections found in Prisma schema - skipping initialization'
80
+ );
75
81
  return;
76
82
  }
77
83