@friggframework/core 2.0.0-next.6 → 2.0.0-next.60

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 (285) hide show
  1. package/CLAUDE.md +694 -0
  2. package/README.md +959 -50
  3. package/application/commands/README.md +451 -0
  4. package/application/commands/credential-commands.js +245 -0
  5. package/application/commands/entity-commands.js +336 -0
  6. package/application/commands/integration-commands.js +210 -0
  7. package/application/commands/user-commands.js +283 -0
  8. package/application/index.js +69 -0
  9. package/core/CLAUDE.md +690 -0
  10. package/core/Worker.js +8 -21
  11. package/core/create-handler.js +14 -7
  12. package/credential/repositories/credential-repository-documentdb.js +304 -0
  13. package/credential/repositories/credential-repository-factory.js +54 -0
  14. package/credential/repositories/credential-repository-interface.js +98 -0
  15. package/credential/repositories/credential-repository-mongo.js +269 -0
  16. package/credential/repositories/credential-repository-postgres.js +291 -0
  17. package/credential/repositories/credential-repository.js +302 -0
  18. package/credential/use-cases/get-credential-for-user.js +25 -0
  19. package/credential/use-cases/update-authentication-status.js +15 -0
  20. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  21. package/database/adapters/lambda-invoker.js +97 -0
  22. package/database/config.js +154 -0
  23. package/database/documentdb-encryption-service.js +330 -0
  24. package/database/documentdb-utils.js +136 -0
  25. package/database/encryption/README.md +839 -0
  26. package/database/encryption/documentdb-encryption-service.md +3575 -0
  27. package/database/encryption/encryption-schema-registry.js +268 -0
  28. package/database/encryption/field-encryption-service.js +226 -0
  29. package/database/encryption/logger.js +79 -0
  30. package/database/encryption/prisma-encryption-extension.js +222 -0
  31. package/database/index.js +61 -21
  32. package/database/models/WebsocketConnection.js +16 -10
  33. package/database/models/readme.md +1 -0
  34. package/database/prisma.js +182 -0
  35. package/database/repositories/health-check-repository-documentdb.js +134 -0
  36. package/database/repositories/health-check-repository-factory.js +48 -0
  37. package/database/repositories/health-check-repository-interface.js +82 -0
  38. package/database/repositories/health-check-repository-mongodb.js +89 -0
  39. package/database/repositories/health-check-repository-postgres.js +82 -0
  40. package/database/repositories/health-check-repository.js +108 -0
  41. package/database/repositories/migration-status-repository-s3.js +137 -0
  42. package/database/use-cases/check-database-health-use-case.js +29 -0
  43. package/database/use-cases/check-database-state-use-case.js +81 -0
  44. package/database/use-cases/check-encryption-health-use-case.js +83 -0
  45. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  46. package/database/use-cases/get-migration-status-use-case.js +93 -0
  47. package/database/use-cases/run-database-migration-use-case.js +139 -0
  48. package/database/use-cases/test-encryption-use-case.js +253 -0
  49. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  50. package/database/utils/mongodb-collection-utils.js +91 -0
  51. package/database/utils/mongodb-schema-init.js +106 -0
  52. package/database/utils/prisma-runner.js +477 -0
  53. package/database/utils/prisma-schema-parser.js +182 -0
  54. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
  55. package/encrypt/Cryptor.js +34 -168
  56. package/encrypt/index.js +1 -2
  57. package/encrypt/test-encrypt.js +0 -2
  58. package/errors/client-safe-error.js +26 -0
  59. package/errors/fetch-error.js +2 -1
  60. package/errors/index.js +2 -0
  61. package/generated/prisma-mongodb/client.d.ts +1 -0
  62. package/generated/prisma-mongodb/client.js +4 -0
  63. package/generated/prisma-mongodb/default.d.ts +1 -0
  64. package/generated/prisma-mongodb/default.js +4 -0
  65. package/generated/prisma-mongodb/edge.d.ts +1 -0
  66. package/generated/prisma-mongodb/edge.js +334 -0
  67. package/generated/prisma-mongodb/index-browser.js +316 -0
  68. package/generated/prisma-mongodb/index.d.ts +22903 -0
  69. package/generated/prisma-mongodb/index.js +359 -0
  70. package/generated/prisma-mongodb/package.json +183 -0
  71. package/generated/prisma-mongodb/query-engine-debian-openssl-3.0.x +0 -0
  72. package/generated/prisma-mongodb/query-engine-rhel-openssl-3.0.x +0 -0
  73. package/generated/prisma-mongodb/runtime/binary.d.ts +1 -0
  74. package/generated/prisma-mongodb/runtime/binary.js +289 -0
  75. package/generated/prisma-mongodb/runtime/edge-esm.js +34 -0
  76. package/generated/prisma-mongodb/runtime/edge.js +34 -0
  77. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  78. package/generated/prisma-mongodb/runtime/index-browser.js +16 -0
  79. package/generated/prisma-mongodb/runtime/library.d.ts +3977 -0
  80. package/generated/prisma-mongodb/runtime/react-native.js +83 -0
  81. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +84 -0
  82. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +36 -0
  83. package/generated/prisma-mongodb/schema.prisma +360 -0
  84. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +4 -0
  85. package/generated/prisma-mongodb/wasm-worker-loader.mjs +4 -0
  86. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  87. package/generated/prisma-mongodb/wasm.js +341 -0
  88. package/generated/prisma-postgresql/client.d.ts +1 -0
  89. package/generated/prisma-postgresql/client.js +4 -0
  90. package/generated/prisma-postgresql/default.d.ts +1 -0
  91. package/generated/prisma-postgresql/default.js +4 -0
  92. package/generated/prisma-postgresql/edge.d.ts +1 -0
  93. package/generated/prisma-postgresql/edge.js +356 -0
  94. package/generated/prisma-postgresql/index-browser.js +338 -0
  95. package/generated/prisma-postgresql/index.d.ts +25077 -0
  96. package/generated/prisma-postgresql/index.js +381 -0
  97. package/generated/prisma-postgresql/package.json +183 -0
  98. package/generated/prisma-postgresql/query-engine-debian-openssl-3.0.x +0 -0
  99. package/generated/prisma-postgresql/query-engine-rhel-openssl-3.0.x +0 -0
  100. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  101. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  102. package/generated/prisma-postgresql/runtime/binary.d.ts +1 -0
  103. package/generated/prisma-postgresql/runtime/binary.js +289 -0
  104. package/generated/prisma-postgresql/runtime/edge-esm.js +34 -0
  105. package/generated/prisma-postgresql/runtime/edge.js +34 -0
  106. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  107. package/generated/prisma-postgresql/runtime/index-browser.js +16 -0
  108. package/generated/prisma-postgresql/runtime/library.d.ts +3977 -0
  109. package/generated/prisma-postgresql/runtime/react-native.js +83 -0
  110. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +84 -0
  111. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +36 -0
  112. package/generated/prisma-postgresql/schema.prisma +343 -0
  113. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +4 -0
  114. package/generated/prisma-postgresql/wasm-worker-loader.mjs +4 -0
  115. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  116. package/generated/prisma-postgresql/wasm.js +363 -0
  117. package/handlers/WEBHOOKS.md +653 -0
  118. package/handlers/app-definition-loader.js +38 -0
  119. package/handlers/app-handler-helpers.js +56 -0
  120. package/handlers/backend-utils.js +186 -0
  121. package/handlers/database-migration-handler.js +227 -0
  122. package/handlers/integration-event-dispatcher.js +54 -0
  123. package/handlers/routers/HEALTHCHECK.md +342 -0
  124. package/handlers/routers/auth.js +15 -0
  125. package/handlers/routers/db-migration.handler.js +29 -0
  126. package/handlers/routers/db-migration.js +326 -0
  127. package/handlers/routers/health.js +516 -0
  128. package/handlers/routers/integration-defined-routers.js +45 -0
  129. package/handlers/routers/integration-webhook-routers.js +67 -0
  130. package/handlers/routers/user.js +63 -0
  131. package/handlers/routers/websocket.js +57 -0
  132. package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
  133. package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
  134. package/handlers/workers/db-migration.js +352 -0
  135. package/handlers/workers/integration-defined-workers.js +27 -0
  136. package/index.js +77 -22
  137. package/integrations/WEBHOOK-QUICKSTART.md +151 -0
  138. package/integrations/index.js +12 -10
  139. package/integrations/integration-base.js +326 -55
  140. package/integrations/integration-router.js +374 -179
  141. package/integrations/options.js +1 -1
  142. package/integrations/repositories/integration-mapping-repository-documentdb.js +280 -0
  143. package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
  144. package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
  145. package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
  146. package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
  147. package/integrations/repositories/integration-mapping-repository.js +156 -0
  148. package/integrations/repositories/integration-repository-documentdb.js +210 -0
  149. package/integrations/repositories/integration-repository-factory.js +51 -0
  150. package/integrations/repositories/integration-repository-interface.js +127 -0
  151. package/integrations/repositories/integration-repository-mongo.js +303 -0
  152. package/integrations/repositories/integration-repository-postgres.js +352 -0
  153. package/integrations/repositories/process-repository-documentdb.js +243 -0
  154. package/integrations/repositories/process-repository-factory.js +53 -0
  155. package/integrations/repositories/process-repository-interface.js +90 -0
  156. package/integrations/repositories/process-repository-mongo.js +190 -0
  157. package/integrations/repositories/process-repository-postgres.js +217 -0
  158. package/integrations/tests/doubles/dummy-integration-class.js +83 -0
  159. package/integrations/tests/doubles/test-integration-repository.js +99 -0
  160. package/integrations/use-cases/create-integration.js +83 -0
  161. package/integrations/use-cases/create-process.js +128 -0
  162. package/integrations/use-cases/delete-integration-for-user.js +101 -0
  163. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +72 -0
  164. package/integrations/use-cases/get-integration-for-user.js +78 -0
  165. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  166. package/integrations/use-cases/get-integration-instance.js +83 -0
  167. package/integrations/use-cases/get-integrations-for-user.js +88 -0
  168. package/integrations/use-cases/get-possible-integrations.js +27 -0
  169. package/integrations/use-cases/get-process.js +87 -0
  170. package/integrations/use-cases/index.js +19 -0
  171. package/integrations/use-cases/load-integration-context.js +71 -0
  172. package/integrations/use-cases/update-integration-messages.js +44 -0
  173. package/integrations/use-cases/update-integration-status.js +32 -0
  174. package/integrations/use-cases/update-integration.js +93 -0
  175. package/integrations/use-cases/update-process-metrics.js +201 -0
  176. package/integrations/use-cases/update-process-state.js +119 -0
  177. package/integrations/utils/map-integration-dto.js +37 -0
  178. package/jest-global-setup-noop.js +3 -0
  179. package/jest-global-teardown-noop.js +3 -0
  180. package/logs/logger.js +0 -4
  181. package/{module-plugin → modules}/entity.js +1 -1
  182. package/{module-plugin → modules}/index.js +0 -8
  183. package/modules/module-factory.js +56 -0
  184. package/modules/module.js +221 -0
  185. package/modules/repositories/module-repository-documentdb.js +307 -0
  186. package/modules/repositories/module-repository-factory.js +40 -0
  187. package/modules/repositories/module-repository-interface.js +129 -0
  188. package/modules/repositories/module-repository-mongo.js +377 -0
  189. package/modules/repositories/module-repository-postgres.js +426 -0
  190. package/modules/repositories/module-repository.js +316 -0
  191. package/modules/requester/api-key.js +52 -0
  192. package/{module-plugin → modules}/requester/requester.js +1 -0
  193. package/{module-plugin → modules}/test/mock-api/api.js +8 -3
  194. package/{module-plugin → modules}/test/mock-api/definition.js +12 -8
  195. package/modules/tests/doubles/test-module-factory.js +16 -0
  196. package/modules/tests/doubles/test-module-repository.js +39 -0
  197. package/modules/use-cases/get-entities-for-user.js +32 -0
  198. package/modules/use-cases/get-entity-options-by-id.js +71 -0
  199. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  200. package/modules/use-cases/get-module-instance-from-type.js +31 -0
  201. package/modules/use-cases/get-module.js +74 -0
  202. package/modules/use-cases/process-authorization-callback.js +133 -0
  203. package/modules/use-cases/refresh-entity-options.js +72 -0
  204. package/modules/use-cases/test-module-auth.js +72 -0
  205. package/modules/utils/map-module-dto.js +18 -0
  206. package/package.json +82 -50
  207. package/prisma-mongodb/schema.prisma +360 -0
  208. package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
  209. package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
  210. package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
  211. package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
  212. package/prisma-postgresql/migrations/migration_lock.toml +3 -0
  213. package/prisma-postgresql/schema.prisma +343 -0
  214. package/queues/queuer-util.js +27 -22
  215. package/syncs/manager.js +468 -443
  216. package/syncs/repositories/sync-repository-documentdb.js +240 -0
  217. package/syncs/repositories/sync-repository-factory.js +43 -0
  218. package/syncs/repositories/sync-repository-interface.js +109 -0
  219. package/syncs/repositories/sync-repository-mongo.js +239 -0
  220. package/syncs/repositories/sync-repository-postgres.js +319 -0
  221. package/syncs/sync.js +0 -1
  222. package/token/repositories/token-repository-documentdb.js +137 -0
  223. package/token/repositories/token-repository-factory.js +40 -0
  224. package/token/repositories/token-repository-interface.js +131 -0
  225. package/token/repositories/token-repository-mongo.js +219 -0
  226. package/token/repositories/token-repository-postgres.js +264 -0
  227. package/token/repositories/token-repository.js +219 -0
  228. package/types/core/index.d.ts +2 -2
  229. package/types/integrations/index.d.ts +2 -6
  230. package/types/module-plugin/index.d.ts +5 -59
  231. package/types/syncs/index.d.ts +0 -2
  232. package/user/repositories/user-repository-documentdb.js +441 -0
  233. package/user/repositories/user-repository-factory.js +52 -0
  234. package/user/repositories/user-repository-interface.js +201 -0
  235. package/user/repositories/user-repository-mongo.js +308 -0
  236. package/user/repositories/user-repository-postgres.js +360 -0
  237. package/user/tests/doubles/test-user-repository.js +72 -0
  238. package/user/use-cases/authenticate-user.js +127 -0
  239. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  240. package/user/use-cases/create-individual-user.js +61 -0
  241. package/user/use-cases/create-organization-user.js +47 -0
  242. package/user/use-cases/create-token-for-user-id.js +30 -0
  243. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  244. package/user/use-cases/get-user-from-bearer-token.js +77 -0
  245. package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
  246. package/user/use-cases/login-user.js +122 -0
  247. package/user/user.js +125 -0
  248. package/utils/backend-path.js +38 -0
  249. package/utils/index.js +6 -0
  250. package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
  251. package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
  252. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  253. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  254. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  255. package/websocket/repositories/websocket-connection-repository.js +161 -0
  256. package/database/models/State.js +0 -9
  257. package/database/models/Token.js +0 -70
  258. package/database/mongo.js +0 -45
  259. package/encrypt/Cryptor.test.js +0 -32
  260. package/encrypt/encrypt.js +0 -132
  261. package/encrypt/encrypt.test.js +0 -1069
  262. package/errors/base-error.test.js +0 -32
  263. package/errors/fetch-error.test.js +0 -79
  264. package/errors/halt-error.test.js +0 -11
  265. package/errors/validation-errors.test.js +0 -120
  266. package/integrations/create-frigg-backend.js +0 -31
  267. package/integrations/integration-factory.js +0 -251
  268. package/integrations/integration-mapping.js +0 -43
  269. package/integrations/integration-model.js +0 -46
  270. package/integrations/integration-user.js +0 -144
  271. package/integrations/test/integration-base.test.js +0 -144
  272. package/lambda/TimeoutCatcher.test.js +0 -68
  273. package/logs/logger.test.js +0 -76
  274. package/module-plugin/auther.js +0 -393
  275. package/module-plugin/credential.js +0 -22
  276. package/module-plugin/entity-manager.js +0 -70
  277. package/module-plugin/manager.js +0 -169
  278. package/module-plugin/module-factory.js +0 -61
  279. package/module-plugin/requester/api-key.js +0 -36
  280. package/module-plugin/requester/requester.test.js +0 -28
  281. package/module-plugin/test/auther.test.js +0 -97
  282. /package/{module-plugin → modules}/ModuleConstants.js +0 -0
  283. /package/{module-plugin → modules}/requester/basic.js +0 -0
  284. /package/{module-plugin → modules}/requester/oauth-2.js +0 -0
  285. /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
