@friggframework/core 2.0.0-next.11 → 2.0.0-next.110

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 (375) hide show
  1. package/CLAUDE.md +702 -0
  2. package/README.md +999 -50
  3. package/admin-scripts/index.js +52 -0
  4. package/admin-scripts/repositories/admin-script-execution-repository-documentdb.js +21 -0
  5. package/admin-scripts/repositories/admin-script-execution-repository-factory.js +51 -0
  6. package/admin-scripts/repositories/admin-script-execution-repository-interface.js +171 -0
  7. package/admin-scripts/repositories/admin-script-execution-repository-mongo.js +238 -0
  8. package/admin-scripts/repositories/admin-script-execution-repository-postgres.js +278 -0
  9. package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
  10. package/admin-scripts/repositories/script-schedule-repository-factory.js +51 -0
  11. package/admin-scripts/repositories/script-schedule-repository-interface.js +108 -0
  12. package/admin-scripts/repositories/script-schedule-repository-mongo.js +179 -0
  13. package/admin-scripts/repositories/script-schedule-repository-postgres.js +210 -0
  14. package/application/commands/README.md +451 -0
  15. package/application/commands/admin-script-commands.js +359 -0
  16. package/application/commands/credential-commands.js +262 -0
  17. package/application/commands/entity-commands.js +336 -0
  18. package/application/commands/integration-commands.js +356 -0
  19. package/application/commands/integration-mapping-commands.js +25 -0
  20. package/application/commands/process-commands.js +135 -0
  21. package/application/commands/report-commands.js +188 -0
  22. package/application/commands/scheduler-commands.js +263 -0
  23. package/application/commands/usage-commands.js +56 -0
  24. package/application/commands/user-commands.js +312 -0
  25. package/application/index.js +83 -0
  26. package/artifacts/repositories/artifact-repository-factory.js +19 -0
  27. package/artifacts/repositories/artifact-repository-interface.js +27 -0
  28. package/artifacts/repositories/artifact-repository-local.js +42 -0
  29. package/artifacts/repositories/artifact-repository-s3.js +61 -0
  30. package/assertions/index.js +0 -3
  31. package/core/CLAUDE.md +700 -0
  32. package/core/Worker.js +60 -24
  33. package/core/create-handler.js +189 -5
  34. package/core/parameters-to-env.js +257 -0
  35. package/core/ssm-preload.mjs +34 -0
  36. package/credential/repositories/credential-active-type.js +32 -0
  37. package/credential/repositories/credential-repository-documentdb.js +355 -0
  38. package/credential/repositories/credential-repository-factory.js +54 -0
  39. package/credential/repositories/credential-repository-interface.js +113 -0
  40. package/credential/repositories/credential-repository-mongo.js +294 -0
  41. package/credential/repositories/credential-repository-postgres.js +312 -0
  42. package/credential/repositories/credential-repository.js +300 -0
  43. package/credential/use-cases/get-credential-for-user.js +25 -0
  44. package/credential/use-cases/update-authentication-status.js +15 -0
  45. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  46. package/database/adapters/lambda-invoker.js +97 -0
  47. package/database/config.js +154 -0
  48. package/database/documentdb-encryption-service.js +330 -0
  49. package/database/documentdb-utils.js +192 -0
  50. package/database/encryption/README.md +839 -0
  51. package/database/encryption/documentdb-encryption-service.md +3575 -0
  52. package/database/encryption/encryption-schema-registry.js +401 -0
  53. package/database/encryption/field-encryption-service.js +254 -0
  54. package/database/encryption/logger.js +79 -0
  55. package/database/encryption/prisma-encryption-extension.js +230 -0
  56. package/database/index.js +21 -21
  57. package/database/prisma.js +182 -0
  58. package/database/repositories/health-check-repository-documentdb.js +138 -0
  59. package/database/repositories/health-check-repository-factory.js +48 -0
  60. package/database/repositories/health-check-repository-interface.js +82 -0
  61. package/database/repositories/health-check-repository-mongodb.js +89 -0
  62. package/database/repositories/health-check-repository-postgres.js +82 -0
  63. package/database/repositories/migration-status-repository-s3.js +137 -0
  64. package/database/use-cases/check-database-health-use-case.js +29 -0
  65. package/database/use-cases/check-database-state-use-case.js +81 -0
  66. package/database/use-cases/check-encryption-health-use-case.js +83 -0
  67. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  68. package/database/use-cases/get-migration-status-use-case.js +93 -0
  69. package/database/use-cases/resolve-migration-via-worker-use-case.js +49 -0
  70. package/database/use-cases/run-database-migration-use-case.js +139 -0
  71. package/database/use-cases/test-encryption-use-case.js +253 -0
  72. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  73. package/database/utils/mongodb-collection-utils.js +94 -0
  74. package/database/utils/mongodb-schema-init.js +108 -0
  75. package/database/utils/prisma-runner.js +491 -0
  76. package/database/utils/prisma-schema-parser.js +182 -0
  77. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
  78. package/encrypt/Cryptor.js +34 -168
  79. package/encrypt/index.js +1 -2
  80. package/errors/client-safe-error.js +26 -0
  81. package/errors/fetch-error.js +15 -7
  82. package/errors/index.js +2 -0
  83. package/generated/prisma-mongodb/client.d.ts +1 -0
  84. package/generated/prisma-mongodb/client.js +5 -0
  85. package/generated/prisma-mongodb/default.d.ts +1 -0
  86. package/generated/prisma-mongodb/default.js +5 -0
  87. package/generated/prisma-mongodb/edge.d.ts +1 -0
  88. package/generated/prisma-mongodb/edge.js +386 -0
  89. package/generated/prisma-mongodb/index-browser.js +368 -0
  90. package/generated/prisma-mongodb/index.d.ts +27065 -0
  91. package/generated/prisma-mongodb/index.js +411 -0
  92. package/generated/prisma-mongodb/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  93. package/generated/prisma-mongodb/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  94. package/generated/prisma-mongodb/package.json +183 -0
  95. package/generated/prisma-mongodb/runtime/edge-esm.js +35 -0
  96. package/generated/prisma-mongodb/runtime/edge.js +35 -0
  97. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  98. package/generated/prisma-mongodb/runtime/index-browser.js +17 -0
  99. package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
  100. package/generated/prisma-mongodb/runtime/library.js +147 -0
  101. package/generated/prisma-mongodb/runtime/react-native.js +84 -0
  102. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +85 -0
  103. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +38 -0
  104. package/generated/prisma-mongodb/schema.prisma +455 -0
  105. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +5 -0
  106. package/generated/prisma-mongodb/wasm-worker-loader.mjs +5 -0
  107. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  108. package/generated/prisma-mongodb/wasm.js +393 -0
  109. package/generated/prisma-postgresql/client.d.ts +1 -0
  110. package/generated/prisma-postgresql/client.js +5 -0
  111. package/generated/prisma-postgresql/default.d.ts +1 -0
  112. package/generated/prisma-postgresql/default.js +5 -0
  113. package/generated/prisma-postgresql/edge.d.ts +1 -0
  114. package/generated/prisma-postgresql/edge.js +407 -0
  115. package/generated/prisma-postgresql/index-browser.js +389 -0
  116. package/generated/prisma-postgresql/index.d.ts +29904 -0
  117. package/generated/prisma-postgresql/index.js +432 -0
  118. package/generated/prisma-postgresql/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  119. package/generated/prisma-postgresql/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  120. package/generated/prisma-postgresql/package.json +183 -0
  121. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  122. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  123. package/generated/prisma-postgresql/runtime/edge-esm.js +35 -0
  124. package/generated/prisma-postgresql/runtime/edge.js +35 -0
  125. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  126. package/generated/prisma-postgresql/runtime/index-browser.js +17 -0
  127. package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
  128. package/generated/prisma-postgresql/runtime/library.js +147 -0
  129. package/generated/prisma-postgresql/runtime/react-native.js +84 -0
  130. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +85 -0
  131. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +38 -0
  132. package/generated/prisma-postgresql/schema.prisma +436 -0
  133. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +5 -0
  134. package/generated/prisma-postgresql/wasm-worker-loader.mjs +5 -0
  135. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  136. package/generated/prisma-postgresql/wasm.js +414 -0
  137. package/handlers/WEBHOOKS.md +653 -0
  138. package/handlers/app-definition-loader.js +67 -0
  139. package/handlers/app-handler-helpers.js +3 -3
  140. package/handlers/backend-utils.js +271 -42
  141. package/handlers/database-migration-handler.js +227 -0
  142. package/handlers/integration-event-dispatcher.js +68 -0
  143. package/handlers/middleware/admin-auth.js +73 -0
  144. package/handlers/routers/HEALTHCHECK.md +342 -0
  145. package/handlers/routers/auth.js +4 -15
  146. package/handlers/routers/db-migration.handler.js +29 -0
  147. package/handlers/routers/db-migration.js +329 -0
  148. package/handlers/routers/health.js +518 -0
  149. package/handlers/routers/integration-defined-routers.js +85 -10
  150. package/handlers/routers/integration-webhook-routers.js +80 -0
  151. package/handlers/routers/user.js +27 -5
  152. package/handlers/routers/websocket.js +5 -3
  153. package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
  154. package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
  155. package/handlers/workers/db-migration.js +427 -0
  156. package/handlers/workers/dlq-processor.js +63 -0
  157. package/handlers/workers/integration-defined-workers.js +13 -7
  158. package/index.js +102 -46
  159. package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +184 -0
  160. package/infrastructure/scheduler/index.js +33 -0
  161. package/infrastructure/scheduler/mock-scheduler-adapter.js +143 -0
  162. package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
  163. package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
  164. package/integrations/EXTENSIONS.md +240 -0
  165. package/integrations/WEBHOOK-QUICKSTART.md +151 -0
  166. package/integrations/extension.js +254 -0
  167. package/integrations/index.js +20 -10
  168. package/integrations/integration-base.js +730 -74
  169. package/integrations/integration-router.js +398 -180
  170. package/integrations/options.js +1 -1
  171. package/integrations/repositories/config-patch-shared.js +43 -0
  172. package/integrations/repositories/integration-mapping-repository-documentdb.js +303 -0
  173. package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
  174. package/integrations/repositories/integration-mapping-repository-interface.js +120 -0
  175. package/integrations/repositories/integration-mapping-repository-mongo.js +183 -0
  176. package/integrations/repositories/integration-mapping-repository-postgres.js +255 -0
  177. package/integrations/repositories/integration-mapping-repository.js +156 -0
  178. package/integrations/repositories/integration-repository-documentdb.js +322 -0
  179. package/integrations/repositories/integration-repository-factory.js +51 -0
  180. package/integrations/repositories/integration-repository-interface.js +189 -0
  181. package/integrations/repositories/integration-repository-mongo.js +450 -0
  182. package/integrations/repositories/integration-repository-postgres.js +492 -0
  183. package/integrations/repositories/process-repository-documentdb.js +311 -0
  184. package/integrations/repositories/process-repository-factory.js +53 -0
  185. package/integrations/repositories/process-repository-interface.js +136 -0
  186. package/integrations/repositories/process-repository-mongo.js +262 -0
  187. package/integrations/repositories/process-repository-postgres.js +380 -0
  188. package/integrations/repositories/process-update-ops-shared.js +112 -0
  189. package/integrations/repositories/report-id.js +13 -0
  190. package/integrations/tests/doubles/config-capturing-integration.js +81 -0
  191. package/integrations/tests/doubles/dummy-integration-class.js +113 -0
  192. package/integrations/tests/doubles/test-integration-repository.js +146 -0
  193. package/integrations/use-cases/create-integration.js +215 -0
  194. package/integrations/use-cases/create-process.js +130 -0
  195. package/integrations/use-cases/delete-integration-for-user.js +119 -0
  196. package/integrations/use-cases/find-integration-by-entity-external-id.js +74 -0
  197. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +76 -0
  198. package/integrations/use-cases/get-integration-for-user.js +78 -0
  199. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  200. package/integrations/use-cases/get-integration-instance.js +83 -0
  201. package/integrations/use-cases/get-integrations-for-user.js +88 -0
  202. package/integrations/use-cases/get-possible-integrations.js +27 -0
  203. package/integrations/use-cases/get-process.js +89 -0
  204. package/integrations/use-cases/index.js +19 -0
  205. package/integrations/use-cases/list-integrations-by-entity-external-id.js +46 -0
  206. package/integrations/use-cases/load-integration-context.js +71 -0
  207. package/integrations/use-cases/patch-integration-config.js +39 -0
  208. package/integrations/use-cases/process-errors.js +28 -0
  209. package/integrations/use-cases/update-integration-config.js +32 -0
  210. package/integrations/use-cases/update-integration-messages.js +44 -0
  211. package/integrations/use-cases/update-integration-status.js +32 -0
  212. package/integrations/use-cases/update-integration.js +92 -0
  213. package/integrations/use-cases/update-process-metrics.js +222 -0
  214. package/integrations/use-cases/update-process-state.js +163 -0
  215. package/integrations/utils/map-integration-dto.js +37 -0
  216. package/jest-global-setup-noop.js +3 -0
  217. package/jest-global-teardown-noop.js +3 -0
  218. package/logs/logger.js +0 -4
  219. package/{module-plugin → modules}/index.js +0 -10
  220. package/modules/module-factory.js +56 -0
  221. package/modules/module.js +307 -0
  222. package/modules/repositories/module-repository-documentdb.js +350 -0
  223. package/modules/repositories/module-repository-factory.js +40 -0
  224. package/modules/repositories/module-repository-interface.js +145 -0
  225. package/modules/repositories/module-repository-mongo.js +436 -0
  226. package/modules/repositories/module-repository-postgres.js +481 -0
  227. package/modules/repositories/module-repository.js +369 -0
  228. package/modules/requester/api-key.js +52 -0
  229. package/modules/requester/oauth-2.js +555 -0
  230. package/modules/requester/requester.js +542 -0
  231. package/{module-plugin → modules}/test/mock-api/api.js +8 -3
  232. package/{module-plugin → modules}/test/mock-api/definition.js +14 -10
  233. package/modules/tests/doubles/test-module-factory.js +16 -0
  234. package/modules/tests/doubles/test-module-repository.js +39 -0
  235. package/modules/use-cases/get-entities-for-user.js +32 -0
  236. package/modules/use-cases/get-entity-options-by-id.js +71 -0
  237. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  238. package/modules/use-cases/get-module-instance-from-type.js +34 -0
  239. package/modules/use-cases/get-module.js +74 -0
  240. package/modules/use-cases/process-authorization-callback.js +243 -0
  241. package/modules/use-cases/refresh-entity-options.js +72 -0
  242. package/modules/use-cases/test-module-auth.js +72 -0
  243. package/modules/utils/map-module-dto.js +18 -0
  244. package/package.json +92 -50
  245. package/prisma-mongodb/schema.prisma +455 -0
  246. package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
  247. package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
  248. package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
  249. package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
  250. package/prisma-postgresql/migrations/20260422120000_add_entity_data_column/migration.sql +10 -0
  251. package/prisma-postgresql/migrations/20260422120001_create_process_table/migration.sql +48 -0
  252. package/prisma-postgresql/migrations/20260625000000_add_user_organization_id_index/migration.sql +2 -0
  253. package/prisma-postgresql/migrations/20260703000000_add_integration_status_in_creation_in_deletion/migration.sql +11 -0
  254. package/prisma-postgresql/migrations/20260703000001_integration_status_default_in_creation/migration.sql +8 -0
  255. package/prisma-postgresql/migrations/20260705000000_create_usage_counter/migration.sql +26 -0
  256. package/prisma-postgresql/migrations/20260706000000_add_admin_script_execution_and_schedule/migration.sql +61 -0
  257. package/prisma-postgresql/migrations/migration_lock.toml +3 -0
  258. package/prisma-postgresql/schema.prisma +436 -0
  259. package/queues/queuer-util.js +103 -21
  260. package/reporting/README.md +154 -0
  261. package/reporting/builtin-reports.js +6 -0
  262. package/reporting/index.js +13 -0
  263. package/reporting/report-base.js +49 -0
  264. package/reporting/reports/integrations-report.js +221 -0
  265. package/syncs/manager.js +468 -443
  266. package/syncs/repositories/sync-repository-documentdb.js +240 -0
  267. package/syncs/repositories/sync-repository-factory.js +43 -0
  268. package/syncs/repositories/sync-repository-interface.js +109 -0
  269. package/syncs/repositories/sync-repository-mongo.js +239 -0
  270. package/syncs/repositories/sync-repository-postgres.js +319 -0
  271. package/syncs/sync.js +0 -1
  272. package/telemetry/README.md +331 -0
  273. package/telemetry/bind-telemetry-context.js +73 -0
  274. package/telemetry/canonical-counters.js +52 -0
  275. package/telemetry/exporters.js +85 -0
  276. package/telemetry/index.js +26 -0
  277. package/telemetry/instrument-handler.js +87 -0
  278. package/telemetry/no-op-telemetry.js +67 -0
  279. package/telemetry/north-star.js +103 -0
  280. package/telemetry/otel-telemetry.js +213 -0
  281. package/telemetry/plugin-subscribers.js +77 -0
  282. package/telemetry/telemetry-config.js +120 -0
  283. package/telemetry/telemetry-context.js +40 -0
  284. package/telemetry/telemetry-event-bus.js +58 -0
  285. package/telemetry/telemetry-runtime.js +147 -0
  286. package/telemetry/telemetry-service.js +51 -0
  287. package/telemetry/usage-rollup-subscriber.js +116 -0
  288. package/token/repositories/token-repository-documentdb.js +137 -0
  289. package/token/repositories/token-repository-factory.js +40 -0
  290. package/token/repositories/token-repository-interface.js +131 -0
  291. package/token/repositories/token-repository-mongo.js +219 -0
  292. package/token/repositories/token-repository-postgres.js +264 -0
  293. package/token/repositories/token-repository.js +219 -0
  294. package/types/associations/index.d.ts +0 -17
  295. package/types/core/index.d.ts +12 -4
  296. package/types/database/index.d.ts +10 -2
  297. package/types/encrypt/index.d.ts +5 -3
  298. package/types/integrations/index.d.ts +3 -8
  299. package/types/module-plugin/index.d.ts +20 -69
  300. package/types/syncs/index.d.ts +0 -17
  301. package/usage/README.md +54 -0
  302. package/usage/index.js +17 -0
  303. package/usage/repositories/usage-repository-documentdb.js +194 -0
  304. package/usage/repositories/usage-repository-factory.js +25 -0
  305. package/usage/repositories/usage-repository-interface.js +37 -0
  306. package/usage/repositories/usage-repository-prisma.js +146 -0
  307. package/usage/tracked-metrics.js +38 -0
  308. package/usage/usage-windows.js +24 -0
  309. package/user/repositories/user-repository-documentdb.js +458 -0
  310. package/user/repositories/user-repository-factory.js +52 -0
  311. package/user/repositories/user-repository-interface.js +214 -0
  312. package/user/repositories/user-repository-mongo.js +323 -0
  313. package/user/repositories/user-repository-postgres.js +377 -0
  314. package/user/tests/doubles/test-user-repository.js +72 -0
  315. package/user/use-cases/authenticate-user.js +127 -0
  316. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  317. package/user/use-cases/create-individual-user.js +61 -0
  318. package/user/use-cases/create-organization-user.js +47 -0
  319. package/user/use-cases/create-token-for-user-id.js +30 -0
  320. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  321. package/user/use-cases/get-user-from-bearer-token.js +77 -0
  322. package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
  323. package/user/use-cases/login-user.js +122 -0
  324. package/user/user.js +125 -0
  325. package/utils/backend-path.js +38 -0
  326. package/utils/index.js +6 -0
  327. package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
  328. package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
  329. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  330. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  331. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  332. package/websocket/repositories/websocket-connection-repository.js +161 -0
  333. package/assertions/is-equal.js +0 -17
  334. package/associations/model.js +0 -54
  335. package/database/models/IndividualUser.js +0 -76
  336. package/database/models/OrganizationUser.js +0 -29
  337. package/database/models/State.js +0 -9
  338. package/database/models/Token.js +0 -70
  339. package/database/models/UserModel.js +0 -7
  340. package/database/models/WebsocketConnection.js +0 -49
  341. package/database/mongo.js +0 -45
  342. package/database/mongoose.js +0 -5
  343. package/encrypt/Cryptor.test.js +0 -32
  344. package/encrypt/encrypt.js +0 -132
  345. package/encrypt/encrypt.test.js +0 -1069
  346. package/encrypt/test-encrypt.js +0 -107
  347. package/errors/base-error.test.js +0 -32
  348. package/errors/fetch-error.test.js +0 -79
  349. package/errors/halt-error.test.js +0 -11
  350. package/errors/validation-errors.test.js +0 -120
  351. package/handlers/routers/middleware/loadUser.js +0 -15
  352. package/handlers/routers/middleware/requireLoggedInUser.js +0 -12
  353. package/integrations/create-frigg-backend.js +0 -31
  354. package/integrations/integration-factory.js +0 -251
  355. package/integrations/integration-mapping.js +0 -43
  356. package/integrations/integration-model.js +0 -46
  357. package/integrations/integration-user.js +0 -144
  358. package/integrations/test/integration-base.test.js +0 -144
  359. package/lambda/TimeoutCatcher.test.js +0 -68
  360. package/logs/logger.test.js +0 -76
  361. package/module-plugin/auther.js +0 -393
  362. package/module-plugin/credential.js +0 -22
  363. package/module-plugin/entity-manager.js +0 -70
  364. package/module-plugin/entity.js +0 -46
  365. package/module-plugin/manager.js +0 -169
  366. package/module-plugin/module-factory.js +0 -61
  367. package/module-plugin/requester/api-key.js +0 -36
  368. package/module-plugin/requester/oauth-2.js +0 -219
  369. package/module-plugin/requester/requester.js +0 -165
  370. package/module-plugin/requester/requester.test.js +0 -28
  371. package/module-plugin/test/auther.test.js +0 -97
  372. package/syncs/model.js +0 -62
  373. /package/{module-plugin → modules}/ModuleConstants.js +0 -0
  374. /package/{module-plugin → modules}/requester/basic.js +0 -0
  375. /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Admin Scripts Module
