@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.
- package/CHANGELOG.md +66 -67
- package/CLAUDE.md +148 -124
- package/README.md +165 -130
- package/admin-scripts/index.js +52 -0
- package/admin-scripts/repositories/admin-api-key-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/admin-api-key-repository-factory.js +51 -0
- package/admin-scripts/repositories/admin-api-key-repository-interface.js +121 -0
- package/admin-scripts/repositories/admin-api-key-repository-mongo.js +155 -0
- package/admin-scripts/repositories/admin-api-key-repository-postgres.js +189 -0
- package/admin-scripts/repositories/admin-process-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/admin-process-repository-factory.js +49 -0
- package/admin-scripts/repositories/admin-process-repository-interface.js +150 -0
- package/admin-scripts/repositories/admin-process-repository-mongo.js +213 -0
- package/admin-scripts/repositories/admin-process-repository-postgres.js +251 -0
- package/admin-scripts/repositories/script-execution-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/script-execution-repository-factory.js +51 -0
- package/admin-scripts/repositories/script-execution-repository-interface.js +193 -0
- package/admin-scripts/repositories/script-execution-repository-mongo.js +278 -0
- package/admin-scripts/repositories/script-execution-repository-postgres.js +320 -0
- package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/script-schedule-repository-factory.js +49 -0
- package/admin-scripts/repositories/script-schedule-repository-interface.js +108 -0
- package/admin-scripts/repositories/script-schedule-repository-mongo.js +179 -0
- package/admin-scripts/repositories/script-schedule-repository-postgres.js +210 -0
- package/application/commands/admin-script-commands.js +348 -0
- package/application/commands/integration-commands.js +12 -6
- package/application/index.js +5 -3
- package/assertions/get.js +17 -7
- package/associations/association.js +59 -57
- package/core/CLAUDE.md +222 -156
- package/core/Worker.js +33 -12
- package/credential/credential-router.js +262 -0
- package/credential/repositories/credential-repository-documentdb.js +71 -1
- package/credential/repositories/credential-repository-factory.js +4 -6
- package/credential/repositories/credential-repository-interface.js +8 -2
- package/credential/repositories/credential-repository-mongo.js +45 -4
- package/credential/repositories/credential-repository-postgres.js +44 -3
- package/credential/repositories/credential-repository.js +3 -1
- package/credential/use-cases/delete-credential-for-user.js +50 -0
- package/credential/use-cases/get-credential-for-user.js +21 -3
- package/credential/use-cases/list-credentials-for-user.js +31 -0
- package/credential/use-cases/reauthorize-credential.js +103 -0
- package/credential/use-cases/update-authentication-status.js +5 -2
- package/database/MONGODB_TRANSACTION_FIX.md +72 -52
- package/database/config.js +13 -59
- package/database/documentdb-encryption-service.js +29 -13
- package/database/documentdb-utils.js +21 -12
- package/database/encryption/README.md +53 -36
- package/database/encryption/encryption-schema-registry.js +29 -23
- package/database/encryption/field-encryption-service.js +15 -4
- package/database/encryption/logger.js +3 -2
- package/database/encryption/prisma-encryption-extension.js +5 -8
- package/database/prisma.js +22 -14
- package/database/repositories/health-check-repository-factory.js +7 -5
- package/database/repositories/health-check-repository-interface.js +15 -5
- package/database/repositories/health-check-repository-postgres.js +1 -1
- package/database/use-cases/check-database-health-use-case.js +3 -2
- package/database/use-cases/check-database-state-use-case.js +8 -7
- package/database/use-cases/get-database-state-via-worker-use-case.js +15 -12
- package/database/use-cases/get-migration-status-use-case.js +4 -2
- package/database/use-cases/run-database-migration-use-case.js +41 -9
- package/database/use-cases/test-encryption-use-case.js +4 -5
- package/database/use-cases/trigger-database-migration-use-case.js +9 -8
- package/database/utils/mongodb-collection-utils.js +11 -3
- package/database/utils/mongodb-schema-init.js +10 -4
- package/database/utils/prisma-runner.js +144 -74
- package/database/utils/prisma-schema-parser.js +2 -2
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +135 -80
- package/encrypt/Cryptor.js +54 -49
- package/encrypt/aes-encryption-key-provider.js +82 -0
- package/encrypt/encryption-key-provider-interface.js +50 -0
- package/errors/fetch-error.js +1 -1
- package/generated/prisma-mongodb/edge.js +59 -4
- package/generated/prisma-mongodb/index-browser.js +49 -1
- package/generated/prisma-mongodb/index.d.ts +4023 -61
- package/generated/prisma-mongodb/index.js +59 -4
- package/generated/prisma-mongodb/package.json +1 -1
- package/generated/prisma-mongodb/schema.prisma +87 -0
- package/generated/prisma-mongodb/wasm.js +59 -4
- package/generated/prisma-postgresql/edge.js +58 -4
- package/generated/prisma-postgresql/index-browser.js +48 -1
- package/generated/prisma-postgresql/index.d.ts +4738 -54
- package/generated/prisma-postgresql/index.js +58 -4
- package/generated/prisma-postgresql/package.json +1 -1
- package/generated/prisma-postgresql/schema.prisma +85 -0
- package/generated/prisma-postgresql/wasm.js +58 -4
- package/handlers/WEBHOOKS.md +104 -81
- package/handlers/app-definition-loader.js +53 -10
- package/handlers/app-handler-helpers.js +14 -3
- package/handlers/backend-utils.js +0 -1
- package/handlers/database-migration-handler.js +64 -45
- package/handlers/middleware/admin-auth.js +53 -0
- package/handlers/routers/HEALTHCHECK.md +170 -135
- package/handlers/routers/admin.js +474 -0
- package/handlers/routers/auth.js +51 -9
- package/handlers/routers/db-migration.handler.js +2 -3
- package/handlers/routers/db-migration.js +102 -66
- package/handlers/routers/docs.js +180 -0
- package/handlers/routers/health.js +84 -283
- package/handlers/routers/integration-defined-routers.js +44 -33
- package/handlers/routers/integration-webhook-routers.js +73 -52
- package/handlers/routers/middleware/loadUser.js +39 -0
- package/handlers/routers/middleware/requireAdmin.js +43 -0
- package/handlers/routers/middleware/requireLoggedInUser.js +19 -0
- package/handlers/routers/user.js +30 -14
- package/handlers/routers/websocket.js +18 -4
- package/handlers/use-cases/check-integrations-health-use-case.js +13 -6
- package/handlers/workers/db-migration.js +74 -35
- package/handlers/workers/integration-defined-workers.js +31 -20
- package/index.js +50 -16
- package/infrastructure/scheduler/index.js +15 -11
- package/infrastructure/scheduler/netlify-scheduler-adapter.js +185 -0
- package/infrastructure/scheduler/scheduler-service-factory.js +38 -31
- package/integrations/WEBHOOK-QUICKSTART.md +21 -14
- package/integrations/index.js +4 -0
- package/integrations/integration-base.js +9 -6
- package/integrations/integration-router.js +1828 -157
- package/integrations/options.js +47 -20
- package/integrations/repositories/integration-mapping-repository-factory.js +4 -8
- package/integrations/repositories/integration-repository-documentdb.js +53 -24
- package/integrations/repositories/integration-repository-factory.js +6 -6
- package/integrations/repositories/integration-repository-interface.js +27 -9
- package/integrations/repositories/integration-repository-postgres.js +3 -3
- package/integrations/repositories/process-repository-factory.js +4 -7
- package/integrations/repositories/process-repository-interface.js +9 -5
- package/integrations/repositories/process-repository-mongo.js +7 -3
- package/integrations/repositories/process-repository-postgres.js +2 -2
- package/integrations/tests/doubles/config-capturing-integration.js +9 -8
- package/integrations/tests/doubles/dummy-integration-class.js +81 -8
- package/integrations/tests/doubles/test-integration-repository.js +51 -11
- package/integrations/use-cases/create-integration.js +36 -32
- package/integrations/use-cases/create-process.js +20 -9
- package/integrations/use-cases/delete-integration-for-user.js +5 -4
- package/integrations/use-cases/execute-proxy-request.js +564 -0
- package/integrations/use-cases/get-integration-for-user.js +25 -10
- package/integrations/use-cases/get-integration-instance-by-definition.js +13 -7
- package/integrations/use-cases/get-integrations-for-user.js +4 -1
- package/integrations/use-cases/get-possible-integrations.js +1 -1
- package/integrations/use-cases/get-process.js +5 -6
- package/integrations/use-cases/index.js +3 -1
- package/integrations/use-cases/load-integration-context.js +1 -5
- package/integrations/use-cases/update-process-state.js +10 -8
- package/integrations/utils/map-integration-dto.js +9 -3
- package/jest-setup.js +1 -1
- package/jest-teardown.js +1 -1
- package/lambda/TimeoutCatcher.js +32 -30
- package/lambda/index.js +1 -1
- package/logs/index.js +3 -3
- package/modules/domain/entities/AuthorizationSession.js +131 -0
- package/modules/domain/entities/index.js +10 -0
- package/modules/module.js +4 -9
- package/modules/repositories/authorization-session-repository-factory.js +53 -0
- package/modules/repositories/authorization-session-repository-interface.js +75 -0
- package/modules/repositories/authorization-session-repository-mongo.js +169 -0
- package/modules/repositories/authorization-session-repository-postgres.js +170 -0
- package/modules/repositories/module-repository-documentdb.js +89 -41
- package/modules/repositories/module-repository-factory.js +4 -6
- package/modules/repositories/module-repository-interface.js +13 -0
- package/modules/repositories/module-repository-mongo.js +40 -5
- package/modules/repositories/module-repository-postgres.js +42 -5
- package/modules/repositories/module-repository.js +28 -0
- package/modules/requester/api-key.js +0 -2
- package/modules/requester/basic.js +0 -1
- package/modules/requester/oauth-2.js +3 -14
- package/modules/test/mock-api/definition.js +15 -10
- package/modules/test/mock-api/mocks/hubspot.js +36 -36
- package/modules/tests/doubles/test-module-factory.js +10 -4
- package/modules/tests/doubles/test-module-repository.js +1 -1
- package/modules/use-cases/delete-module-entity.js +23 -0
- package/modules/use-cases/get-authorization-requirements.js +110 -0
- package/modules/use-cases/get-entities-for-user.js +1 -1
- package/modules/use-cases/get-entity-options-by-id.js +8 -6
- package/modules/use-cases/get-module-entity-by-id.js +16 -0
- package/modules/use-cases/get-module.js +12 -9
- package/modules/use-cases/process-authorization-callback.js +12 -6
- package/modules/use-cases/process-authorization-step.js +160 -0
- package/modules/use-cases/refresh-entity-options.js +8 -6
- package/modules/use-cases/start-authorization-session.js +86 -0
- package/modules/use-cases/test-module-auth.js +8 -6
- package/modules/use-cases/update-module-entity.js +27 -0
- package/modules/utils/map-module-dto.js +2 -2
- package/openapi/openapi-spec-generator.js +370 -0
- package/openapi/openapi-v1.yaml +1360 -0
- package/openapi/openapi-v2.yaml +1535 -0
- package/package.json +7 -9
- package/prisma-mongodb/schema.prisma +87 -0
- package/prisma-postgresql/migrations/20260222000000_add_admin_process_and_script_schedule/migration.sql +55 -0
- package/prisma-postgresql/schema.prisma +85 -0
- package/providers/index.js +13 -0
- package/providers/resolve-provider.js +93 -0
- package/queues/index.js +19 -0
- package/queues/providers/index.js +7 -0
- package/queues/providers/netlify-background-provider.js +76 -0
- package/queues/providers/qstash-queue-provider.js +122 -0
- package/queues/queue-client-interface.js +55 -0
- package/queues/queue-provider-factory.js +93 -0
- package/queues/queue-provider.js +46 -0
- package/queues/queuer-util.js +33 -25
- package/syncs/repositories/sync-repository-documentdb.js +39 -19
- package/syncs/repositories/sync-repository-factory.js +4 -4
- package/syncs/repositories/sync-repository-interface.js +6 -2
- package/syncs/repositories/sync-repository-postgres.js +19 -13
- package/syncs/sync.js +104 -100
- package/token/repositories/token-repository-factory.js +4 -6
- package/types/assertions/index.d.ts +72 -72
- package/types/core/index.d.ts +98 -53
- package/types/errors/index.d.ts +61 -54
- package/types/eslint-config/index.d.ts +40 -40
- package/types/lambda/index.d.ts +26 -26
- package/types/logs/index.d.ts +4 -4
- package/types/prettier-config/index.d.ts +5 -5
- package/types/test-environment/index.d.ts +14 -14
- package/types/tsconfig.json +95 -93
- package/user/repositories/user-repository-factory.js +4 -4
- package/user/tests/doubles/test-user-repository.js +5 -2
- package/user/use-cases/authenticate-user.js +2 -4
- package/user/use-cases/authenticate-with-shared-secret.js +1 -1
- package/user/use-cases/create-individual-user.js +8 -7
- package/user/use-cases/create-organization-user.js +1 -1
- package/user/use-cases/create-token-for-user-id.js +1 -1
- package/user/use-cases/delete-user.js +47 -0
- package/user/use-cases/get-user-from-adopter-jwt.js +0 -2
- package/user/use-cases/get-user-from-bearer-token.js +7 -3
- package/user/use-cases/get-user-from-x-frigg-headers.js +14 -11
- package/user/use-cases/login-user.js +8 -8
- package/user/user.js +18 -4
- package/utils/backend-path.js +2 -2
- package/utils/index.js +4 -1
- package/websocket/repositories/websocket-connection-repository-documentdb.js +46 -21
- package/websocket/repositories/websocket-connection-repository-factory.js +4 -8
- package/websocket/repositories/websocket-connection-repository-mongo.js +26 -16
- package/websocket/repositories/websocket-connection-repository-postgres.js +26 -15
- package/websocket/repositories/websocket-connection-repository.js +26 -20
- package/websocket/websocket-message-sender-interface.js +38 -0
- package/database/adapters/lambda-invoker.js +0 -97
- package/database/repositories/migration-status-repository-s3.js +0 -137
- 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(
|
|
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(
|
|
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(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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(
|
|
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(
|
|
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: ${
|
|
46
|
-
|
|
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(
|
|
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: ${
|
|
61
|
-
|
|
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(
|
|
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: ${
|
|
72
|
-
|
|
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,
|
|
91
|
+
access_token: testData.testSecret, // Encrypted field
|
|
92
92
|
refresh_token: testData.nestedSecret?.value, // Encrypted field
|
|
93
|
-
domain: testData.normalField,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
64
|
+
'Call connectPrisma() before initializeMongoDBSchema()'
|
|
63
65
|
);
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
console.log(
|
|
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(
|
|
78
|
+
console.warn(
|
|
79
|
+
'No collections found in Prisma schema - skipping initialization'
|
|
80
|
+
);
|
|
75
81
|
return;
|
|
76
82
|
}
|
|
77
83
|
|