@@ -0,0 +1,360 @@
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
+ engineType = "binary" // Use binary engines (smaller size)
10
+ }
11
+
12
+ datasource db {
13
+ provider = "mongodb"
14
+ url = env("DATABASE_URL")
15
+ }
16
+
17
+ // ============================================================================
18
+ // USER MODELS
19
+ // ============================================================================
20
+
21
+ /// User model with discriminator pattern support
22
+ /// Replaces Mongoose discriminators (IndividualUser, OrganizationUser)
23
+ model User {
24
+ id String @id @default(auto()) @map("_id") @db.ObjectId
25
+ type UserType
26
+
27
+ // Timestamps
28
+ createdAt DateTime @default(now())
29
+ updatedAt DateTime @updatedAt
30
+
31
+ // IndividualUser fields (nullable for organizations)
32
+ email String?
33
+ username String?
34
+ hashword String? // Bcrypt hashed password (handled in application layer)
35
+ appUserId String?
36
+ organizationId String? @db.ObjectId
37
+
38
+ // Self-referential relation for organization membership
39
+ organization User? @relation("OrgMembers", fields: [organizationId], references: [id], onDelete: NoAction, onUpdate: NoAction)
40
+ members User[] @relation("OrgMembers")
41
+
42
+ // OrganizationUser fields (nullable for individuals)
43
+ appOrgId String?
44
+ name String?
45
+
46
+ // Relations
47
+ tokens Token[]
48
+ credentials Credential[]
49
+ entities Entity[]
50
+ integrations Integration[]
51
+ processes Process[]
52
+
53
+ @@unique([username, appUserId])
54
+ @@index([type])
55
+ @@index([appUserId])
56
+ @@map("User")
57
+ }
58
+
59
+ enum UserType {
60
+ INDIVIDUAL
61
+ ORGANIZATION
62
+ }
63
+
64
+ // ============================================================================
65
+ // AUTHENTICATION MODELS
66
+ // ============================================================================
67
+
68
+ /// Authentication tokens with expiration
69
+ /// Bcrypt hashed tokens stored (handled in application layer)
70
+ model Token {
71
+ id String @id @default(auto()) @map("_id") @db.ObjectId
72
+ token String // Bcrypt hashed
73
+ created DateTime @default(now())
74
+ expires DateTime?
75
+ userId String @db.ObjectId
76
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
77
+
78
+ @@index([userId])
79
+ @@index([expires])
80
+ @@map("Token")
81
+ }
82
+
83
+ // ============================================================================
84
+ // CREDENTIAL & ENTITY MODELS
85
+ // ============================================================================
86
+
87
+ /// OAuth credentials and API tokens
88
+ /// All sensitive data encrypted with KMS at rest
89
+ model Credential {
90
+ id String @id @default(auto()) @map("_id") @db.ObjectId
91
+ userId String? @db.ObjectId
92
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
93
+ authIsValid Boolean?
94
+ externalId String?
95
+
96
+ // Dynamic OAuth fields stored as JSON (encrypted via Prisma middleware)
97
+ // Contains: access_token, refresh_token, domain, expires_in, token_type, etc.
98
+ data Json @default("{}")
99
+
100
+ createdAt DateTime @default(now())
101
+ updatedAt DateTime @updatedAt
102
+
103
+ // Relations
104
+ entities Entity[]
105
+
106
+ @@index([userId])
107
+ @@index([externalId])
108
+ @@map("Credential")
109
+ }
110
+
111
+ /// External service entities (API connections)
112
+ model Entity {
113
+ id String @id @default(auto()) @map("_id") @db.ObjectId
114
+ credentialId String? @db.ObjectId
115
+ credential Credential? @relation(fields: [credentialId], references: [id], onDelete: SetNull)
116
+ userId String? @db.ObjectId
117
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
118
+ name String?
119
+ moduleName String?
120
+ externalId String?
121
+
122
+ createdAt DateTime @default(now())
123
+ updatedAt DateTime @updatedAt
124
+
125
+ // Relations - many-to-many with scalar lists
126
+ integrations Integration[] @relation("IntegrationEntities", fields: [integrationIds], references: [id])
127
+ integrationIds String[] @db.ObjectId
128
+
129
+ syncs Sync[] @relation("SyncEntities", fields: [syncIds], references: [id])
130
+ syncIds String[] @db.ObjectId
131
+
132
+ dataIdentifiers DataIdentifier[]
133
+ associationObjects AssociationObject[]
134
+
135
+ @@index([userId])
136
+ @@index([externalId])
137
+ @@index([moduleName])
138
+ @@index([credentialId])
139
+ @@map("Entity")
140
+ }
141
+
142
+ // ============================================================================
143
+ // INTEGRATION MODELS
144
+ // ============================================================================
145
+
146
+ /// Main integration configuration and state
147
+ model Integration {
148
+ id String @id @default(auto()) @map("_id") @db.ObjectId
149
+ userId String? @db.ObjectId
150
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
151
+ status IntegrationStatus @default(ENABLED)
152
+
153
+ // Configuration and version
154
+ config Json? // Integration configuration object
155
+ version String?
156
+
157
+ // Entity references (many-to-many via explicit scalar list)
158
+ entities Entity[] @relation("IntegrationEntities", fields: [entityIds], references: [id])
159
+ entityIds String[] @db.ObjectId
160
+
161
+ // Message arrays (stored as JSON)
162
+ errors Json @default("[]")
163
+ warnings Json @default("[]")
164
+ info Json @default("[]")
165
+ logs Json @default("[]")
166
+
167
+ createdAt DateTime @default(now())
168
+ updatedAt DateTime @updatedAt
169
+
170
+ // Relations
171
+ associations Association[]
172
+ syncs Sync[]
173
+ mappings IntegrationMapping[]
174
+ processes Process[]
175
+
176
+ @@index([userId])
177
+ @@index([status])
178
+ @@map("Integration")
179
+ }
180
+
181
+ enum IntegrationStatus {
182
+ ENABLED
183
+ NEEDS_CONFIG
184
+ PROCESSING
185
+ DISABLED
186
+ ERROR
187
+ }
188
+
189
+ /// Integration-specific data mappings
190
+ /// All mapping data encrypted with KMS
191
+ model IntegrationMapping {
192
+ id String @id @default(auto()) @map("_id") @db.ObjectId
193
+ integrationId String @db.ObjectId
194
+ integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
195
+ sourceId String?
196
+
197
+ // Encrypted mapping data (handled via Prisma middleware)
198
+ mapping Json?
199
+
200
+ createdAt DateTime @default(now())
201
+ updatedAt DateTime @updatedAt
202
+
203
+ @@unique([integrationId, sourceId])
204
+ @@index([integrationId])
205
+ @@index([sourceId])
206
+ @@map("IntegrationMapping")
207
+ }
208
+
209
+ // ============================================================================
210
+ // PROCESS MODELS
211
+ // ============================================================================
212
+
213
+ /// Generic Process Model - tracks any long-running operation
214
+ /// Used for: CRM syncs, data migrations, bulk operations, etc.
215
+ model Process {
216
+ id String @id @default(auto()) @map("_id") @db.ObjectId
217
+
218
+ // Core references
219
+ userId String @db.ObjectId
220
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
221
+ integrationId String @db.ObjectId
222
+ integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
223
+
224
+ // Process identification
225
+ name String // e.g., "zoho-crm-contact-sync", "pipedrive-lead-sync"
226
+ type String // e.g., "CRM_SYNC", "DATA_MIGRATION", "BULK_OPERATION"
227
+
228
+ // State machine
229
+ state String // Current state (integration-defined states)
230
+
231
+ // Flexible storage
232
+ context Json @default("{}") // Process-specific data (pagination, metadata, etc.)
233
+ results Json @default("{}") // Process results and metrics
234
+
235
+ // Hierarchy support
236
+ childProcesses String[] @db.ObjectId
237
+ parentProcessId String? @db.ObjectId
238
+
239
+ // Timestamps
240
+ createdAt DateTime @default(now())
241
+ updatedAt DateTime @updatedAt
242
+
243
+ @@index([userId])
244
+ @@index([integrationId])
245
+ @@index([type])
246
+ @@index([state])
247
+ @@index([name])
248
+ @@map("Process")
249
+ }
250
+
251
+ // ============================================================================
252
+ // SYNC MODELS
253
+ // ============================================================================
254
+
255
+ /// Bidirectional data synchronization tracking
256
+ model Sync {
257
+ id String @id @default(auto()) @map("_id") @db.ObjectId
258
+ integrationId String? @db.ObjectId
259
+ integration Integration? @relation(fields: [integrationId], references: [id], onDelete: Cascade)
260
+
261
+ // Entity references (many-to-many via explicit scalar list)
262
+ entities Entity[] @relation("SyncEntities", fields: [entityIds], references: [id])
263
+ entityIds String[] @db.ObjectId
264
+
265
+ hash String
266
+ name String
267
+
268
+ // Data identifiers (extracted to separate model)
269
+ dataIdentifiers DataIdentifier[]
270
+
271
+ @@index([integrationId])
272
+ @@index([hash])
273
+ @@index([name])
274
+ @@map("Sync")
275
+ }
276
+
277
+ /// Data identifier for sync operations
278
+ /// Replaces nested array structure in Mongoose
279
+ model DataIdentifier {
280
+ id String @id @default(auto()) @map("_id") @db.ObjectId
281
+ syncId String? @db.ObjectId
282
+ sync Sync? @relation(fields: [syncId], references: [id], onDelete: Cascade)
283
+ entityId String @db.ObjectId
284
+ entity Entity @relation(fields: [entityId], references: [id], onDelete: Cascade)
285
+
286
+ // Identifier data (can be any structure)
287
+ idData Json
288
+
289
+ hash String
290
+
291
+ @@index([syncId])
292
+ @@index([entityId])
293
+ @@index([hash])
294
+ @@map("DataIdentifier")
295
+ }
296
+
297
+ // ============================================================================
298
+ // ASSOCIATION MODELS
299
+ // ============================================================================
300
+
301
+ /// Entity associations with cardinality tracking
302
+ model Association {
303
+ id String @id @default(auto()) @map("_id") @db.ObjectId
304
+ integrationId String @db.ObjectId
305
+ integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
306
+ name String
307
+ type AssociationType
308
+ primaryObject String
309
+
310
+ // Associated objects (extracted to separate model)
311
+ objects AssociationObject[]
312
+
313
+ @@index([integrationId])
314
+ @@index([name])
315
+ @@map("Association")
316
+ }
317
+
318
+ /// Association object entry
319
+ /// Replaces nested array structure in Mongoose
320
+ model AssociationObject {
321
+ id String @id @default(auto()) @map("_id") @db.ObjectId
322
+ associationId String @db.ObjectId
323
+ association Association @relation(fields: [associationId], references: [id], onDelete: Cascade)
324
+ entityId String @db.ObjectId
325
+ entity Entity @relation(fields: [entityId], references: [id], onDelete: Cascade)
326
+ objectType String
327
+ objId String
328
+ metadata Json? // Optional metadata
329
+
330
+ @@index([associationId])
331
+ @@index([entityId])
332
+ @@map("AssociationObject")
333
+ }
334
+
335
+ enum AssociationType {
336
+ ONE_TO_MANY
337
+ ONE_TO_ONE
338
+ MANY_TO_ONE
339
+ }
340
+
341
+ // ============================================================================
342
+ // UTILITY MODELS
343
+ // ============================================================================
344
+
345
+ /// Generic state storage
346
+ model State {
347
+ id String @id @default(auto()) @map("_id") @db.ObjectId
348
+ state Json?
349
+
350
+ @@map("State")
351
+ }
352
+
353
+ /// AWS API Gateway WebSocket connection tracking
354
+ model WebsocketConnection {
355
+ id String @id @default(auto()) @map("_id") @db.ObjectId
356
+ connectionId String?
357
+
358
+ @@index([connectionId])
359
+ @@map("WebsocketConnection")
360
+ }
@@ -0,0 +1,4 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
+ /* eslint-disable */
4
+ export default import('./query_engine_bg.wasm?module')
@@ -0,0 +1,4 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
+ /* eslint-disable */
4
+ export default import('./query_engine_bg.wasm')
@@ -0,0 +1 @@
1
+ export * from "./default"