3
+ *
4
+ * Exports repository interfaces and factories for admin script management.
5
+ * Concrete implementations support MongoDB, PostgreSQL, and DocumentDB.
6
+ *
7
+ * Repository interfaces follow the Port pattern in Hexagonal Architecture:
8
+ * - Define contracts for data access
9
+ * - Enable dependency injection
10
+ * - Allow testing with mocks
11
+ * - Support multiple database implementations
12
+ *
13
+ * Authentication:
14
+ * - Uses ENV-based ADMIN_API_KEY (see handlers/middleware/admin-auth.js)
15
+ * - No database-backed API keys (simplified from original design)
16
+ */
17
+
18
+ // Repository Interfaces
19
+ const { AdminScriptExecutionRepositoryInterface } = require('./repositories/admin-script-execution-repository-interface');
20
+ const { ScriptScheduleRepositoryInterface } = require('./repositories/script-schedule-repository-interface');
21
+
22
+ // Repository Factories
23
+ const {
24
+ createAdminScriptExecutionRepository,
25
+ AdminScriptExecutionRepositoryMongo,
26
+ AdminScriptExecutionRepositoryPostgres,
27
+ AdminScriptExecutionRepositoryDocumentDB,
28
+ } = require('./repositories/admin-script-execution-repository-factory');
29
+ const {
30
+ createScriptScheduleRepository,
31
+ ScriptScheduleRepositoryMongo,
32
+ ScriptScheduleRepositoryPostgres,
33
+ ScriptScheduleRepositoryDocumentDB,
34
+ } = require('./repositories/script-schedule-repository-factory');
35
+
36
+ module.exports = {
37
+ // Repository Interfaces
38
+ AdminScriptExecutionRepositoryInterface,
39
+ ScriptScheduleRepositoryInterface,
40
+
41
+ // Repository Factories (primary exports for use cases)
42
+ createAdminScriptExecutionRepository,
43
+ createScriptScheduleRepository,
44
+
45
+ // Concrete Implementations (for testing)
46
+ AdminScriptExecutionRepositoryMongo,
47
+ AdminScriptExecutionRepositoryPostgres,
48
+ AdminScriptExecutionRepositoryDocumentDB,
49
+ ScriptScheduleRepositoryMongo,
50
+ ScriptScheduleRepositoryPostgres,
51
+ ScriptScheduleRepositoryDocumentDB,
52
+ };
@@ -0,0 +1,21 @@
1
+ const {
2
+ AdminScriptExecutionRepositoryMongo,
3
+ } = require('./admin-script-execution-repository-mongo');
4
+
5
+ /**
6
+ * DocumentDB Admin Process Repository Adapter
7
+ * Extends MongoDB implementation since DocumentDB uses the same Prisma client
8
+ *
9
+ * DocumentDB-specific characteristics:
10
+ * - Uses MongoDB-compatible API
11
+ * - Prisma client handles the connection
12
+ * - IDs are strings with ObjectId format
13
+ * - All operations identical to MongoDB implementation
14
+ */
15
+ class AdminScriptExecutionRepositoryDocumentDB extends AdminScriptExecutionRepositoryMongo {
16
+ constructor() {
17
+ super();
18
+ }
19
+ }
20
+
21
+ module.exports = { AdminScriptExecutionRepositoryDocumentDB };
@@ -0,0 +1,51 @@
1
+ const { AdminScriptExecutionRepositoryMongo } = require('./admin-script-execution-repository-mongo');
2
+ const { AdminScriptExecutionRepositoryPostgres } = require('./admin-script-execution-repository-postgres');
3
+ const {
4
+ AdminScriptExecutionRepositoryDocumentDB,
5
+ } = require('./admin-script-execution-repository-documentdb');
6
+ const config = require('../../database/config');
7
+
8
+ /**
9
+ * Admin Process Repository Factory
10
+ * Creates the appropriate repository adapter based on database type
11
+ *
12
+ * This implements the Factory pattern for Hexagonal Architecture:
13
+ * - Reads database type from app definition (backend/index.js)
14
+ * - Returns correct adapter (MongoDB, DocumentDB, or PostgreSQL)
15
+ * - Provides clear error for unsupported databases
16
+ *
17
+ * Usage:
18
+ * ```javascript
19
+ * const repository = createAdminScriptExecutionRepository();
20
+ * ```
21
+ *
22
+ * @returns {AdminScriptExecutionRepositoryInterface} Configured repository adapter
23
+ * @throws {Error} If database type is not supported
24
+ */
25
+ function createAdminScriptExecutionRepository() {
26
+ const dbType = config.DB_TYPE;
27
+
28
+ switch (dbType) {
29
+ case 'mongodb':
30
+ return new AdminScriptExecutionRepositoryMongo();
31
+
32
+ case 'postgresql':
33
+ return new AdminScriptExecutionRepositoryPostgres();
34
+
35
+ case 'documentdb':
36
+ return new AdminScriptExecutionRepositoryDocumentDB();
37
+
38
+ default:
39
+ throw new Error(
40
+ `Unsupported database type: ${dbType}. Supported values: 'mongodb', 'documentdb', 'postgresql'`
41
+ );
42
+ }
43
+ }
44
+
45
+ module.exports = {
46
+ createAdminScriptExecutionRepository,
47
+ // Export adapters for direct testing
48
+ AdminScriptExecutionRepositoryMongo,
49
+ AdminScriptExecutionRepositoryPostgres,
50
+ AdminScriptExecutionRepositoryDocumentDB,
51
+ };
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Admin Process Repository Interface
3
+ * Abstract base class defining the contract for admin process persistence adapters
4
+ *
5
+ * This follows the Port in Hexagonal Architecture:
6
+ * - Domain layer depends on this abstraction
7
+ * - Concrete adapters implement this interface
8
+ * - Use cases receive repositories via dependency injection
9
+ *
10
+ * Admin processes track administrative operations including:
11
+ * - Admin script executions
12
+ * - Database migrations
13
+ * - Scheduled maintenance tasks
14
+ *
15
+ * The AdminScriptExecution model uses a flexible JSON storage pattern:
16
+ * - context: Input parameters, trigger info, audit data, script version
17
+ * - results: Output data, logs, metrics, error details
18
+ *
19
+ * @abstract
20
+ */
21
+ class AdminScriptExecutionRepositoryInterface {
22
+ /**
23
+ * Create a new admin process record
24
+ *
25
+ * @param {Object} params - Process creation parameters
26
+ * @param {string} params.name - Name of the process (e.g., script name, migration name)
27
+ * @param {string} params.type - Type of process (e.g., 'ADMIN_SCRIPT', 'DB_MIGRATION')
28
+ * @param {Object} [params.context] - Context data (input, trigger, audit, script version)
29
+ * @param {string} [params.context.scriptVersion] - Version of the script
30
+ * @param {string} [params.context.trigger] - Trigger type ('MANUAL', 'SCHEDULED', 'QUEUE', 'WEBHOOK')
31
+ * @param {string} [params.context.mode] - Execution mode ('sync' or 'async')
32
+ * @param {Object} [params.context.input] - Input parameters
33
+ * @param {Object} [params.context.audit] - Audit information
34
+ * @param {string} [params.context.audit.apiKeyName] - Name of API key used
35
+ * @param {string} [params.context.audit.apiKeyLast4] - Last 4 chars of API key
36
+ * @param {string} [params.context.audit.ipAddress] - IP address of requester
37
+ * @param {string|number} [params.parentExecutionId] - ID of the execution that queued this one, for the parent/child hierarchy
38
+ * @returns {Promise<Object>} The created process record
39
+ * @abstract
40
+ */
41
+ async createExecution({ name, type, context, parentExecutionId }) {
42
+ throw new Error('Method createExecution must be implemented by subclass');
43
+ }
44
+
45
+ /**
46
+ * Find a process by its ID
47
+ *
48
+ * @param {string|number} id - The process ID
49
+ * @returns {Promise<Object|null>} The process record or null if not found
50
+ * @abstract
51
+ */
52
+ async findExecutionById(id) {
53
+ throw new Error(
54
+ 'Method findExecutionById must be implemented by subclass'
55
+ );
56
+ }
57
+
58
+ /**
59
+ * Find all processes with a specific name
60
+ *
61
+ * @param {string} name - The process name to filter by
62
+ * @param {Object} [options] - Query options
63
+ * @param {number} [options.limit] - Maximum number of results
64
+ * @param {number} [options.offset] - Number of results to skip
65
+ * @param {string} [options.sortBy] - Field to sort by
66
+ * @param {string} [options.sortOrder] - Sort order ('asc' or 'desc')
67
+ * @param {string} [options.state] - Optional state filter ('PENDING', 'RUNNING', 'COMPLETED', 'FAILED')
68
+ * @param {string} [options.type] - Optional type filter ('ADMIN_SCRIPT', 'REPORT', 'DB_MIGRATION')
69
+ * @param {Date} [options.from] - Optional lower bound (inclusive) on createdAt
70
+ * @param {Date} [options.to] - Optional upper bound (inclusive) on createdAt
71
+ * @returns {Promise<Array>} Array of process records
72
+ * @abstract
73
+ */
74
+ async findExecutionsByName(name, options = {}) {
75
+ throw new Error(
76
+ 'Method findExecutionsByName must be implemented by subclass'
77
+ );
78
+ }
79
+
80
+ /**
81
+ * Find all processes with a specific state
82
+ *
83
+ * @param {string} state - State to filter by ('PENDING', 'RUNNING', 'COMPLETED', 'FAILED')
84
+ * @param {Object} [options] - Query options
85
+ * @param {number} [options.limit] - Maximum number of results
86
+ * @param {number} [options.offset] - Number of results to skip
87
+ * @param {string} [options.sortBy] - Field to sort by
88
+ * @param {string} [options.sortOrder] - Sort order ('asc' or 'desc')
89
+ * @returns {Promise<Array>} Array of process records
90
+ * @abstract
91
+ */
92
+ async findExecutionsByState(state, options = {}) {
93
+ throw new Error(
94
+ 'Method findExecutionsByState must be implemented by subclass'
95
+ );
96
+ }
97
+
98
+ /**
99
+ * Update the state of a process
100
+ *
101
+ * @param {string|number} id - The process ID
102
+ * @param {string} state - New state value ('PENDING', 'RUNNING', 'COMPLETED', 'FAILED')
103
+ * @returns {Promise<Object>} Updated process record
104
+ * @abstract
105
+ */
106
+ async updateExecutionState(id, state) {
107
+ throw new Error(
108
+ 'Method updateExecutionState must be implemented by subclass'
109
+ );
110
+ }
111
+
112
+ /**
113
+ * Update the results of a process
114
+ * Merges new results with existing results in the results JSON field
115
+ *
116
+ * @param {string|number} id - The process ID
117
+ * @param {Object} results - Results data to merge
118
+ * @param {Object} [results.output] - Output data from the process
119
+ * @param {Object} [results.error] - Error information
120
+ * @param {string} [results.error.name] - Error name/type
121
+ * @param {string} [results.error.message] - Error message
122
+ * @param {string} [results.error.stack] - Error stack trace
123
+ * @param {Object} [results.metrics] - Performance metrics
124
+ * @param {Date} [results.metrics.startTime] - Process start time
125
+ * @param {Date} [results.metrics.endTime] - Process end time
126
+ * @param {number} [results.metrics.durationMs] - Duration in milliseconds
127
+ * @returns {Promise<Object>} Updated process record
128
+ * @abstract
129
+ */
130
+ async updateExecutionResults(id, results) {
131
+ throw new Error(
132
+ 'Method updateExecutionResults must be implemented by subclass'
133
+ );
134
+ }
135
+
136
+ /**
137
+ * Append a log entry to a process's log array in results
138
+ *
139
+ * @param {string|number} id - The process ID
140
+ * @param {Object} logEntry - Log entry to append
141
+ * @param {string} logEntry.level - Log level ('debug', 'info', 'warn', 'error')
142
+ * @param {string} logEntry.message - Log message
143
+ * @param {Object} [logEntry.data] - Additional log data
144
+ * @param {string} logEntry.timestamp - ISO timestamp
145
+ * @returns {Promise<Object>} Updated process record
146
+ * @abstract
147
+ */
148
+ async appendExecutionLog(id, logEntry) {
149
+ throw new Error(
150
+ 'Method appendExecutionLog must be implemented by subclass'
151
+ );
152
+ }
153
+
154
+ /**
155
+ * Delete all processes older than a specific date
156
+ * Used for cleanup and retention policies
157
+ *
158
+ * @param {Date} date - Delete processes older than this date
159
+ * @param {Object} [options] - Deletion options
160
+ * @param {string} [options.type] - Optional type filter, so report vs script retention can diverge
161
+ * @returns {Promise<Object>} Deletion result with count
162
+ * @abstract
163
+ */
164
+ async deleteExecutionsOlderThan(date, options = {}) {
165
+ throw new Error(
166
+ 'Method deleteExecutionsOlderThan must be implemented by subclass'
167
+ );
168
+ }
169
+ }
170
+
171
+ module.exports = { AdminScriptExecutionRepositoryInterface };
@@ -0,0 +1,238 @@
1
+ const { prisma } = require('../../database/prisma');
2
+ const {
3
+ AdminScriptExecutionRepositoryInterface,
4
+ } = require('./admin-script-execution-repository-interface');
5
+
6
+ /**
7
+ * MongoDB Admin Process Repository Adapter
8
+ * Handles admin process persistence using Prisma with MongoDB
9
+ *
10
+ * MongoDB-specific characteristics:
11
+ * - IDs are strings with @db.ObjectId
12
+ * - context and results are Json objects
13
+ * - Stores logs in results.logs array
14
+ */
15
+ class AdminScriptExecutionRepositoryMongo extends AdminScriptExecutionRepositoryInterface {
16
+ constructor() {
17
+ super();
18
+ this.prisma = prisma;
19
+ }
20
+
21
+ /**
22
+ * Create a new admin process record
23
+ *
24
+ * @param {Object} params - Process creation parameters
25
+ * @param {string} params.name - Name of the process
26
+ * @param {string} params.type - Type of process (e.g., 'ADMIN_SCRIPT', 'DB_MIGRATION')
27
+ * @param {Object} [params.context] - Context data
28
+ * @returns {Promise<Object>} The created process record
29
+ */
30
+ async createExecution({ name, type, context = {}, parentExecutionId }) {
31
+ const data = {
32
+ name,
33
+ type,
34
+ context,
35
+ results: { logs: [] },
36
+ ...(parentExecutionId != null && { parentExecutionId }),
37
+ };
38
+
39
+ const process = await this.prisma.adminScriptExecution.create({
40
+ data,
41
+ });
42
+
43
+ return process;
44
+ }
45
+
46
+ /**
47
+ * Find a process by its ID
48
+ *
49
+ * @param {string} id - The process ID
50
+ * @returns {Promise<Object|null>} The process record or null if not found
51
+ */
52
+ async findExecutionById(id) {
53
+ const process = await this.prisma.adminScriptExecution.findUnique({
54
+ where: { id },
55
+ });
56
+
57
+ return process;
58
+ }
59
+
60
+ /**
61
+ * Find all processes with a specific name
62
+ *
63
+ * @param {string} name - The process name to filter by
64
+ * @param {Object} [options] - Query options
65
+ * @param {number} [options.limit] - Maximum number of results
66
+ * @param {number} [options.offset] - Number of results to skip
67
+ * @param {string} [options.sortBy] - Field to sort by
68
+ * @param {string} [options.sortOrder] - Sort order ('asc' or 'desc')
69
+ * @returns {Promise<Array>} Array of process records
70
+ */
71
+ async findExecutionsByName(name, options = {}) {
72
+ const {
73
+ limit,
74
+ offset,
75
+ sortBy = 'createdAt',
76
+ sortOrder = 'desc',
77
+ state,
78
+ type,
79
+ from,
80
+ to,
81
+ } = options;
82
+
83
+ const where = { name };
84
+ if (state) where.state = state;
85
+ if (type) where.type = type;
86
+ if (from || to) {
87
+ where.createdAt = {};
88
+ if (from) where.createdAt.gte = from;
89
+ if (to) where.createdAt.lte = to;
90
+ }
91
+
92
+ const processes = await this.prisma.adminScriptExecution.findMany({
93
+ where,
94
+ orderBy: { [sortBy]: sortOrder },
95
+ take: limit,
96
+ skip: offset,
97
+ });
98
+
99
+ return processes;
100
+ }
101
+
102
+ /**
103
+ * Find all processes with a specific state
104
+ *
105
+ * @param {string} state - State to filter by
106
+ * @param {Object} [options] - Query options
107
+ * @param {number} [options.limit] - Maximum number of results
108
+ * @param {number} [options.offset] - Number of results to skip
109
+ * @param {string} [options.sortBy] - Field to sort by
110
+ * @param {string} [options.sortOrder] - Sort order ('asc' or 'desc')
111
+ * @returns {Promise<Array>} Array of process records
112
+ */
113
+ async findExecutionsByState(state, options = {}) {
114
+ const {
115
+ limit,
116
+ offset,
117
+ sortBy = 'createdAt',
118
+ sortOrder = 'desc',
119
+ } = options;
120
+
121
+ const processes = await this.prisma.adminScriptExecution.findMany({
122
+ where: { state },
123
+ orderBy: { [sortBy]: sortOrder },
124
+ take: limit,
125
+ skip: offset,
126
+ });
127
+
128
+ return processes;
129
+ }
130
+
131
+ /**
132
+ * Update the state of a process
133
+ *
134
+ * @param {string} id - The process ID
135
+ * @param {string} state - New state value
136
+ * @returns {Promise<Object>} Updated process record
137
+ */
138
+ async updateExecutionState(id, state) {
139
+ const process = await this.prisma.adminScriptExecution.update({
140
+ where: { id },
141
+ data: { state },
142
+ });
143
+
144
+ return process;
145
+ }
146
+
147
+ /**
148
+ * Update the results of a process
149
+ * Merges new results with existing results
150
+ *
151
+ * @param {string} id - The process ID
152
+ * @param {Object} results - Results data to merge
153
+ * @returns {Promise<Object>} Updated process record
154
+ */
155
+ async updateExecutionResults(id, results) {
156
+ // Get current process to merge results
157
+ const currentProcess = await this.prisma.adminScriptExecution.findUnique({
158
+ where: { id },
159
+ });
160
+
161
+ if (!currentProcess) {
162
+ throw new Error(`AdminScriptExecution ${id} not found`);
163
+ }
164
+
165
+ // Merge new results with existing results
166
+ const mergedResults = {
167
+ ...(currentProcess.results || {}),
168
+ ...results,
169
+ };
170
+
171
+ const process = await this.prisma.adminScriptExecution.update({
172
+ where: { id },
173
+ data: { results: mergedResults },
174
+ });
175
+
176
+ return process;
177
+ }
178
+
179
+ /**
180
+ * Append a log entry to a process's log array in results
181
+ *
182
+ * @param {string} id - The process ID
183
+ * @param {Object} logEntry - Log entry to append
184
+ * @param {string} logEntry.level - Log level ('debug', 'info', 'warn', 'error')
185
+ * @param {string} logEntry.message - Log message
186
+ * @param {Object} [logEntry.data] - Additional log data
187
+ * @param {string} logEntry.timestamp - ISO timestamp
188
+ * @returns {Promise<Object>} Updated process record
189
+ */
190
+ async appendExecutionLog(id, logEntry) {
191
+ // Get current process
192
+ const process = await this.prisma.adminScriptExecution.findUnique({
193
+ where: { id },
194
+ });
195
+
196
+ if (!process) {
197
+ throw new Error(`AdminScriptExecution ${id} not found`);
198
+ }
199
+
200
+ // Get current results and logs
201
+ const results = process.results || {};
202
+ const logs = Array.isArray(results.logs) ? [...results.logs] : [];
203
+ logs.push(logEntry);
204
+
205
+ // Update with new logs array in results
206
+ const updated = await this.prisma.adminScriptExecution.update({
207
+ where: { id },
208
+ data: { results: { ...results, logs } },
209
+ });
210
+
211
+ return updated;
212
+ }
213
+
214
+ /**
215
+ * Delete all processes older than a specific date
216
+ * Used for cleanup and retention policies
217
+ *
218
+ * @param {Date} date - Delete processes older than this date
219
+ * @param {Object} [options] - Deletion options
220
+ * @param {string} [options.type] - Optional type filter
221
+ * @returns {Promise<Object>} Deletion result with count
222
+ */
223
+ async deleteExecutionsOlderThan(date, { type } = {}) {
224
+ const where = { createdAt: { lt: date } };
225
+ if (type) where.type = type;
226
+
227
+ const result = await this.prisma.adminScriptExecution.deleteMany({
228
+ where,
229
+ });
230
+
231
+ return {
232
+ acknowledged: true,
233
+ deletedCount: result.count,
234
+ };
235
+ }
236
+ }
237
+
238
+ module.exports = { AdminScriptExecutionRepositoryMongo };