@friggframework/core 2.0.0-next.12 → 2.0.0-next.121
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/.eslintrc.json +18 -1
- package/CLAUDE.md +830 -0
- package/README.md +996 -50
- package/admin-scripts/index.js +52 -0
- package/admin-scripts/repositories/admin-script-execution-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/admin-script-execution-repository-factory.js +51 -0
- package/admin-scripts/repositories/admin-script-execution-repository-interface.js +171 -0
- package/admin-scripts/repositories/admin-script-execution-repository-mongo.js +238 -0
- package/admin-scripts/repositories/admin-script-execution-repository-postgres.js +278 -0
- package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
- package/admin-scripts/repositories/script-schedule-repository-factory.js +51 -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/README.md +451 -0
- package/application/commands/admin-script-commands.js +359 -0
- package/application/commands/credential-commands.js +262 -0
- package/application/commands/entity-commands.js +294 -0
- package/application/commands/integration-commands.js +419 -0
- package/application/commands/integration-mapping-commands.js +25 -0
- package/application/commands/process-commands.js +135 -0
- package/application/commands/report-commands.js +188 -0
- package/application/commands/scheduler-commands.js +263 -0
- package/application/commands/usage-commands.js +56 -0
- package/application/commands/user-commands.js +312 -0
- package/application/index.js +83 -0
- package/artifacts/repositories/artifact-repository-factory.js +19 -0
- package/artifacts/repositories/artifact-repository-interface.js +27 -0
- package/artifacts/repositories/artifact-repository-local.js +42 -0
- package/artifacts/repositories/artifact-repository-s3.js +61 -0
- package/assertions/index.js +0 -3
- package/core/CLAUDE.md +715 -0
- package/core/Worker.js +55 -24
- package/core/create-handler.js +121 -38
- package/core/index.js +8 -1
- package/core/invocation-scope.js +225 -0
- package/core/parameters-to-env.js +257 -0
- package/core/secrets-to-env.js +7 -6
- package/core/ssm-preload.mjs +34 -0
- package/credential/repositories/credential-active-type.js +32 -0
- package/credential/repositories/credential-repository-documentdb.js +355 -0
- package/credential/repositories/credential-repository-factory.js +54 -0
- package/credential/repositories/credential-repository-interface.js +113 -0
- package/credential/repositories/credential-repository-mongo.js +294 -0
- package/credential/repositories/credential-repository-postgres.js +312 -0
- package/credential/repositories/credential-repository.js +300 -0
- package/credential/use-cases/get-credential-for-user.js +25 -0
- package/credential/use-cases/update-authentication-status.js +15 -0
- package/database/MONGODB_TRANSACTION_FIX.md +198 -0
- package/database/adapters/lambda-invoker.js +97 -0
- package/database/config.js +147 -0
- package/database/documentdb-encryption-service.js +334 -0
- package/database/documentdb-utils.js +196 -0
- package/database/encryption/README.md +863 -0
- package/database/encryption/documentdb-encryption-service.md +3575 -0
- package/database/encryption/encryption-schema-registry.js +404 -0
- package/database/encryption/field-encryption-service.js +254 -0
- package/database/encryption/integration-mapping-encryption.js +97 -0
- package/database/encryption/logger.js +82 -0
- package/database/encryption/prisma-encryption-extension.js +241 -0
- package/database/index.js +21 -21
- package/database/prisma.js +182 -0
- package/database/repositories/health-check-repository-documentdb.js +138 -0
- package/database/repositories/health-check-repository-factory.js +48 -0
- package/database/repositories/health-check-repository-interface.js +82 -0
- package/database/repositories/health-check-repository-mongodb.js +89 -0
- package/database/repositories/health-check-repository-postgres.js +82 -0
- package/database/repositories/migration-status-repository-s3.js +137 -0
- package/database/use-cases/check-database-health-use-case.js +29 -0
- package/database/use-cases/check-database-state-use-case.js +81 -0
- package/database/use-cases/check-encryption-health-use-case.js +83 -0
- package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
- package/database/use-cases/get-migration-status-use-case.js +93 -0
- package/database/use-cases/resolve-migration-via-worker-use-case.js +49 -0
- package/database/use-cases/run-database-migration-use-case.js +139 -0
- package/database/use-cases/test-encryption-use-case.js +253 -0
- package/database/use-cases/trigger-database-migration-use-case.js +157 -0
- package/database/utils/mongodb-collection-utils.js +94 -0
- package/database/utils/mongodb-schema-init.js +108 -0
- package/database/utils/prisma-runner.js +491 -0
- package/database/utils/prisma-schema-parser.js +182 -0
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
- package/encrypt/Cryptor.js +34 -168
- package/encrypt/index.js +1 -2
- package/errors/client-safe-error.js +26 -0
- package/errors/fetch-error.js +59 -57
- package/errors/index.js +6 -0
- package/errors/mapping-already-exists-error.js +14 -0
- package/generated/prisma-mongodb/client.d.ts +1 -0
- package/generated/prisma-mongodb/client.js +5 -0
- package/generated/prisma-mongodb/default.d.ts +1 -0
- package/generated/prisma-mongodb/default.js +5 -0
- package/generated/prisma-mongodb/edge.d.ts +1 -0
- package/generated/prisma-mongodb/edge.js +386 -0
- package/generated/prisma-mongodb/index-browser.js +368 -0
- package/generated/prisma-mongodb/index.d.ts +27065 -0
- package/generated/prisma-mongodb/index.js +411 -0
- package/generated/prisma-mongodb/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-mongodb/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-mongodb/package.json +183 -0
- package/generated/prisma-mongodb/runtime/edge-esm.js +35 -0
- package/generated/prisma-mongodb/runtime/edge.js +35 -0
- package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-mongodb/runtime/index-browser.js +17 -0
- package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
- package/generated/prisma-mongodb/runtime/library.js +147 -0
- package/generated/prisma-mongodb/runtime/react-native.js +84 -0
- package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +85 -0
- package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +38 -0
- package/generated/prisma-mongodb/schema.prisma +455 -0
- package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +5 -0
- package/generated/prisma-mongodb/wasm-worker-loader.mjs +5 -0
- package/generated/prisma-mongodb/wasm.d.ts +1 -0
- package/generated/prisma-mongodb/wasm.js +393 -0
- package/generated/prisma-postgresql/client.d.ts +1 -0
- package/generated/prisma-postgresql/client.js +5 -0
- package/generated/prisma-postgresql/default.d.ts +1 -0
- package/generated/prisma-postgresql/default.js +5 -0
- package/generated/prisma-postgresql/edge.d.ts +1 -0
- package/generated/prisma-postgresql/edge.js +407 -0
- package/generated/prisma-postgresql/index-browser.js +389 -0
- package/generated/prisma-postgresql/index.d.ts +29904 -0
- package/generated/prisma-postgresql/index.js +432 -0
- package/generated/prisma-postgresql/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-postgresql/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
- package/generated/prisma-postgresql/package.json +183 -0
- package/generated/prisma-postgresql/query_engine_bg.js +2 -0
- package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
- package/generated/prisma-postgresql/runtime/edge-esm.js +35 -0
- package/generated/prisma-postgresql/runtime/edge.js +35 -0
- package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-postgresql/runtime/index-browser.js +17 -0
- package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
- package/generated/prisma-postgresql/runtime/library.js +147 -0
- package/generated/prisma-postgresql/runtime/react-native.js +84 -0
- package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +85 -0
- package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +38 -0
- package/generated/prisma-postgresql/schema.prisma +436 -0
- package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +5 -0
- package/generated/prisma-postgresql/wasm-worker-loader.mjs +5 -0
- package/generated/prisma-postgresql/wasm.d.ts +1 -0
- package/generated/prisma-postgresql/wasm.js +414 -0
- package/handlers/WEBHOOKS.md +682 -0
- package/handlers/app-definition-loader.js +103 -0
- package/handlers/app-handler-helpers.js +20 -6
- package/handlers/backend-utils.js +272 -46
- package/handlers/database-migration-handler.js +236 -0
- package/handlers/integration-event-dispatcher.js +68 -0
- package/handlers/middleware/admin-auth.js +73 -0
- package/handlers/routers/HEALTHCHECK.md +342 -0
- package/handlers/routers/auth.js +4 -15
- package/handlers/routers/db-migration.handler.js +29 -0
- package/handlers/routers/db-migration.js +329 -0
- package/handlers/routers/health.js +518 -0
- package/handlers/routers/integration-defined-routers.js +85 -10
- package/handlers/routers/integration-webhook-routers.js +87 -0
- package/handlers/routers/user.js +27 -5
- package/handlers/routers/websocket.js +31 -9
- package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
- package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
- package/handlers/workers/db-migration.js +438 -0
- package/handlers/workers/dlq-processor.js +89 -0
- package/handlers/workers/integration-defined-workers.js +13 -7
- package/index.js +123 -47
- package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +238 -0
- package/infrastructure/scheduler/index.js +33 -0
- package/infrastructure/scheduler/mock-scheduler-adapter.js +143 -0
- package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
- package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
- package/integrations/EXTENSIONS.md +240 -0
- package/integrations/WEBHOOK-QUICKSTART.md +151 -0
- package/integrations/extension.js +254 -0
- package/integrations/index.js +20 -10
- package/integrations/integration-base.js +777 -74
- package/integrations/integration-router.js +399 -180
- package/integrations/options.js +1 -1
- package/integrations/repositories/config-patch-shared.js +43 -0
- package/integrations/repositories/integration-mapping-query-pipeline.js +152 -0
- package/integrations/repositories/integration-mapping-query.js +193 -0
- package/integrations/repositories/integration-mapping-repository-documentdb.js +406 -0
- package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
- package/integrations/repositories/integration-mapping-repository-interface.js +183 -0
- package/integrations/repositories/integration-mapping-repository-mongo.js +284 -0
- package/integrations/repositories/integration-mapping-repository-postgres.js +403 -0
- package/integrations/repositories/integration-mapping-repository.js +185 -0
- package/integrations/repositories/integration-repository-documentdb.js +354 -0
- package/integrations/repositories/integration-repository-factory.js +51 -0
- package/integrations/repositories/integration-repository-interface.js +219 -0
- package/integrations/repositories/integration-repository-mongo.js +502 -0
- package/integrations/repositories/integration-repository-postgres.js +550 -0
- package/integrations/repositories/process-repository-documentdb.js +311 -0
- package/integrations/repositories/process-repository-factory.js +53 -0
- package/integrations/repositories/process-repository-interface.js +136 -0
- package/integrations/repositories/process-repository-mongo.js +262 -0
- package/integrations/repositories/process-repository-postgres.js +380 -0
- package/integrations/repositories/process-update-ops-shared.js +112 -0
- package/integrations/repositories/report-id.js +13 -0
- package/integrations/tests/doubles/config-capturing-integration.js +81 -0
- package/integrations/tests/doubles/dummy-integration-class.js +113 -0
- package/integrations/tests/doubles/test-integration-repository.js +146 -0
- package/integrations/use-cases/add-entities-to-integration.js +92 -0
- package/integrations/use-cases/create-integration.js +253 -0
- package/integrations/use-cases/create-process.js +130 -0
- package/integrations/use-cases/delete-integration-for-user.js +130 -0
- package/integrations/use-cases/find-integration-by-entity-external-id.js +74 -0
- package/integrations/use-cases/find-integration-context-by-external-entity-id.js +76 -0
- package/integrations/use-cases/get-integration-for-user.js +78 -0
- package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
- package/integrations/use-cases/get-integration-instance.js +83 -0
- package/integrations/use-cases/get-integrations-for-user.js +88 -0
- package/integrations/use-cases/get-possible-integrations.js +27 -0
- package/integrations/use-cases/get-process.js +89 -0
- package/integrations/use-cases/index.js +19 -0
- package/integrations/use-cases/list-integrations-by-entity-external-id.js +46 -0
- package/integrations/use-cases/load-integration-context.js +71 -0
- package/integrations/use-cases/patch-integration-config.js +39 -0
- package/integrations/use-cases/process-errors.js +28 -0
- package/integrations/use-cases/remove-entities-from-integration.js +70 -0
- package/integrations/use-cases/update-integration-config.js +32 -0
- package/integrations/use-cases/update-integration-messages.js +44 -0
- package/integrations/use-cases/update-integration-status.js +32 -0
- package/integrations/use-cases/update-integration.js +92 -0
- package/integrations/use-cases/update-process-metrics.js +222 -0
- package/integrations/use-cases/update-process-state.js +163 -0
- package/integrations/utils/assert-entity-ids-input.js +42 -0
- package/integrations/utils/map-integration-dto.js +37 -0
- package/jest-global-setup-noop.js +3 -0
- package/jest-global-teardown-noop.js +3 -0
- package/jest.config.js +2 -0
- package/logs/.eslintrc.json +26 -1
- package/logs/__fixtures__/events.js +82 -0
- package/logs/__fixtures__/matchers.js +45 -0
- package/logs/__fixtures__/secrets.js +59 -0
- package/logs/__fixtures__/vectors.js +329 -0
- package/logs/__fixtures__/with-env.js +45 -0
- package/logs/context.js +109 -0
- package/logs/contract-keys.js +67 -0
- package/logs/debug-shims.js +46 -0
- package/logs/denied-keys.js +21 -0
- package/logs/index.js +14 -3
- package/logs/jest-logger-setup.js +25 -0
- package/logs/levels.js +71 -0
- package/logs/logger-runtime.js +137 -0
- package/logs/logger.js +134 -46
- package/logs/record.js +276 -0
- package/logs/redact.js +328 -0
- package/logs/serialize.js +329 -0
- package/logs/sinks.js +93 -0
- package/logs/summarize-event.js +163 -0
- package/{module-plugin → modules}/index.js +0 -10
- package/modules/module-factory.js +56 -0
- package/modules/module.js +320 -0
- package/modules/repositories/module-repository-documentdb.js +350 -0
- package/modules/repositories/module-repository-factory.js +40 -0
- package/modules/repositories/module-repository-interface.js +145 -0
- package/modules/repositories/module-repository-mongo.js +436 -0
- package/modules/repositories/module-repository-postgres.js +481 -0
- package/modules/repositories/module-repository.js +369 -0
- package/modules/requester/api-key.js +52 -0
- package/modules/requester/oauth-2.js +561 -0
- package/modules/requester/requester.js +605 -0
- package/{module-plugin → modules}/test/mock-api/api.js +8 -3
- package/{module-plugin → modules}/test/mock-api/definition.js +14 -10
- package/modules/tests/doubles/test-module-factory.js +16 -0
- package/modules/tests/doubles/test-module-repository.js +39 -0
- package/modules/use-cases/get-entities-for-user.js +32 -0
- package/modules/use-cases/get-entity-options-by-id.js +71 -0
- package/modules/use-cases/get-entity-options-by-type.js +34 -0
- package/modules/use-cases/get-module-instance-from-type.js +34 -0
- package/modules/use-cases/get-module.js +74 -0
- package/modules/use-cases/process-authorization-callback.js +294 -0
- package/modules/use-cases/refresh-entity-options.js +72 -0
- package/modules/use-cases/test-module-auth.js +72 -0
- package/modules/utils/map-module-dto.js +20 -0
- package/modules/utils/to-credential-id.js +14 -0
- package/package.json +92 -52
- package/prisma-mongodb/schema.prisma +455 -0
- package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
- package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
- package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
- package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
- package/prisma-postgresql/migrations/20260422120000_add_entity_data_column/migration.sql +10 -0
- package/prisma-postgresql/migrations/20260422120001_create_process_table/migration.sql +48 -0
- package/prisma-postgresql/migrations/20260625000000_add_user_organization_id_index/migration.sql +2 -0
- package/prisma-postgresql/migrations/20260703000000_add_integration_status_in_creation_in_deletion/migration.sql +11 -0
- package/prisma-postgresql/migrations/20260703000001_integration_status_default_in_creation/migration.sql +8 -0
- package/prisma-postgresql/migrations/20260705000000_create_usage_counter/migration.sql +26 -0
- package/prisma-postgresql/migrations/20260706000000_add_admin_script_execution_and_schedule/migration.sql +61 -0
- package/prisma-postgresql/migrations/migration_lock.toml +3 -0
- package/prisma-postgresql/schema.prisma +436 -0
- package/queues/queue-delivery.js +41 -0
- package/queues/queuer-util.js +89 -21
- package/reporting/README.md +154 -0
- package/reporting/builtin-reports.js +6 -0
- package/reporting/index.js +13 -0
- package/reporting/report-base.js +49 -0
- package/reporting/reports/integrations-report.js +221 -0
- package/syncs/manager.js +468 -443
- package/syncs/repositories/sync-repository-documentdb.js +240 -0
- package/syncs/repositories/sync-repository-factory.js +43 -0
- package/syncs/repositories/sync-repository-interface.js +109 -0
- package/syncs/repositories/sync-repository-mongo.js +239 -0
- package/syncs/repositories/sync-repository-postgres.js +319 -0
- package/syncs/sync.js +0 -1
- package/telemetry/README.md +331 -0
- package/telemetry/bind-telemetry-context.js +77 -0
- package/telemetry/canonical-counters.js +52 -0
- package/telemetry/exporters.js +85 -0
- package/telemetry/index.js +26 -0
- package/telemetry/instrument-handler.js +104 -0
- package/telemetry/no-op-telemetry.js +71 -0
- package/telemetry/north-star.js +103 -0
- package/telemetry/otel-telemetry.js +232 -0
- package/telemetry/plugin-subscribers.js +77 -0
- package/telemetry/telemetry-config.js +120 -0
- package/telemetry/telemetry-context.js +51 -0
- package/telemetry/telemetry-event-bus.js +58 -0
- package/telemetry/telemetry-runtime.js +164 -0
- package/telemetry/telemetry-service.js +52 -0
- package/telemetry/usage-rollup-subscriber.js +116 -0
- package/token/repositories/token-repository-documentdb.js +137 -0
- package/token/repositories/token-repository-factory.js +40 -0
- package/token/repositories/token-repository-interface.js +131 -0
- package/token/repositories/token-repository-mongo.js +219 -0
- package/token/repositories/token-repository-postgres.js +264 -0
- package/token/repositories/token-repository.js +219 -0
- package/types/associations/index.d.ts +0 -17
- package/types/core/index.d.ts +12 -4
- package/types/database/index.d.ts +10 -2
- package/types/encrypt/index.d.ts +5 -3
- package/types/errors/index.d.ts +24 -10
- package/types/integrations/index.d.ts +3 -8
- package/types/logs/index.d.ts +61 -2
- package/types/module-plugin/index.d.ts +20 -69
- package/types/syncs/index.d.ts +0 -17
- package/usage/README.md +54 -0
- package/usage/index.js +17 -0
- package/usage/repositories/usage-repository-documentdb.js +194 -0
- package/usage/repositories/usage-repository-factory.js +25 -0
- package/usage/repositories/usage-repository-interface.js +37 -0
- package/usage/repositories/usage-repository-prisma.js +146 -0
- package/usage/tracked-metrics.js +38 -0
- package/usage/usage-windows.js +24 -0
- package/user/repositories/user-repository-documentdb.js +426 -0
- package/user/repositories/user-repository-factory.js +52 -0
- package/user/repositories/user-repository-interface.js +214 -0
- package/user/repositories/user-repository-mongo.js +323 -0
- package/user/repositories/user-repository-postgres.js +377 -0
- package/user/tests/doubles/test-user-repository.js +72 -0
- package/user/use-cases/authenticate-user.js +143 -0
- package/user/use-cases/authenticate-with-shared-secret.js +48 -0
- package/user/use-cases/create-individual-user.js +61 -0
- package/user/use-cases/create-organization-user.js +47 -0
- package/user/use-cases/create-token-for-user-id.js +30 -0
- package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
- package/user/use-cases/get-user-from-bearer-token.js +82 -0
- package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
- package/user/use-cases/login-user.js +122 -0
- package/user/user.js +125 -0
- package/utils/backend-path.js +38 -0
- package/utils/index.js +6 -0
- package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
- package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
- package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
- package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
- package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
- package/websocket/repositories/websocket-connection-repository.js +161 -0
- package/assertions/is-equal.js +0 -17
- package/associations/model.js +0 -54
- package/database/models/IndividualUser.js +0 -76
- package/database/models/OrganizationUser.js +0 -29
- package/database/models/State.js +0 -9
- package/database/models/Token.js +0 -70
- package/database/models/UserModel.js +0 -7
- package/database/models/WebsocketConnection.js +0 -49
- package/database/mongo.js +0 -45
- package/database/mongoose.js +0 -5
- package/encrypt/Cryptor.test.js +0 -32
- package/encrypt/encrypt.js +0 -132
- package/encrypt/encrypt.test.js +0 -1069
- package/encrypt/test-encrypt.js +0 -107
- package/errors/base-error.test.js +0 -32
- package/errors/fetch-error.test.js +0 -79
- package/errors/halt-error.test.js +0 -11
- package/errors/validation-errors.test.js +0 -120
- package/handlers/routers/middleware/loadUser.js +0 -15
- package/handlers/routers/middleware/requireLoggedInUser.js +0 -12
- package/integrations/create-frigg-backend.js +0 -31
- package/integrations/integration-factory.js +0 -251
- package/integrations/integration-mapping.js +0 -43
- package/integrations/integration-model.js +0 -46
- package/integrations/integration-user.js +0 -144
- package/integrations/test/integration-base.test.js +0 -144
- package/lambda/TimeoutCatcher.test.js +0 -68
- package/logs/logger.test.js +0 -76
- package/module-plugin/auther.js +0 -393
- package/module-plugin/credential.js +0 -22
- package/module-plugin/entity-manager.js +0 -70
- package/module-plugin/entity.js +0 -46
- package/module-plugin/manager.js +0 -169
- package/module-plugin/module-factory.js +0 -61
- package/module-plugin/requester/api-key.js +0 -36
- package/module-plugin/requester/oauth-2.js +0 -219
- package/module-plugin/requester/requester.js +0 -165
- package/module-plugin/requester/requester.test.js +0 -28
- package/module-plugin/test/auther.test.js +0 -97
- package/syncs/model.js +0 -62
- /package/{module-plugin → modules}/ModuleConstants.js +0 -0
- /package/{module-plugin → modules}/requester/basic.js +0 -0
- /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Migration Handler for AWS Lambda
|
|
3
|
+
*
|
|
4
|
+
* Executes Prisma migrations in a Lambda environment.
|
|
5
|
+
* Based on AWS best practices for running migrations in serverless environments.
|
|
6
|
+
*
|
|
7
|
+
* Supported Commands:
|
|
8
|
+
* - deploy: Apply pending migrations to the database (production-safe)
|
|
9
|
+
* - reset: Reset database and apply all migrations (DANGEROUS - dev only)
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* // Via Lambda invoke
|
|
13
|
+
* {
|
|
14
|
+
* "command": "deploy" // or "reset"
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* Requirements:
|
|
18
|
+
* - Prisma CLI must be included in deployment or Lambda layer
|
|
19
|
+
* - DATABASE_URL environment variable must be set
|
|
20
|
+
* - VPC configuration for Aurora access
|
|
21
|
+
*
|
|
22
|
+
* Reference: https://www.prisma.io/docs/guides/deployment/deployment-guides/deploying-to-aws-lambda
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const { execFile } = require('child_process');
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const { getLogger } = require('../logs');
|
|
28
|
+
|
|
29
|
+
const log = getLogger('frigg.database.migration');
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Execute Prisma migration command
|
|
33
|
+
*
|
|
34
|
+
* @param {string} command - Migration command ('deploy' or 'reset')
|
|
35
|
+
* @param {string} schemaPath - Path to Prisma schema file
|
|
36
|
+
* @returns {Promise<number>} Exit code
|
|
37
|
+
*/
|
|
38
|
+
async function executePrismaMigration(command, schemaPath) {
|
|
39
|
+
console.log(`Executing Prisma migration: ${command}`);
|
|
40
|
+
console.log(`Schema path: ${schemaPath}`);
|
|
41
|
+
console.log(`Database URL: ${process.env.DATABASE_URL ? '[SET]' : '[NOT SET]'}`);
|
|
42
|
+
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
// Build command arguments
|
|
45
|
+
const args = ['migrate', command];
|
|
46
|
+
|
|
47
|
+
// Add command-specific options
|
|
48
|
+
if (command === 'reset') {
|
|
49
|
+
args.push('--force'); // Skip confirmation prompt
|
|
50
|
+
args.push('--skip-generate'); // Skip client generation (already done in layer)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Add schema path if provided
|
|
54
|
+
if (schemaPath) {
|
|
55
|
+
args.push('--schema', schemaPath);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.log(`Running: prisma ${args.join(' ')}`);
|
|
59
|
+
|
|
60
|
+
// Execute Prisma CLI
|
|
61
|
+
execFile(
|
|
62
|
+
path.resolve('./node_modules/prisma/build/index.js'),
|
|
63
|
+
args,
|
|
64
|
+
{
|
|
65
|
+
env: {
|
|
66
|
+
...process.env,
|
|
67
|
+
// Ensure Prisma uses the correct binary target
|
|
68
|
+
PRISMA_CLI_BINARY_TARGETS: 'rhel-openssl-3.0.x',
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
(error, stdout, stderr) => {
|
|
72
|
+
// Log all output
|
|
73
|
+
if (stdout) {
|
|
74
|
+
console.log('STDOUT:', stdout);
|
|
75
|
+
}
|
|
76
|
+
if (stderr) {
|
|
77
|
+
console.error('STDERR:', stderr);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (error) {
|
|
81
|
+
console.error(`Migration ${command} exited with error:`, error.message);
|
|
82
|
+
console.error(`Exit code: ${error.code || 1}`);
|
|
83
|
+
resolve(error.code || 1);
|
|
84
|
+
} else {
|
|
85
|
+
console.log(`Migration ${command} completed successfully`);
|
|
86
|
+
resolve(0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Validate migration command
|
|
95
|
+
*/
|
|
96
|
+
function validateCommand(command) {
|
|
97
|
+
const validCommands = ['deploy', 'reset'];
|
|
98
|
+
|
|
99
|
+
if (!validCommands.includes(command)) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`Invalid migration command: "${command}". ` +
|
|
102
|
+
`Valid commands are: ${validCommands.join(', ')}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Extra validation for dangerous commands
|
|
107
|
+
if (command === 'reset') {
|
|
108
|
+
const stage = process.env.STAGE || process.env.NODE_ENV;
|
|
109
|
+
if (stage === 'production' || stage === 'prod') {
|
|
110
|
+
throw new Error(
|
|
111
|
+
'BLOCKED: "reset" command is not allowed in production environment. ' +
|
|
112
|
+
'This command would delete all data. Use "deploy" instead.'
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
console.warn('⚠️ WARNING: "reset" will DELETE all data and reset the database!');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Determine which Prisma schema to use based on database type
|
|
121
|
+
*/
|
|
122
|
+
function getSchemaPath() {
|
|
123
|
+
// In Lambda, schemas are in @friggframework/core/generated/
|
|
124
|
+
const baseSchemaPath = './node_modules/@friggframework/core/generated';
|
|
125
|
+
|
|
126
|
+
// Check if Postgres is enabled
|
|
127
|
+
if (process.env.DATABASE_URL?.includes('postgresql') || process.env.DATABASE_URL?.includes('postgres')) {
|
|
128
|
+
const schemaPath = `${baseSchemaPath}/prisma-postgresql/schema.prisma`;
|
|
129
|
+
console.log(`Using PostgreSQL schema: ${schemaPath}`);
|
|
130
|
+
return schemaPath;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Check if MongoDB is enabled
|
|
134
|
+
if (process.env.DATABASE_URL?.includes('mongodb')) {
|
|
135
|
+
const schemaPath = `${baseSchemaPath}/prisma-mongodb/schema.prisma`;
|
|
136
|
+
console.log(`Using MongoDB schema: ${schemaPath}`);
|
|
137
|
+
return schemaPath;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Default to PostgreSQL
|
|
141
|
+
console.log('DATABASE_URL not set or database type unknown, defaulting to PostgreSQL');
|
|
142
|
+
return `${baseSchemaPath}/prisma-postgresql/schema.prisma`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Lambda handler for database migrations
|
|
147
|
+
*
|
|
148
|
+
* @param {Object} event - Lambda event
|
|
149
|
+
* @param {string} event.command - Migration command ('deploy' or 'reset')
|
|
150
|
+
* @param {Object} context - Lambda context
|
|
151
|
+
* @returns {Promise<Object>} Migration result
|
|
152
|
+
*/
|
|
153
|
+
exports.handler = async (event, context) => {
|
|
154
|
+
const startTime = Date.now();
|
|
155
|
+
|
|
156
|
+
console.log('='.repeat(60));
|
|
157
|
+
console.log('Database Migration Handler');
|
|
158
|
+
console.log('='.repeat(60));
|
|
159
|
+
log.info('Database migration invoked', {
|
|
160
|
+
eventName: 'frigg.database.migration.invoked',
|
|
161
|
+
migrationId: event.migrationId,
|
|
162
|
+
dbType: process.env.DB_TYPE,
|
|
163
|
+
targetStage: process.env.STAGE,
|
|
164
|
+
action: event.command || 'deploy',
|
|
165
|
+
});
|
|
166
|
+
console.log('Context:', JSON.stringify({
|
|
167
|
+
functionName: context.functionName,
|
|
168
|
+
functionVersion: context.functionVersion,
|
|
169
|
+
memoryLimitInMB: context.memoryLimitInMB,
|
|
170
|
+
logGroupName: context.logGroupName,
|
|
171
|
+
}, null, 2));
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
// Get migration command (default to 'deploy')
|
|
175
|
+
const command = event.command || 'deploy';
|
|
176
|
+
|
|
177
|
+
// Validate command
|
|
178
|
+
validateCommand(command);
|
|
179
|
+
|
|
180
|
+
// Check required environment variables
|
|
181
|
+
if (!process.env.DATABASE_URL) {
|
|
182
|
+
throw new Error(
|
|
183
|
+
'DATABASE_URL environment variable is not set. ' +
|
|
184
|
+
'Cannot connect to database for migrations.'
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Determine schema path
|
|
189
|
+
const schemaPath = getSchemaPath();
|
|
190
|
+
|
|
191
|
+
// Execute migration
|
|
192
|
+
const exitCode = await executePrismaMigration(command, schemaPath);
|
|
193
|
+
|
|
194
|
+
const duration = Date.now() - startTime;
|
|
195
|
+
|
|
196
|
+
if (exitCode === 0) {
|
|
197
|
+
const result = {
|
|
198
|
+
success: true,
|
|
199
|
+
command,
|
|
200
|
+
message: `Migration ${command} completed successfully`,
|
|
201
|
+
duration: `${duration}ms`,
|
|
202
|
+
timestamp: new Date().toISOString(),
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
console.log('='.repeat(60));
|
|
206
|
+
console.log('Migration completed successfully');
|
|
207
|
+
console.log(JSON.stringify(result, null, 2));
|
|
208
|
+
console.log('='.repeat(60));
|
|
209
|
+
|
|
210
|
+
return result;
|
|
211
|
+
} else {
|
|
212
|
+
throw new Error(`Migration ${command} failed with exit code ${exitCode}`);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
} catch (error) {
|
|
216
|
+
const duration = Date.now() - startTime;
|
|
217
|
+
|
|
218
|
+
console.error('='.repeat(60));
|
|
219
|
+
console.error('Migration failed');
|
|
220
|
+
console.error('Error:', error.message);
|
|
221
|
+
console.error('Stack:', error.stack);
|
|
222
|
+
console.error('='.repeat(60));
|
|
223
|
+
|
|
224
|
+
const errorResult = {
|
|
225
|
+
success: false,
|
|
226
|
+
command: event.command || 'unknown',
|
|
227
|
+
error: error.message,
|
|
228
|
+
duration: `${duration}ms`,
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// Return error (don't throw) so Lambda doesn't retry
|
|
233
|
+
return errorResult;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const { instrumentHandler } = require('../telemetry/instrument-handler');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight dispatcher that executes integration event handlers.
|
|
5
|
+
* @param {import('../integrations/integration-base')} integrationInstance Pre-instantiated integration.
|
|
6
|
+
*/
|
|
7
|
+
class IntegrationEventDispatcher {
|
|
8
|
+
constructor(integrationInstance) {
|
|
9
|
+
if (!integrationInstance) {
|
|
10
|
+
throw new Error('Integration instance is required');
|
|
11
|
+
}
|
|
12
|
+
this.integrationInstance = integrationInstance;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async dispatchHttp({ event, req, res, next }) {
|
|
16
|
+
return this._dispatch(event, (instance, handler) =>
|
|
17
|
+
handler.call(instance, { req, res, next })
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async dispatchJob({ event, data, context, delivery }) {
|
|
22
|
+
return this._dispatch(event, (instance, handler) =>
|
|
23
|
+
handler.call(instance, { data, context, delivery })
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Resolve + invoke a handler, auto-instrumented. This
|
|
29
|
+
* is the seam for queue/webhook/defined-route dispatch; the `this.on` path
|
|
30
|
+
* (user actions, lifecycle) is instrumented in IntegrationBase.send().
|
|
31
|
+
*/
|
|
32
|
+
async _dispatch(event, invoke) {
|
|
33
|
+
const instance = this.integrationInstance;
|
|
34
|
+
const handler = this.findEventHandler(instance, event);
|
|
35
|
+
|
|
36
|
+
if (!handler) {
|
|
37
|
+
const name =
|
|
38
|
+
instance.constructor?.Definition?.name || 'integration';
|
|
39
|
+
throw new Error(`Event ${event} not registered for ${name}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const eventDef = this.findEventDef(instance, event);
|
|
43
|
+
|
|
44
|
+
return instrumentHandler(
|
|
45
|
+
instance.telemetry,
|
|
46
|
+
{ event, eventType: eventDef?.type },
|
|
47
|
+
() => invoke(instance, handler)
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
findEventHandler(integration, event) {
|
|
52
|
+
return this.findEventDef(integration, event)?.handler || null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
findEventDef(integration, event) {
|
|
56
|
+
if (integration.events && integration.events[event]) {
|
|
57
|
+
return integration.events[event];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (integration.defaultEvents && integration.defaultEvents[event]) {
|
|
61
|
+
return integration.defaultEvents[event];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
module.exports = { IntegrationEventDispatcher };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const crypto = require('node:crypto');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Admin Auth Middleware
|
|
5
|
+
*
|
|
6
|
+
* Shared authentication middleware for all admin endpoints:
|
|
7
|
+
* - /admin/db-migrate/*
|
|
8
|
+
* - /admin/scripts/*
|
|
9
|
+
*
|
|
10
|
+
* Uses simple ENV-based API key validation.
|
|
11
|
+
* Expects: x-frigg-admin-api-key header
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Constant-time comparison of two secrets. Hashing both to a fixed-length
|
|
16
|
+
* digest first means timingSafeEqual never throws on length mismatch and the
|
|
17
|
+
* comparison leaks neither the key nor its length.
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
function secretsMatch(provided, expected) {
|
|
21
|
+
const providedHash = crypto
|
|
22
|
+
.createHash('sha256')
|
|
23
|
+
.update(String(provided))
|
|
24
|
+
.digest();
|
|
25
|
+
const expectedHash = crypto
|
|
26
|
+
.createHash('sha256')
|
|
27
|
+
.update(String(expected))
|
|
28
|
+
.digest();
|
|
29
|
+
return crypto.timingSafeEqual(providedHash, expectedHash);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Validate admin API key from request header
|
|
34
|
+
* @param {import('express').Request} req
|
|
35
|
+
* @param {import('express').Response} res
|
|
36
|
+
* @param {import('express').NextFunction} next
|
|
37
|
+
*/
|
|
38
|
+
function validateAdminApiKey(req, res, next) {
|
|
39
|
+
const expectedKey = process.env.ADMIN_API_KEY;
|
|
40
|
+
|
|
41
|
+
// Check if admin API key is configured
|
|
42
|
+
if (!expectedKey) {
|
|
43
|
+
console.error('ADMIN_API_KEY environment variable not configured');
|
|
44
|
+
return res.status(401).json({
|
|
45
|
+
error: 'Unauthorized',
|
|
46
|
+
message: 'Admin API key not configured',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const apiKey = req.headers['x-frigg-admin-api-key'];
|
|
51
|
+
|
|
52
|
+
// Check if header is present
|
|
53
|
+
if (!apiKey) {
|
|
54
|
+
console.error('Missing x-frigg-admin-api-key header');
|
|
55
|
+
return res.status(401).json({
|
|
56
|
+
error: 'Unauthorized',
|
|
57
|
+
message: 'x-frigg-admin-api-key header required',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Validate key using a constant-time comparison
|
|
62
|
+
if (!secretsMatch(apiKey, expectedKey)) {
|
|
63
|
+
console.error('Invalid admin API key provided');
|
|
64
|
+
return res.status(401).json({
|
|
65
|
+
error: 'Unauthorized',
|
|
66
|
+
message: 'Invalid admin API key',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
next();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = { validateAdminApiKey };
|