@friggframework/core 2.0.0-next.1 → 2.0.0-next.100

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 (342) hide show
  1. package/CLAUDE.md +702 -0
  2. package/README.md +959 -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 +166 -0
  7. package/admin-scripts/repositories/admin-script-execution-repository-mongo.js +228 -0
  8. package/admin-scripts/repositories/admin-script-execution-repository-postgres.js +268 -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 +358 -0
  16. package/application/commands/credential-commands.js +245 -0
  17. package/application/commands/entity-commands.js +336 -0
  18. package/application/commands/integration-commands.js +343 -0
  19. package/application/commands/process-commands.js +135 -0
  20. package/application/commands/scheduler-commands.js +263 -0
  21. package/application/commands/user-commands.js +312 -0
  22. package/application/index.js +82 -0
  23. package/assertions/index.js +0 -3
  24. package/core/CLAUDE.md +690 -0
  25. package/core/Worker.js +60 -24
  26. package/core/create-handler.js +84 -6
  27. package/credential/repositories/credential-repository-documentdb.js +304 -0
  28. package/credential/repositories/credential-repository-factory.js +54 -0
  29. package/credential/repositories/credential-repository-interface.js +98 -0
  30. package/credential/repositories/credential-repository-mongo.js +269 -0
  31. package/credential/repositories/credential-repository-postgres.js +287 -0
  32. package/credential/repositories/credential-repository.js +300 -0
  33. package/credential/use-cases/get-credential-for-user.js +25 -0
  34. package/credential/use-cases/update-authentication-status.js +15 -0
  35. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  36. package/database/adapters/lambda-invoker.js +97 -0
  37. package/database/config.js +154 -0
  38. package/database/documentdb-encryption-service.js +330 -0
  39. package/database/documentdb-utils.js +136 -0
  40. package/database/encryption/README.md +839 -0
  41. package/database/encryption/documentdb-encryption-service.md +3575 -0
  42. package/database/encryption/encryption-schema-registry.js +401 -0
  43. package/database/encryption/field-encryption-service.js +254 -0
  44. package/database/encryption/logger.js +79 -0
  45. package/database/encryption/prisma-encryption-extension.js +230 -0
  46. package/database/index.js +21 -21
  47. package/database/prisma.js +182 -0
  48. package/database/repositories/health-check-repository-documentdb.js +138 -0
  49. package/database/repositories/health-check-repository-factory.js +48 -0
  50. package/database/repositories/health-check-repository-interface.js +82 -0
  51. package/database/repositories/health-check-repository-mongodb.js +89 -0
  52. package/database/repositories/health-check-repository-postgres.js +82 -0
  53. package/database/repositories/migration-status-repository-s3.js +137 -0
  54. package/database/use-cases/check-database-health-use-case.js +29 -0
  55. package/database/use-cases/check-database-state-use-case.js +81 -0
  56. package/database/use-cases/check-encryption-health-use-case.js +83 -0
  57. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  58. package/database/use-cases/get-migration-status-use-case.js +93 -0
  59. package/database/use-cases/run-database-migration-use-case.js +139 -0
  60. package/database/use-cases/test-encryption-use-case.js +253 -0
  61. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  62. package/database/utils/mongodb-collection-utils.js +94 -0
  63. package/database/utils/mongodb-schema-init.js +108 -0
  64. package/database/utils/prisma-runner.js +477 -0
  65. package/database/utils/prisma-schema-parser.js +182 -0
  66. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
  67. package/encrypt/Cryptor.js +34 -168
  68. package/encrypt/index.js +1 -2
  69. package/errors/client-safe-error.js +26 -0
  70. package/errors/fetch-error.js +15 -7
  71. package/errors/index.js +2 -0
  72. package/generated/prisma-mongodb/client.d.ts +1 -0
  73. package/generated/prisma-mongodb/client.js +5 -0
  74. package/generated/prisma-mongodb/default.d.ts +1 -0
  75. package/generated/prisma-mongodb/default.js +5 -0
  76. package/generated/prisma-mongodb/edge.d.ts +1 -0
  77. package/generated/prisma-mongodb/edge.js +374 -0
  78. package/generated/prisma-mongodb/index-browser.js +356 -0
  79. package/generated/prisma-mongodb/index.d.ts +25667 -0
  80. package/generated/prisma-mongodb/index.js +399 -0
  81. package/generated/prisma-mongodb/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  82. package/generated/prisma-mongodb/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  83. package/generated/prisma-mongodb/package.json +183 -0
  84. package/generated/prisma-mongodb/runtime/edge-esm.js +35 -0
  85. package/generated/prisma-mongodb/runtime/edge.js +35 -0
  86. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  87. package/generated/prisma-mongodb/runtime/index-browser.js +17 -0
  88. package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
  89. package/generated/prisma-mongodb/runtime/library.js +147 -0
  90. package/generated/prisma-mongodb/runtime/react-native.js +84 -0
  91. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +85 -0
  92. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +38 -0
  93. package/generated/prisma-mongodb/schema.prisma +432 -0
  94. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +5 -0
  95. package/generated/prisma-mongodb/wasm-worker-loader.mjs +5 -0
  96. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  97. package/generated/prisma-mongodb/wasm.js +381 -0
  98. package/generated/prisma-postgresql/client.d.ts +1 -0
  99. package/generated/prisma-postgresql/client.js +5 -0
  100. package/generated/prisma-postgresql/default.d.ts +1 -0
  101. package/generated/prisma-postgresql/default.js +5 -0
  102. package/generated/prisma-postgresql/edge.d.ts +1 -0
  103. package/generated/prisma-postgresql/edge.js +395 -0
  104. package/generated/prisma-postgresql/index-browser.js +377 -0
  105. package/generated/prisma-postgresql/index.d.ts +28455 -0
  106. package/generated/prisma-postgresql/index.js +420 -0
  107. package/generated/prisma-postgresql/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  108. package/generated/prisma-postgresql/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  109. package/generated/prisma-postgresql/package.json +183 -0
  110. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  111. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  112. package/generated/prisma-postgresql/runtime/edge-esm.js +35 -0
  113. package/generated/prisma-postgresql/runtime/edge.js +35 -0
  114. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  115. package/generated/prisma-postgresql/runtime/index-browser.js +17 -0
  116. package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
  117. package/generated/prisma-postgresql/runtime/library.js +147 -0
  118. package/generated/prisma-postgresql/runtime/react-native.js +84 -0
  119. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +85 -0
  120. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +38 -0
  121. package/generated/prisma-postgresql/schema.prisma +414 -0
  122. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +5 -0
  123. package/generated/prisma-postgresql/wasm-worker-loader.mjs +5 -0
  124. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  125. package/generated/prisma-postgresql/wasm.js +402 -0
  126. package/handlers/WEBHOOKS.md +653 -0
  127. package/handlers/app-definition-loader.js +43 -0
  128. package/handlers/app-handler-helpers.js +57 -0
  129. package/handlers/backend-utils.js +316 -0
  130. package/handlers/database-migration-handler.js +227 -0
  131. package/handlers/integration-event-dispatcher.js +54 -0
  132. package/handlers/middleware/admin-auth.js +73 -0
  133. package/handlers/routers/HEALTHCHECK.md +342 -0
  134. package/handlers/routers/auth.js +15 -0
  135. package/handlers/routers/db-migration.handler.js +29 -0
  136. package/handlers/routers/db-migration.js +311 -0
  137. package/handlers/routers/health.js +518 -0
  138. package/handlers/routers/integration-defined-routers.js +117 -0
  139. package/handlers/routers/integration-webhook-routers.js +67 -0
  140. package/handlers/routers/reporting.js +9 -0
  141. package/handlers/routers/user.js +63 -0
  142. package/handlers/routers/websocket.js +57 -0
  143. package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
  144. package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
  145. package/handlers/workers/db-migration.js +352 -0
  146. package/handlers/workers/dlq-processor.js +63 -0
  147. package/handlers/workers/integration-defined-workers.js +30 -0
  148. package/index.js +111 -50
  149. package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +184 -0
  150. package/infrastructure/scheduler/index.js +33 -0
  151. package/infrastructure/scheduler/mock-scheduler-adapter.js +143 -0
  152. package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
  153. package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
  154. package/integrations/EXTENSIONS.md +240 -0
  155. package/integrations/WEBHOOK-QUICKSTART.md +151 -0
  156. package/integrations/extension.js +254 -0
  157. package/integrations/index.js +20 -10
  158. package/integrations/integration-base.js +619 -72
  159. package/integrations/integration-router.js +460 -218
  160. package/integrations/options.js +3 -4
  161. package/integrations/repositories/config-patch-shared.js +43 -0
  162. package/integrations/repositories/integration-mapping-repository-documentdb.js +280 -0
  163. package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
  164. package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
  165. package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
  166. package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
  167. package/integrations/repositories/integration-mapping-repository.js +156 -0
  168. package/integrations/repositories/integration-repository-documentdb.js +284 -0
  169. package/integrations/repositories/integration-repository-factory.js +51 -0
  170. package/integrations/repositories/integration-repository-interface.js +173 -0
  171. package/integrations/repositories/integration-repository-mongo.js +414 -0
  172. package/integrations/repositories/integration-repository-postgres.js +452 -0
  173. package/integrations/repositories/process-repository-documentdb.js +311 -0
  174. package/integrations/repositories/process-repository-factory.js +53 -0
  175. package/integrations/repositories/process-repository-interface.js +136 -0
  176. package/integrations/repositories/process-repository-mongo.js +262 -0
  177. package/integrations/repositories/process-repository-postgres.js +380 -0
  178. package/integrations/repositories/process-update-ops-shared.js +112 -0
  179. package/integrations/tests/doubles/config-capturing-integration.js +81 -0
  180. package/integrations/tests/doubles/dummy-integration-class.js +113 -0
  181. package/integrations/tests/doubles/test-integration-repository.js +146 -0
  182. package/integrations/use-cases/create-integration.js +215 -0
  183. package/integrations/use-cases/create-process.js +130 -0
  184. package/integrations/use-cases/delete-integration-for-user.js +119 -0
  185. package/integrations/use-cases/find-integration-by-entity-external-id.js +74 -0
  186. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +76 -0
  187. package/integrations/use-cases/get-integration-for-user.js +78 -0
  188. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  189. package/integrations/use-cases/get-integration-instance.js +83 -0
  190. package/integrations/use-cases/get-integrations-for-user.js +88 -0
  191. package/integrations/use-cases/get-possible-integrations.js +27 -0
  192. package/integrations/use-cases/get-process.js +89 -0
  193. package/integrations/use-cases/index.js +19 -0
  194. package/integrations/use-cases/list-integrations-by-entity-external-id.js +46 -0
  195. package/integrations/use-cases/load-integration-context.js +71 -0
  196. package/integrations/use-cases/patch-integration-config.js +39 -0
  197. package/integrations/use-cases/process-errors.js +28 -0
  198. package/integrations/use-cases/update-integration-config.js +32 -0
  199. package/integrations/use-cases/update-integration-messages.js +44 -0
  200. package/integrations/use-cases/update-integration-status.js +32 -0
  201. package/integrations/use-cases/update-integration.js +92 -0
  202. package/integrations/use-cases/update-process-metrics.js +216 -0
  203. package/integrations/use-cases/update-process-state.js +163 -0
  204. package/integrations/utils/map-integration-dto.js +37 -0
  205. package/jest-global-setup-noop.js +3 -0
  206. package/jest-global-teardown-noop.js +3 -0
  207. package/logs/logger.js +0 -4
  208. package/{module-plugin → modules}/index.js +0 -10
  209. package/modules/module-factory.js +56 -0
  210. package/modules/module.js +274 -0
  211. package/modules/repositories/module-repository-documentdb.js +350 -0
  212. package/modules/repositories/module-repository-factory.js +40 -0
  213. package/modules/repositories/module-repository-interface.js +145 -0
  214. package/modules/repositories/module-repository-mongo.js +436 -0
  215. package/modules/repositories/module-repository-postgres.js +481 -0
  216. package/modules/repositories/module-repository.js +369 -0
  217. package/modules/requester/api-key.js +52 -0
  218. package/modules/requester/oauth-2.js +396 -0
  219. package/modules/requester/requester.js +285 -0
  220. package/{module-plugin → modules}/test/mock-api/api.js +8 -3
  221. package/{module-plugin → modules}/test/mock-api/definition.js +14 -10
  222. package/modules/tests/doubles/test-module-factory.js +16 -0
  223. package/modules/tests/doubles/test-module-repository.js +39 -0
  224. package/modules/use-cases/get-entities-for-user.js +32 -0
  225. package/modules/use-cases/get-entity-options-by-id.js +71 -0
  226. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  227. package/modules/use-cases/get-module-instance-from-type.js +34 -0
  228. package/modules/use-cases/get-module.js +74 -0
  229. package/modules/use-cases/process-authorization-callback.js +243 -0
  230. package/modules/use-cases/refresh-entity-options.js +72 -0
  231. package/modules/use-cases/test-module-auth.js +72 -0
  232. package/modules/utils/map-module-dto.js +18 -0
  233. package/package.json +82 -50
  234. package/prisma-mongodb/schema.prisma +432 -0
  235. package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
  236. package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
  237. package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
  238. package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
  239. package/prisma-postgresql/migrations/20260422120000_add_entity_data_column/migration.sql +10 -0
  240. package/prisma-postgresql/migrations/20260422120001_create_process_table/migration.sql +48 -0
  241. package/prisma-postgresql/migrations/20260625000000_add_user_organization_id_index/migration.sql +2 -0
  242. package/prisma-postgresql/migrations/20260703000000_add_integration_status_in_creation_in_deletion/migration.sql +11 -0
  243. package/prisma-postgresql/migrations/20260703000001_integration_status_default_in_creation/migration.sql +8 -0
  244. package/prisma-postgresql/migrations/20260706000000_add_admin_script_execution_and_schedule/migration.sql +61 -0
  245. package/prisma-postgresql/migrations/migration_lock.toml +3 -0
  246. package/prisma-postgresql/schema.prisma +414 -0
  247. package/queues/queuer-util.js +103 -21
  248. package/reporting/README.md +86 -0
  249. package/reporting/index.js +17 -0
  250. package/reporting/reporting-router.js +77 -0
  251. package/reporting/repositories/reporting-repository-documentdb.js +127 -0
  252. package/reporting/repositories/reporting-repository-factory.js +35 -0
  253. package/reporting/repositories/reporting-repository-interface.js +16 -0
  254. package/reporting/repositories/reporting-repository-mongo.js +54 -0
  255. package/reporting/repositories/reporting-repository-postgres.js +70 -0
  256. package/reporting/use-cases/index.js +6 -0
  257. package/reporting/use-cases/list-integrations-report.js +142 -0
  258. package/syncs/manager.js +468 -443
  259. package/syncs/repositories/sync-repository-documentdb.js +240 -0
  260. package/syncs/repositories/sync-repository-factory.js +43 -0
  261. package/syncs/repositories/sync-repository-interface.js +109 -0
  262. package/syncs/repositories/sync-repository-mongo.js +239 -0
  263. package/syncs/repositories/sync-repository-postgres.js +319 -0
  264. package/syncs/sync.js +0 -1
  265. package/token/repositories/token-repository-documentdb.js +137 -0
  266. package/token/repositories/token-repository-factory.js +40 -0
  267. package/token/repositories/token-repository-interface.js +131 -0
  268. package/token/repositories/token-repository-mongo.js +219 -0
  269. package/token/repositories/token-repository-postgres.js +264 -0
  270. package/token/repositories/token-repository.js +219 -0
  271. package/types/associations/index.d.ts +0 -17
  272. package/types/core/index.d.ts +12 -4
  273. package/types/database/index.d.ts +10 -2
  274. package/types/encrypt/index.d.ts +5 -3
  275. package/types/integrations/index.d.ts +3 -8
  276. package/types/module-plugin/index.d.ts +17 -69
  277. package/types/syncs/index.d.ts +0 -17
  278. package/user/repositories/user-repository-documentdb.js +458 -0
  279. package/user/repositories/user-repository-factory.js +52 -0
  280. package/user/repositories/user-repository-interface.js +214 -0
  281. package/user/repositories/user-repository-mongo.js +323 -0
  282. package/user/repositories/user-repository-postgres.js +377 -0
  283. package/user/tests/doubles/test-user-repository.js +72 -0
  284. package/user/use-cases/authenticate-user.js +127 -0
  285. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  286. package/user/use-cases/create-individual-user.js +61 -0
  287. package/user/use-cases/create-organization-user.js +47 -0
  288. package/user/use-cases/create-token-for-user-id.js +30 -0
  289. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  290. package/user/use-cases/get-user-from-bearer-token.js +77 -0
  291. package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
  292. package/user/use-cases/login-user.js +122 -0
  293. package/user/user.js +125 -0
  294. package/utils/backend-path.js +38 -0
  295. package/utils/index.js +6 -0
  296. package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
  297. package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
  298. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  299. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  300. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  301. package/websocket/repositories/websocket-connection-repository.js +161 -0
  302. package/assertions/is-equal.js +0 -17
  303. package/associations/model.js +0 -54
  304. package/database/models/IndividualUser.js +0 -76
  305. package/database/models/OrganizationUser.js +0 -29
  306. package/database/models/State.js +0 -9
  307. package/database/models/Token.js +0 -70
  308. package/database/models/UserModel.js +0 -7
  309. package/database/models/WebsocketConnection.js +0 -49
  310. package/database/mongo.js +0 -45
  311. package/database/mongoose.js +0 -5
  312. package/encrypt/Cryptor.test.js +0 -32
  313. package/encrypt/encrypt.js +0 -132
  314. package/encrypt/encrypt.test.js +0 -1069
  315. package/encrypt/test-encrypt.js +0 -107
  316. package/errors/base-error.test.js +0 -32
  317. package/errors/fetch-error.test.js +0 -79
  318. package/errors/halt-error.test.js +0 -11
  319. package/errors/validation-errors.test.js +0 -120
  320. package/integrations/create-frigg-backend.js +0 -31
  321. package/integrations/integration-factory.js +0 -251
  322. package/integrations/integration-mapping.js +0 -43
  323. package/integrations/integration-model.js +0 -46
  324. package/integrations/integration-user.js +0 -144
  325. package/integrations/test/integration-base.test.js +0 -144
  326. package/lambda/TimeoutCatcher.test.js +0 -68
  327. package/logs/logger.test.js +0 -76
  328. package/module-plugin/auther.js +0 -350
  329. package/module-plugin/credential.js +0 -22
  330. package/module-plugin/entity-manager.js +0 -70
  331. package/module-plugin/entity.js +0 -46
  332. package/module-plugin/manager.js +0 -169
  333. package/module-plugin/module-factory.js +0 -61
  334. package/module-plugin/requester/api-key.js +0 -36
  335. package/module-plugin/requester/oauth-2.js +0 -219
  336. package/module-plugin/requester/requester.js +0 -165
  337. package/module-plugin/requester/requester.test.js +0 -28
  338. package/module-plugin/test/auther.test.js +0 -97
  339. package/syncs/model.js +0 -62
  340. /package/{module-plugin → modules}/ModuleConstants.js +0 -0
  341. /package/{module-plugin → modules}/requester/basic.js +0 -0
  342. /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
@@ -0,0 +1,432 @@
1
+ // Frigg Framework - Prisma Schema
2
+ // MongoDB database schema for enterprise integration platform
3
+ // Migration from Mongoose ODM to Prisma ORM
4
+
5
+ generator client {
6
+ provider = "prisma-client-js"
7
+ output = "../generated/prisma-mongodb"
8
+ binaryTargets = ["native", "rhel-openssl-3.0.x"] // native for local dev, rhel for Lambda deployment
9
+ // Library engine (default since Prisma 3.x): Rust query engine loads as a
10
+ // Node-API addon inside the same process. The binary engine forks a child
11
+ // query-engine subprocess and communicates over a local HTTP/IPC pipe with
12
+ // NO client-side timeout — a zombied child wedges the Node process until
13
+ // Lambda's 900s cap. Switching to library eliminates that entire class of
14
+ // silent hangs. See friggframework/frigg#580 for the investigation.
15
+ engineType = "library"
16
+ }
17
+
18
+ datasource db {
19
+ provider = "mongodb"
20
+ url = env("DATABASE_URL")
21
+ }
22
+
23
+ // ============================================================================
24
+ // USER MODELS
25
+ // ============================================================================
26
+
27
+ /// User model with discriminator pattern support
28
+ /// Replaces Mongoose discriminators (IndividualUser, OrganizationUser)
29
+ model User {
30
+ id String @id @default(auto()) @map("_id") @db.ObjectId
31
+ type UserType
32
+
33
+ // Timestamps
34
+ createdAt DateTime @default(now())
35
+ updatedAt DateTime @updatedAt
36
+
37
+ // IndividualUser fields (nullable for organizations)
38
+ email String?
39
+ username String?
40
+ hashword String? // Bcrypt hashed password (handled in application layer)
41
+ appUserId String?
42
+ organizationId String? @db.ObjectId
43
+
44
+ // Self-referential relation for organization membership
45
+ organization User? @relation("OrgMembers", fields: [organizationId], references: [id], onDelete: NoAction, onUpdate: NoAction)
46
+ members User[] @relation("OrgMembers")
47
+
48
+ // OrganizationUser fields (nullable for individuals)
49
+ appOrgId String?
50
+ name String?
51
+
52
+ // Relations
53
+ tokens Token[]
54
+ credentials Credential[]
55
+ entities Entity[]
56
+ integrations Integration[]
57
+ processes Process[]
58
+
59
+ @@unique([username, appUserId])
60
+ @@index([type])
61
+ @@index([appUserId])
62
+ @@index([organizationId])
63
+ @@map("User")
64
+ }
65
+
66
+ enum UserType {
67
+ INDIVIDUAL
68
+ ORGANIZATION
69
+ }
70
+
71
+ // ============================================================================
72
+ // AUTHENTICATION MODELS
73
+ // ============================================================================
74
+
75
+ /// Authentication tokens with expiration
76
+ /// Bcrypt hashed tokens stored (handled in application layer)
77
+ model Token {
78
+ id String @id @default(auto()) @map("_id") @db.ObjectId
79
+ token String // Bcrypt hashed
80
+ created DateTime @default(now())
81
+ expires DateTime?
82
+ userId String @db.ObjectId
83
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
84
+
85
+ @@index([userId])
86
+ @@index([expires])
87
+ @@map("Token")
88
+ }
89
+
90
+ // ============================================================================
91
+ // CREDENTIAL & ENTITY MODELS
92
+ // ============================================================================
93
+
94
+ /// OAuth credentials and API tokens
95
+ /// All sensitive data encrypted with KMS at rest
96
+ model Credential {
97
+ id String @id @default(auto()) @map("_id") @db.ObjectId
98
+ userId String? @db.ObjectId
99
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
100
+ authIsValid Boolean?
101
+ externalId String?
102
+
103
+ // Dynamic OAuth fields stored as JSON (encrypted via Prisma middleware)
104
+ // Contains: access_token, refresh_token, domain, expires_in, token_type, etc.
105
+ data Json @default("{}")
106
+
107
+ createdAt DateTime @default(now())
108
+ updatedAt DateTime @updatedAt
109
+
110
+ // Relations
111
+ entities Entity[]
112
+
113
+ @@index([userId])
114
+ @@index([externalId])
115
+ @@map("Credential")
116
+ }
117
+
118
+ /// External service entities (API connections)
119
+ model Entity {
120
+ id String @id @default(auto()) @map("_id") @db.ObjectId
121
+ credentialId String? @db.ObjectId
122
+ credential Credential? @relation(fields: [credentialId], references: [id], onDelete: SetNull)
123
+ userId String? @db.ObjectId
124
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
125
+ name String?
126
+ moduleName String?
127
+ externalId String?
128
+
129
+ data Json @default("{}")
130
+
131
+ createdAt DateTime @default(now())
132
+ updatedAt DateTime @updatedAt
133
+
134
+ // Relations - many-to-many with scalar lists
135
+ integrations Integration[] @relation("IntegrationEntities", fields: [integrationIds], references: [id])
136
+ integrationIds String[] @db.ObjectId
137
+
138
+ syncs Sync[] @relation("SyncEntities", fields: [syncIds], references: [id])
139
+ syncIds String[] @db.ObjectId
140
+
141
+ dataIdentifiers DataIdentifier[]
142
+ associationObjects AssociationObject[]
143
+
144
+ @@index([userId])
145
+ @@index([externalId])
146
+ @@index([moduleName])
147
+ @@index([credentialId])
148
+ @@map("Entity")
149
+ }
150
+
151
+ // ============================================================================
152
+ // INTEGRATION MODELS
153
+ // ============================================================================
154
+
155
+ /// Main integration configuration and state
156
+ model Integration {
157
+ id String @id @default(auto()) @map("_id") @db.ObjectId
158
+ userId String? @db.ObjectId
159
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
160
+ status IntegrationStatus @default(IN_CREATION)
161
+
162
+ // Configuration and version
163
+ config Json? // Integration configuration object
164
+ version String?
165
+
166
+ // Entity references (many-to-many via explicit scalar list)
167
+ entities Entity[] @relation("IntegrationEntities", fields: [entityIds], references: [id])
168
+ entityIds String[] @db.ObjectId
169
+
170
+ // Message arrays (stored as JSON)
171
+ errors Json @default("[]")
172
+ warnings Json @default("[]")
173
+ info Json @default("[]")
174
+ logs Json @default("[]")
175
+
176
+ createdAt DateTime @default(now())
177
+ updatedAt DateTime @updatedAt
178
+
179
+ // Relations
180
+ associations Association[]
181
+ syncs Sync[]
182
+ mappings IntegrationMapping[]
183
+ processes Process[]
184
+
185
+ @@index([userId])
186
+ @@index([status])
187
+ @@map("Integration")
188
+ }
189
+
190
+ enum IntegrationStatus {
191
+ ENABLED
192
+ NEEDS_CONFIG
193
+ PROCESSING
194
+ DISABLED
195
+ ERROR
196
+ IN_CREATION
197
+ IN_DELETION
198
+ }
199
+
200
+ /// Integration-specific data mappings
201
+ /// All mapping data encrypted with KMS
202
+ model IntegrationMapping {
203
+ id String @id @default(auto()) @map("_id") @db.ObjectId
204
+ integrationId String @db.ObjectId
205
+ integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
206
+ sourceId String?
207
+
208
+ // Encrypted mapping data (handled via Prisma middleware)
209
+ mapping Json?
210
+
211
+ createdAt DateTime @default(now())
212
+ updatedAt DateTime @updatedAt
213
+
214
+ @@unique([integrationId, sourceId])
215
+ @@index([integrationId])
216
+ @@index([sourceId])
217
+ @@map("IntegrationMapping")
218
+ }
219
+
220
+ // ============================================================================
221
+ // PROCESS MODELS
222
+ // ============================================================================
223
+
224
+ /// Generic Process Model - tracks any long-running operation
225
+ /// Used for: CRM syncs, data migrations, bulk operations, etc.
226
+ model Process {
227
+ id String @id @default(auto()) @map("_id") @db.ObjectId
228
+
229
+ // Core references
230
+ userId String @db.ObjectId
231
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
232
+ integrationId String @db.ObjectId
233
+ integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
234
+
235
+ // Process identification
236
+ name String // e.g., "zoho-crm-contact-sync", "pipedrive-lead-sync"
237
+ type String // e.g., "CRM_SYNC", "DATA_MIGRATION", "BULK_OPERATION"
238
+
239
+ // State machine
240
+ state String // Current state (integration-defined states)
241
+
242
+ // Flexible storage
243
+ context Json @default("{}") // Process-specific data (pagination, metadata, etc.)
244
+ results Json @default("{}") // Process results and metrics
245
+
246
+ // Hierarchy support
247
+ childProcesses String[] @db.ObjectId
248
+ parentProcessId String? @db.ObjectId
249
+
250
+ // Timestamps
251
+ createdAt DateTime @default(now())
252
+ updatedAt DateTime @updatedAt
253
+
254
+ @@index([userId])
255
+ @@index([integrationId])
256
+ @@index([type])
257
+ @@index([state])
258
+ @@index([name])
259
+ @@map("Process")
260
+ }
261
+
262
+ // ============================================================================
263
+ // SYNC MODELS
264
+ // ============================================================================
265
+
266
+ /// Bidirectional data synchronization tracking
267
+ model Sync {
268
+ id String @id @default(auto()) @map("_id") @db.ObjectId
269
+ integrationId String? @db.ObjectId
270
+ integration Integration? @relation(fields: [integrationId], references: [id], onDelete: Cascade)
271
+
272
+ // Entity references (many-to-many via explicit scalar list)
273
+ entities Entity[] @relation("SyncEntities", fields: [entityIds], references: [id])
274
+ entityIds String[] @db.ObjectId
275
+
276
+ hash String
277
+ name String
278
+
279
+ // Data identifiers (extracted to separate model)
280
+ dataIdentifiers DataIdentifier[]
281
+
282
+ @@index([integrationId])
283
+ @@index([hash])
284
+ @@index([name])
285
+ @@map("Sync")
286
+ }
287
+
288
+ /// Data identifier for sync operations
289
+ /// Replaces nested array structure in Mongoose
290
+ model DataIdentifier {
291
+ id String @id @default(auto()) @map("_id") @db.ObjectId
292
+ syncId String? @db.ObjectId
293
+ sync Sync? @relation(fields: [syncId], references: [id], onDelete: Cascade)
294
+ entityId String @db.ObjectId
295
+ entity Entity @relation(fields: [entityId], references: [id], onDelete: Cascade)
296
+
297
+ // Identifier data (can be any structure)
298
+ idData Json
299
+
300
+ hash String
301
+
302
+ @@index([syncId])
303
+ @@index([entityId])
304
+ @@index([hash])
305
+ @@map("DataIdentifier")
306
+ }
307
+
308
+ // ============================================================================
309
+ // ASSOCIATION MODELS
310
+ // ============================================================================
311
+
312
+ /// Entity associations with cardinality tracking
313
+ model Association {
314
+ id String @id @default(auto()) @map("_id") @db.ObjectId
315
+ integrationId String @db.ObjectId
316
+ integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
317
+ name String
318
+ type AssociationType
319
+ primaryObject String
320
+
321
+ // Associated objects (extracted to separate model)
322
+ objects AssociationObject[]
323
+
324
+ @@index([integrationId])
325
+ @@index([name])
326
+ @@map("Association")
327
+ }
328
+
329
+ /// Association object entry
330
+ /// Replaces nested array structure in Mongoose
331
+ model AssociationObject {
332
+ id String @id @default(auto()) @map("_id") @db.ObjectId
333
+ associationId String @db.ObjectId
334
+ association Association @relation(fields: [associationId], references: [id], onDelete: Cascade)
335
+ entityId String @db.ObjectId
336
+ entity Entity @relation(fields: [entityId], references: [id], onDelete: Cascade)
337
+ objectType String
338
+ objId String
339
+ metadata Json? // Optional metadata
340
+
341
+ @@index([associationId])
342
+ @@index([entityId])
343
+ @@map("AssociationObject")
344
+ }
345
+
346
+ enum AssociationType {
347
+ ONE_TO_MANY
348
+ ONE_TO_ONE
349
+ MANY_TO_ONE
350
+ }
351
+
352
+ // ============================================================================
353
+ // UTILITY MODELS
354
+ // ============================================================================
355
+
356
+ /// Generic state storage
357
+ model State {
358
+ id String @id @default(auto()) @map("_id") @db.ObjectId
359
+ state Json?
360
+
361
+ @@map("State")
362
+ }
363
+
364
+ /// AWS API Gateway WebSocket connection tracking
365
+ model WebsocketConnection {
366
+ id String @id @default(auto()) @map("_id") @db.ObjectId
367
+ connectionId String?
368
+
369
+ @@index([connectionId])
370
+ @@map("WebsocketConnection")
371
+ }
372
+
373
+ // ============================================================================
374
+ // ADMIN PROCESS MODELS
375
+ // ============================================================================
376
+
377
+ /// Admin process state machine
378
+ enum AdminScriptExecutionState {
379
+ PENDING
380
+ RUNNING
381
+ COMPLETED
382
+ FAILED
383
+ }
384
+
385
+ /// Admin process tracking (like Process but without user/integration FK)
386
+ /// Used for: admin scripts, db migrations, system maintenance tasks
387
+ model AdminScriptExecution {
388
+ id String @id @default(auto()) @map("_id") @db.ObjectId
389
+ name String // e.g., "oauth-token-refresh", "db-migration-xyz"
390
+ type String // e.g., "ADMIN_SCRIPT", "DB_MIGRATION"
391
+
392
+ // State machine
393
+ state AdminScriptExecutionState @default(PENDING)
394
+
395
+ // Flexible storage (mirrors Process model pattern)
396
+ context Json @default("{}") // input, trigger, audit info, script version
397
+ results Json @default("{}") // output, logs, metrics, errors
398
+
399
+ // Hierarchy support
400
+ childExecutions String[] @db.ObjectId
401
+ parentExecutionId String? @db.ObjectId
402
+
403
+ // Timestamps
404
+ createdAt DateTime @default(now())
405
+ updatedAt DateTime @updatedAt
406
+
407
+ @@index([name, createdAt(sort: Desc)])
408
+ @@index([state])
409
+ @@index([type])
410
+ @@map("AdminScriptExecution")
411
+ }
412
+
413
+ /// Script scheduling configuration for hybrid scheduling (SQS + EventBridge)
414
+ model ScriptSchedule {
415
+ id String @id @default(auto()) @map("_id") @db.ObjectId
416
+ scriptName String @unique
417
+ enabled Boolean @default(false)
418
+ cronExpression String?
419
+ timezone String @default("UTC")
420
+ lastTriggeredAt DateTime?
421
+ nextTriggerAt DateTime?
422
+
423
+ // External Scheduler (e.g., AWS EventBridge Scheduler)
424
+ externalScheduleId String?
425
+ externalScheduleName String?
426
+
427
+ createdAt DateTime @default(now())
428
+ updatedAt DateTime @updatedAt
429
+
430
+ @@index([enabled])
431
+ @@map("ScriptSchedule")
432
+ }