@friggframework/core 2.0.0--canary.549.922386d.0 → 2.0.0--canary.550.b8b9a2b.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/application/commands/credential-commands.js +245 -0
  2. package/application/commands/entity-commands.js +336 -0
  3. package/application/commands/integration-commands.js +210 -0
  4. package/{src/application/commands/scheduler-commands.ts → application/commands/scheduler-commands.js} +104 -82
  5. package/{src/application/commands/user-commands.ts → application/commands/user-commands.js} +96 -72
  6. package/application/index.js +73 -0
  7. package/assertions/get.js +139 -0
  8. package/assertions/index.js +16 -0
  9. package/assertions/jest.config.js +5 -0
  10. package/associations/association.js +78 -0
  11. package/core/Delegate.js +29 -0
  12. package/core/Worker.js +72 -0
  13. package/{src/core/create-handler.ts → core/create-handler.js} +15 -43
  14. package/core/index.js +6 -0
  15. package/core/load-installed-modules.js +28 -0
  16. package/{src/core/secrets-to-env.ts → core/secrets-to-env.js} +14 -14
  17. package/credential/repositories/credential-repository-documentdb.js +304 -0
  18. package/credential/repositories/credential-repository-factory.js +54 -0
  19. package/credential/repositories/credential-repository-interface.js +98 -0
  20. package/credential/repositories/credential-repository-mongo.js +269 -0
  21. package/credential/repositories/credential-repository-postgres.js +287 -0
  22. package/credential/repositories/credential-repository.js +300 -0
  23. package/credential/use-cases/get-credential-for-user.js +25 -0
  24. package/credential/use-cases/update-authentication-status.js +15 -0
  25. package/database/adapters/lambda-invoker.js +97 -0
  26. package/database/config.js +154 -0
  27. package/database/documentdb-encryption-service.js +330 -0
  28. package/database/documentdb-utils.js +136 -0
  29. package/database/encryption/encryption-schema-registry.js +268 -0
  30. package/{src/database/encryption/field-encryption-service.ts → database/encryption/field-encryption-service.js} +52 -42
  31. package/{src/database/encryption/logger.ts → database/encryption/logger.js} +19 -18
  32. package/{src/database/encryption/prisma-encryption-extension.ts → database/encryption/prisma-encryption-extension.js} +80 -58
  33. package/database/index.js +25 -0
  34. package/database/jest.config.js +5 -0
  35. package/{src/database/prisma.ts → database/prisma.js} +62 -46
  36. package/{src/database/repositories/health-check-repository-documentdb.ts → database/repositories/health-check-repository-documentdb.js} +45 -34
  37. package/database/repositories/health-check-repository-factory.js +48 -0
  38. package/database/repositories/health-check-repository-interface.js +82 -0
  39. package/database/repositories/health-check-repository-mongodb.js +89 -0
  40. package/database/repositories/health-check-repository-postgres.js +82 -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/{src/database/use-cases/check-encryption-health-use-case.ts → database/use-cases/check-encryption-health-use-case.js} +15 -38
  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/{src/database/use-cases/run-database-migration-use-case.ts → database/use-cases/run-database-migration-use-case.js} +72 -46
  48. package/database/use-cases/test-encryption-use-case.js +253 -0
  49. package/{src/database/use-cases/trigger-database-migration-use-case.ts → database/use-cases/trigger-database-migration-use-case.js} +71 -45
  50. package/database/utils/mongodb-collection-utils.js +94 -0
  51. package/database/utils/mongodb-schema-init.js +108 -0
  52. package/database/utils/prisma-runner.js +477 -0
  53. package/database/utils/prisma-schema-parser.js +182 -0
  54. package/{src/encrypt/Cryptor.ts → encrypt/Cryptor.js} +44 -34
  55. package/{src/encrypt/aes.ts → encrypt/aes.js} +9 -4
  56. package/encrypt/index.js +3 -0
  57. package/errors/base-error.js +23 -0
  58. package/errors/client-safe-error.js +26 -0
  59. package/{src/errors/fetch-error.ts → errors/fetch-error.js} +18 -37
  60. package/errors/halt-error.js +10 -0
  61. package/errors/index.js +17 -0
  62. package/errors/validation-errors.js +23 -0
  63. package/handlers/app-definition-loader.js +38 -0
  64. package/handlers/app-handler-helpers.js +57 -0
  65. package/{src/handlers/backend-utils.ts → handlers/backend-utils.js} +68 -57
  66. package/{src/handlers/database-migration-handler.ts → handlers/database-migration-handler.js} +106 -51
  67. package/{src/handlers/integration-event-dispatcher.ts → handlers/integration-event-dispatcher.js} +9 -33
  68. package/handlers/routers/auth.js +15 -0
  69. package/{src/handlers/routers/db-migration.handler.ts → handlers/routers/db-migration.handler.js} +9 -8
  70. package/handlers/routers/db-migration.js +326 -0
  71. package/{src/handlers/routers/health.ts → handlers/routers/health.js} +221 -95
  72. package/handlers/routers/integration-defined-routers.js +45 -0
  73. package/{src/handlers/routers/integration-webhook-routers.ts → handlers/routers/integration-webhook-routers.js} +9 -14
  74. package/{src/handlers/routers/user.ts → handlers/routers/user.js} +17 -17
  75. package/{src/handlers/routers/websocket.ts → handlers/routers/websocket.js} +12 -23
  76. package/{src/handlers/use-cases/check-external-apis-health-use-case.ts → handlers/use-cases/check-external-apis-health-use-case.js} +12 -31
  77. package/{src/handlers/use-cases/check-integrations-health-use-case.ts → handlers/use-cases/check-integrations-health-use-case.js} +8 -33
  78. package/handlers/workers/db-migration.js +352 -0
  79. package/handlers/workers/integration-defined-workers.js +27 -0
  80. package/index.js +176 -0
  81. package/{src/infrastructure/scheduler/eventbridge-scheduler-adapter.ts → infrastructure/scheduler/eventbridge-scheduler-adapter.js} +62 -26
  82. package/infrastructure/scheduler/index.js +33 -0
  83. package/{src/infrastructure/scheduler/mock-scheduler-adapter.ts → infrastructure/scheduler/mock-scheduler-adapter.js} +59 -25
  84. package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
  85. package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
  86. package/integrations/index.js +21 -0
  87. package/{src/integrations/integration-base.ts → integrations/integration-base.js} +166 -161
  88. package/{src/integrations/integration-router.ts → integrations/integration-router.js} +248 -227
  89. package/integrations/options.js +53 -0
  90. package/{src/integrations/repositories/integration-mapping-repository-documentdb.ts → integrations/repositories/integration-mapping-repository-documentdb.js} +134 -54
  91. package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
  92. package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
  93. package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
  94. package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
  95. package/integrations/repositories/integration-mapping-repository.js +156 -0
  96. package/{src/integrations/repositories/integration-repository-documentdb.ts → integrations/repositories/integration-repository-documentdb.js} +40 -31
  97. package/integrations/repositories/integration-repository-factory.js +51 -0
  98. package/integrations/repositories/integration-repository-interface.js +127 -0
  99. package/integrations/repositories/integration-repository-mongo.js +303 -0
  100. package/integrations/repositories/integration-repository-postgres.js +352 -0
  101. package/{src/integrations/repositories/process-repository-documentdb.ts → integrations/repositories/process-repository-documentdb.js} +124 -57
  102. package/integrations/repositories/process-repository-factory.js +53 -0
  103. package/integrations/repositories/process-repository-interface.js +90 -0
  104. package/integrations/repositories/process-repository-mongo.js +190 -0
  105. package/integrations/repositories/process-repository-postgres.js +217 -0
  106. package/{src/integrations/tests/doubles/config-capturing-integration.ts → integrations/tests/doubles/config-capturing-integration.js} +14 -14
  107. package/{src/integrations/tests/doubles/dummy-integration-class.ts → integrations/tests/doubles/dummy-integration-class.js} +18 -22
  108. package/{src/integrations/tests/doubles/test-integration-repository.ts → integrations/tests/doubles/test-integration-repository.js} +13 -14
  109. package/integrations/use-cases/create-integration.js +83 -0
  110. package/integrations/use-cases/create-process.js +128 -0
  111. package/integrations/use-cases/delete-integration-for-user.js +101 -0
  112. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +72 -0
  113. package/integrations/use-cases/get-integration-for-user.js +78 -0
  114. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  115. package/{src/integrations/use-cases/get-integration-instance.ts → integrations/use-cases/get-integration-instance.js} +31 -20
  116. package/integrations/use-cases/get-integrations-for-user.js +88 -0
  117. package/integrations/use-cases/get-possible-integrations.js +27 -0
  118. package/integrations/use-cases/get-process.js +87 -0
  119. package/integrations/use-cases/index.js +19 -0
  120. package/{src/integrations/use-cases/load-integration-context.ts → integrations/use-cases/load-integration-context.js} +17 -33
  121. package/integrations/use-cases/update-integration-messages.js +44 -0
  122. package/integrations/use-cases/update-integration-status.js +32 -0
  123. package/integrations/use-cases/update-integration.js +92 -0
  124. package/integrations/use-cases/update-process-metrics.js +201 -0
  125. package/integrations/use-cases/update-process-state.js +119 -0
  126. package/integrations/utils/map-integration-dto.js +37 -0
  127. package/jest-global-setup-noop.js +3 -0
  128. package/jest-global-teardown-noop.js +3 -0
  129. package/jest-setup.js +2 -0
  130. package/jest-teardown.js +2 -0
  131. package/jest.config.js +21 -0
  132. package/lambda/TimeoutCatcher.js +43 -0
  133. package/lambda/index.js +3 -0
  134. package/logs/index.js +7 -0
  135. package/{src/logs/logger.ts → logs/logger.js} +10 -15
  136. package/modules/ModuleConstants.js +10 -0
  137. package/modules/index.js +15 -0
  138. package/{src/modules/module-factory.ts → modules/module-factory.js} +19 -15
  139. package/modules/module.js +228 -0
  140. package/{src/modules/repositories/module-repository-documentdb.ts → modules/repositories/module-repository-documentdb.js} +111 -79
  141. package/modules/repositories/module-repository-factory.js +40 -0
  142. package/modules/repositories/module-repository-interface.js +129 -0
  143. package/modules/repositories/module-repository-mongo.js +408 -0
  144. package/modules/repositories/module-repository-postgres.js +453 -0
  145. package/modules/repositories/module-repository.js +345 -0
  146. package/modules/requester/api-key.js +52 -0
  147. package/modules/requester/basic.js +43 -0
  148. package/modules/requester/oauth-2.js +396 -0
  149. package/modules/requester/requester.js +167 -0
  150. package/{src/modules/test/mock-api/api.ts → modules/test/mock-api/api.js} +8 -6
  151. package/{src/modules/test/mock-api/definition.ts → modules/test/mock-api/definition.js} +14 -13
  152. package/{src/modules/test/mock-api/mocks/hubspot.ts → modules/test/mock-api/mocks/hubspot.js} +8 -6
  153. package/modules/tests/doubles/test-module-factory.js +16 -0
  154. package/{src/modules/tests/doubles/test-module-repository.ts → modules/tests/doubles/test-module-repository.js} +7 -7
  155. package/modules/use-cases/get-entities-for-user.js +32 -0
  156. package/{src/modules/use-cases/refresh-entity-options.ts → modules/use-cases/get-entity-options-by-id.js} +24 -18
  157. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  158. package/modules/use-cases/get-module-instance-from-type.js +31 -0
  159. package/{src/modules/use-cases/get-module.ts → modules/use-cases/get-module.js} +27 -23
  160. package/{src/modules/use-cases/process-authorization-callback.ts → modules/use-cases/process-authorization-callback.js} +40 -47
  161. package/{src/modules/use-cases/get-entity-options-by-id.ts → modules/use-cases/refresh-entity-options.js} +25 -17
  162. package/{src/modules/use-cases/test-module-auth.ts → modules/use-cases/test-module-auth.js} +25 -17
  163. package/modules/utils/map-module-dto.js +18 -0
  164. package/package.json +6 -28
  165. package/queues/index.js +4 -0
  166. package/{src/queues/queuer-util.ts → queues/queuer-util.js} +17 -10
  167. package/{src/syncs/manager.ts → syncs/manager.js} +142 -140
  168. package/{src/syncs/repositories/sync-repository-documentdb.ts → syncs/repositories/sync-repository-documentdb.js} +33 -32
  169. package/syncs/repositories/sync-repository-factory.js +43 -0
  170. package/syncs/repositories/sync-repository-interface.js +109 -0
  171. package/syncs/repositories/sync-repository-mongo.js +239 -0
  172. package/syncs/repositories/sync-repository-postgres.js +319 -0
  173. package/syncs/sync.js +113 -0
  174. package/token/repositories/token-repository-documentdb.js +137 -0
  175. package/token/repositories/token-repository-factory.js +40 -0
  176. package/token/repositories/token-repository-interface.js +131 -0
  177. package/token/repositories/token-repository-mongo.js +219 -0
  178. package/token/repositories/token-repository-postgres.js +264 -0
  179. package/token/repositories/token-repository.js +219 -0
  180. package/types/assertions/index.d.ts +83 -0
  181. package/types/associations/index.d.ts +57 -0
  182. package/types/core/index.d.ts +54 -0
  183. package/types/database/index.d.ts +11 -0
  184. package/types/encrypt/index.d.ts +7 -0
  185. package/types/errors/index.d.ts +66 -0
  186. package/types/eslint-config/index.d.ts +41 -0
  187. package/types/index.d.ts +14 -0
  188. package/types/integrations/index.d.ts +186 -0
  189. package/types/lambda/index.d.ts +31 -0
  190. package/types/logs/index.d.ts +5 -0
  191. package/types/module-plugin/index.d.ts +241 -0
  192. package/types/prettier-config/index.d.ts +6 -0
  193. package/types/syncs/index.d.ts +111 -0
  194. package/types/test-environment/index.d.ts +17 -0
  195. package/types/tsconfig.json +103 -0
  196. package/user/repositories/user-repository-documentdb.js +441 -0
  197. package/user/repositories/user-repository-factory.js +52 -0
  198. package/user/repositories/user-repository-interface.js +201 -0
  199. package/user/repositories/user-repository-mongo.js +308 -0
  200. package/user/repositories/user-repository-postgres.js +360 -0
  201. package/{src/user/tests/doubles/test-user-repository.ts → user/tests/doubles/test-user-repository.js} +15 -15
  202. package/user/use-cases/authenticate-user.js +127 -0
  203. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  204. package/user/use-cases/create-individual-user.js +61 -0
  205. package/user/use-cases/create-organization-user.js +47 -0
  206. package/user/use-cases/create-token-for-user-id.js +30 -0
  207. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  208. package/{src/user/use-cases/get-user-from-bearer-token.ts → user/use-cases/get-user-from-bearer-token.js} +26 -23
  209. package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
  210. package/user/use-cases/login-user.js +122 -0
  211. package/user/user.js +125 -0
  212. package/{src/utils/backend-path.ts → utils/backend-path.js} +9 -6
  213. package/utils/index.js +6 -0
  214. package/{src/websocket/repositories/websocket-connection-repository-documentdb.ts → websocket/repositories/websocket-connection-repository-documentdb.js} +55 -29
  215. package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
  216. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  217. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  218. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  219. package/websocket/repositories/websocket-connection-repository.js +161 -0
  220. package/assertions/jest.config.ts +0 -7
  221. package/database/jest.config.ts +0 -7
  222. package/database/models/WorkflowExecutionModel.ts +0 -315
  223. package/database/models/WorkflowModel.ts +0 -129
  224. package/jest-global-setup-noop.ts +0 -3
  225. package/jest-global-teardown-noop.ts +0 -3
  226. package/jest-resolver.ts +0 -36
  227. package/jest-setup.ts +0 -1
  228. package/jest-teardown.ts +0 -1
  229. package/jest.config.ts +0 -20
  230. package/src/application/commands/command-utils.ts +0 -17
  231. package/src/application/commands/credential-commands.ts +0 -226
  232. package/src/application/commands/entity-commands.ts +0 -265
  233. package/src/application/commands/integration-commands.test.ts +0 -158
  234. package/src/application/commands/integration-commands.ts +0 -205
  235. package/src/application/index.ts +0 -82
  236. package/src/assertions/get.ts +0 -196
  237. package/src/assertions/index.ts +0 -9
  238. package/src/associations/association.ts +0 -103
  239. package/src/associations/index.ts +0 -3
  240. package/src/core/Delegate.ts +0 -41
  241. package/src/core/Worker.test.ts +0 -158
  242. package/src/core/Worker.ts +0 -86
  243. package/src/core/index.ts +0 -15
  244. package/src/core/load-installed-modules.ts +0 -31
  245. package/src/credential/index.ts +0 -9
  246. package/src/credential/repositories/credential-repository-documentdb.ts +0 -185
  247. package/src/credential/repositories/credential-repository-factory.ts +0 -26
  248. package/src/credential/repositories/credential-repository-interface.ts +0 -62
  249. package/src/credential/repositories/credential-repository-mongo.ts +0 -163
  250. package/src/credential/repositories/credential-repository-postgres.ts +0 -169
  251. package/src/credential/repositories/credential-repository.ts +0 -162
  252. package/src/credential/use-cases/get-credential-for-user.ts +0 -27
  253. package/src/credential/use-cases/update-authentication-status.ts +0 -17
  254. package/src/database/adapters/index.ts +0 -1
  255. package/src/database/adapters/lambda-invoker.test.ts +0 -104
  256. package/src/database/adapters/lambda-invoker.ts +0 -61
  257. package/src/database/config.ts +0 -142
  258. package/src/database/documentdb-encryption-service.ts +0 -191
  259. package/src/database/documentdb-utils.ts +0 -160
  260. package/src/database/encryption/encryption-schema-registry.test.ts +0 -397
  261. package/src/database/encryption/encryption-schema-registry.ts +0 -248
  262. package/src/database/encryption/field-encryption-service.test.ts +0 -511
  263. package/src/database/encryption/index.ts +0 -24
  264. package/src/database/encryption/mongo-decryption-fix-verification.test.ts +0 -337
  265. package/src/database/encryption/postgres-decryption-fix-verification.test.ts +0 -335
  266. package/src/database/encryption/postgres-relation-decryption.test.ts +0 -205
  267. package/src/database/encryption/prisma-encryption-extension.test.ts +0 -433
  268. package/src/database/index.ts +0 -126
  269. package/src/database/prisma.test.ts +0 -65
  270. package/src/database/repositories/health-check-repository-factory.ts +0 -38
  271. package/src/database/repositories/health-check-repository-interface.ts +0 -20
  272. package/src/database/repositories/health-check-repository-mongodb.test.ts +0 -178
  273. package/src/database/repositories/health-check-repository-mongodb.ts +0 -79
  274. package/src/database/repositories/health-check-repository-postgres.test.ts +0 -94
  275. package/src/database/repositories/health-check-repository-postgres.ts +0 -70
  276. package/src/database/repositories/index.ts +0 -10
  277. package/src/database/repositories/migration-status-repository-s3.test.ts +0 -150
  278. package/src/database/repositories/migration-status-repository-s3.ts +0 -127
  279. package/src/database/use-cases/check-database-health-use-case.test.ts +0 -131
  280. package/src/database/use-cases/check-database-health-use-case.ts +0 -30
  281. package/src/database/use-cases/check-database-state-use-case.test.ts +0 -131
  282. package/src/database/use-cases/check-database-state-use-case.ts +0 -66
  283. package/src/database/use-cases/check-encryption-health-use-case.test.ts +0 -183
  284. package/src/database/use-cases/get-database-state-via-worker-use-case.test.ts +0 -126
  285. package/src/database/use-cases/get-database-state-via-worker-use-case.ts +0 -31
  286. package/src/database/use-cases/get-migration-status-use-case.test.ts +0 -160
  287. package/src/database/use-cases/get-migration-status-use-case.ts +0 -57
  288. package/src/database/use-cases/index.ts +0 -14
  289. package/src/database/use-cases/run-database-migration-use-case.test.ts +0 -350
  290. package/src/database/use-cases/test-encryption-use-case.ts +0 -197
  291. package/src/database/use-cases/trigger-database-migration-use-case.test.ts +0 -256
  292. package/src/database/utils/index.ts +0 -26
  293. package/src/database/utils/mongodb-collection-utils.test.ts +0 -133
  294. package/src/database/utils/mongodb-collection-utils.ts +0 -45
  295. package/src/database/utils/mongodb-schema-init.test.ts +0 -152
  296. package/src/database/utils/mongodb-schema-init.ts +0 -51
  297. package/src/database/utils/prisma-runner.test.ts +0 -513
  298. package/src/database/utils/prisma-runner.ts +0 -336
  299. package/src/database/utils/prisma-schema-parser.test.ts +0 -283
  300. package/src/database/utils/prisma-schema-parser.ts +0 -90
  301. package/src/declarations.d.ts +0 -141
  302. package/src/encrypt/Cryptor.test.ts +0 -137
  303. package/src/encrypt/index.ts +0 -2
  304. package/src/errors/base-error.test.ts +0 -32
  305. package/src/errors/base-error.ts +0 -15
  306. package/src/errors/client-safe-error.ts +0 -12
  307. package/src/errors/fetch-error.test.ts +0 -105
  308. package/src/errors/halt-error.test.ts +0 -11
  309. package/src/errors/halt-error.ts +0 -10
  310. package/src/errors/index.ts +0 -9
  311. package/src/errors/validation-errors.test.ts +0 -122
  312. package/src/errors/validation-errors.ts +0 -33
  313. package/src/handlers/app-definition-loader.ts +0 -52
  314. package/src/handlers/app-handler-helpers.ts +0 -64
  315. package/src/handlers/auth-flow.integration.test.ts +0 -149
  316. package/src/handlers/index.ts +0 -22
  317. package/src/handlers/integration-event-dispatcher.test.ts +0 -211
  318. package/src/handlers/routers/auth.ts +0 -20
  319. package/src/handlers/routers/db-migration.test.ts +0 -69
  320. package/src/handlers/routers/db-migration.ts +0 -173
  321. package/src/handlers/routers/health.test.ts +0 -251
  322. package/src/handlers/routers/index.ts +0 -8
  323. package/src/handlers/routers/integration-defined-routers.ts +0 -50
  324. package/src/handlers/routers/integration-webhook-routers.test.ts +0 -116
  325. package/src/handlers/use-cases/check-integrations-health-use-case.test.ts +0 -124
  326. package/src/handlers/use-cases/index.ts +0 -9
  327. package/src/handlers/webhook-flow.integration.test.ts +0 -318
  328. package/src/handlers/workers/db-migration.test.ts +0 -168
  329. package/src/handlers/workers/db-migration.ts +0 -173
  330. package/src/handlers/workers/index.ts +0 -3
  331. package/src/handlers/workers/integration-defined-workers.test.ts +0 -254
  332. package/src/handlers/workers/integration-defined-workers.ts +0 -35
  333. package/src/index.ts +0 -400
  334. package/src/infrastructure/index.ts +0 -14
  335. package/src/infrastructure/scheduler/index.ts +0 -19
  336. package/src/infrastructure/scheduler/scheduler-service-factory.ts +0 -50
  337. package/src/infrastructure/scheduler/scheduler-service-interface.ts +0 -31
  338. package/src/integrations/index.ts +0 -79
  339. package/src/integrations/integration-base.module-keys.test.ts +0 -204
  340. package/src/integrations/options.ts +0 -57
  341. package/src/integrations/repositories/integration-mapping-repository-factory.ts +0 -27
  342. package/src/integrations/repositories/integration-mapping-repository-interface.ts +0 -56
  343. package/src/integrations/repositories/integration-mapping-repository-mongo.ts +0 -89
  344. package/src/integrations/repositories/integration-mapping-repository-postgres.ts +0 -129
  345. package/src/integrations/repositories/integration-mapping-repository.ts +0 -71
  346. package/src/integrations/repositories/integration-repository-factory.ts +0 -27
  347. package/src/integrations/repositories/integration-repository-interface.ts +0 -52
  348. package/src/integrations/repositories/integration-repository-mongo.ts +0 -186
  349. package/src/integrations/repositories/integration-repository-postgres.ts +0 -227
  350. package/src/integrations/repositories/process-repository-factory.ts +0 -27
  351. package/src/integrations/repositories/process-repository-interface.ts +0 -34
  352. package/src/integrations/repositories/process-repository-mongo.ts +0 -102
  353. package/src/integrations/repositories/process-repository-postgres.ts +0 -123
  354. package/src/integrations/tests/integration-router-multi-auth.test.ts +0 -531
  355. package/src/integrations/tests/use-cases/create-integration.test.ts +0 -131
  356. package/src/integrations/tests/use-cases/delete-integration-for-user.test.ts +0 -150
  357. package/src/integrations/tests/use-cases/find-integration-context-by-external-entity-id.test.ts +0 -92
  358. package/src/integrations/tests/use-cases/get-integration-for-user.test.ts +0 -150
  359. package/src/integrations/tests/use-cases/get-integration-instance.test.ts +0 -176
  360. package/src/integrations/tests/use-cases/get-integrations-for-user.test.ts +0 -176
  361. package/src/integrations/tests/use-cases/get-possible-integrations.test.ts +0 -188
  362. package/src/integrations/tests/use-cases/update-integration-messages.test.ts +0 -142
  363. package/src/integrations/tests/use-cases/update-integration-status.test.ts +0 -103
  364. package/src/integrations/tests/use-cases/update-integration.test.ts +0 -208
  365. package/src/integrations/types.ts +0 -195
  366. package/src/integrations/use-cases/create-integration.ts +0 -70
  367. package/src/integrations/use-cases/create-process.test.ts +0 -172
  368. package/src/integrations/use-cases/create-process.ts +0 -77
  369. package/src/integrations/use-cases/delete-integration-for-user.ts +0 -87
  370. package/src/integrations/use-cases/find-integration-context-by-external-entity-id.ts +0 -92
  371. package/src/integrations/use-cases/get-integration-for-user.ts +0 -74
  372. package/src/integrations/use-cases/get-integration-instance-by-definition.ts +0 -69
  373. package/src/integrations/use-cases/get-integrations-for-user.ts +0 -75
  374. package/src/integrations/use-cases/get-possible-integrations.ts +0 -15
  375. package/src/integrations/use-cases/get-process.test.ts +0 -181
  376. package/src/integrations/use-cases/get-process.ts +0 -49
  377. package/src/integrations/use-cases/index.ts +0 -16
  378. package/src/integrations/use-cases/load-integration-context-full.test.ts +0 -316
  379. package/src/integrations/use-cases/load-integration-context.test.ts +0 -115
  380. package/src/integrations/use-cases/update-integration-messages.ts +0 -26
  381. package/src/integrations/use-cases/update-integration-status.ts +0 -17
  382. package/src/integrations/use-cases/update-integration.ts +0 -76
  383. package/src/integrations/use-cases/update-process-metrics.test.ts +0 -278
  384. package/src/integrations/use-cases/update-process-metrics.ts +0 -128
  385. package/src/integrations/use-cases/update-process-state.test.ts +0 -249
  386. package/src/integrations/use-cases/update-process-state.ts +0 -73
  387. package/src/integrations/utils/map-integration-dto.ts +0 -55
  388. package/src/lambda/TimeoutCatcher.test.ts +0 -69
  389. package/src/lambda/TimeoutCatcher.ts +0 -57
  390. package/src/lambda/index.ts +0 -2
  391. package/src/logs/index.ts +0 -2
  392. package/src/logs/logger.test.ts +0 -76
  393. package/src/modules/ModuleConstants.ts +0 -11
  394. package/src/modules/index.ts +0 -38
  395. package/src/modules/module-hydration.test.ts +0 -203
  396. package/src/modules/module.ts +0 -283
  397. package/src/modules/repositories/module-repository-factory.ts +0 -29
  398. package/src/modules/repositories/module-repository-interface.ts +0 -73
  399. package/src/modules/repositories/module-repository-mongo.ts +0 -260
  400. package/src/modules/repositories/module-repository-postgres.ts +0 -293
  401. package/src/modules/repositories/module-repository.ts +0 -210
  402. package/src/modules/requester/api-key.ts +0 -58
  403. package/src/modules/requester/basic.ts +0 -49
  404. package/src/modules/requester/oauth-2.test.ts +0 -425
  405. package/src/modules/requester/oauth-2.ts +0 -298
  406. package/src/modules/requester/requester.test.ts +0 -28
  407. package/src/modules/requester/requester.ts +0 -212
  408. package/src/modules/tests/doubles/test-module-factory.ts +0 -11
  409. package/src/modules/tests/module-on-token-update.test.ts +0 -125
  410. package/src/modules/use-cases/get-entities-for-user.ts +0 -36
  411. package/src/modules/use-cases/get-entity-options-by-type.ts +0 -25
  412. package/src/modules/use-cases/get-module-instance-from-type.ts +0 -23
  413. package/src/modules/utils/map-module-dto.ts +0 -23
  414. package/src/queues/index.ts +0 -1
  415. package/src/queues/queuer-util.test.ts +0 -131
  416. package/src/syncs/index.ts +0 -14
  417. package/src/syncs/repositories/sync-repository-factory.ts +0 -30
  418. package/src/syncs/repositories/sync-repository-interface.ts +0 -68
  419. package/src/syncs/repositories/sync-repository-mongo.ts +0 -149
  420. package/src/syncs/repositories/sync-repository-postgres.ts +0 -221
  421. package/src/syncs/sync.ts +0 -119
  422. package/src/token/index.ts +0 -7
  423. package/src/token/repositories/token-repository-documentdb.ts +0 -110
  424. package/src/token/repositories/token-repository-factory.ts +0 -26
  425. package/src/token/repositories/token-repository-interface.ts +0 -57
  426. package/src/token/repositories/token-repository-mongo.ts +0 -81
  427. package/src/token/repositories/token-repository-postgres.ts +0 -105
  428. package/src/token/repositories/token-repository.ts +0 -125
  429. package/src/user/index.ts +0 -17
  430. package/src/user/repositories/user-repository-documentdb.ts +0 -286
  431. package/src/user/repositories/user-repository-factory.ts +0 -26
  432. package/src/user/repositories/user-repository-interface.ts +0 -109
  433. package/src/user/repositories/user-repository-mongo.ts +0 -130
  434. package/src/user/repositories/user-repository-postgres.ts +0 -175
  435. package/src/user/tests/use-cases/create-individual-user.test.ts +0 -24
  436. package/src/user/tests/use-cases/create-organization-user.test.ts +0 -28
  437. package/src/user/tests/use-cases/create-token-for-user-id.test.ts +0 -18
  438. package/src/user/tests/use-cases/get-user-from-adopter-jwt.test.ts +0 -113
  439. package/src/user/tests/use-cases/get-user-from-bearer-token.test.ts +0 -64
  440. package/src/user/tests/use-cases/get-user-from-x-frigg-headers.test.ts +0 -440
  441. package/src/user/tests/use-cases/login-user.test.ts +0 -220
  442. package/src/user/use-cases/authenticate-user.ts +0 -98
  443. package/src/user/use-cases/authenticate-with-shared-secret.test.ts +0 -127
  444. package/src/user/use-cases/authenticate-with-shared-secret.ts +0 -19
  445. package/src/user/use-cases/create-individual-user.ts +0 -59
  446. package/src/user/use-cases/create-organization-user.ts +0 -44
  447. package/src/user/use-cases/create-token-for-user-id.ts +0 -19
  448. package/src/user/use-cases/get-user-from-adopter-jwt.ts +0 -40
  449. package/src/user/use-cases/get-user-from-x-frigg-headers.ts +0 -119
  450. package/src/user/use-cases/login-user.ts +0 -110
  451. package/src/user/user.ts +0 -125
  452. package/src/utils/index.ts +0 -2
  453. package/src/websocket/index.ts +0 -7
  454. package/src/websocket/repositories/websocket-connection-repository-factory.ts +0 -26
  455. package/src/websocket/repositories/websocket-connection-repository-interface.ts +0 -47
  456. package/src/websocket/repositories/websocket-connection-repository-mongo.ts +0 -77
  457. package/src/websocket/repositories/websocket-connection-repository-postgres.ts +0 -94
  458. package/src/websocket/repositories/websocket-connection-repository.test.ts +0 -220
  459. package/src/websocket/repositories/websocket-connection-repository.ts +0 -101
  460. package/tsconfig.json +0 -17
  461. package/tsconfig.test.json +0 -10
  462. package/workflows/frigg-workflow.ts +0 -322
  463. package/workflows/index.ts +0 -205
  464. package/workflows/steps/fan-out-step.ts +0 -275
  465. package/workflows/steps/function-step.ts +0 -174
  466. package/workflows/steps/index.ts +0 -30
  467. package/workflows/steps/workflow-step.ts +0 -115
  468. package/workflows/use-cases/create-workflow.ts +0 -332
  469. package/workflows/use-cases/execute-workflow-step.ts +0 -465
  470. package/workflows/use-cases/execute-workflow.ts +0 -403
  471. package/workflows/workflow-execution-repository.ts +0 -415
  472. package/workflows/workflow-execution.ts +0 -209
  473. package/workflows/workflow-queue-service.ts +0 -379
  474. package/workflows/workflow-repository.ts +0 -295
  475. package/workflows/workflow.ts +0 -117
@@ -0,0 +1,245 @@
1
+ const {
2
+ createCredentialRepository,
3
+ } = require('../../credential/repositories/credential-repository-factory');
4
+
5
+ const ERROR_CODE_MAP = {
6
+ CREDENTIAL_NOT_FOUND: 404,
7
+ INVALID_CREDENTIAL_DATA: 400,
8
+ };
9
+
10
+ function mapErrorToResponse(error) {
11
+ const status = ERROR_CODE_MAP[error?.code] || 500;
12
+ return {
13
+ error: status,
14
+ reason: error?.message,
15
+ code: error?.code,
16
+ };
17
+ }
18
+
19
+ /**
20
+ * Create credential command factory
21
+ *
22
+ * NOTE: This is an internal API. Integration developers should use createFriggCommands() instead.
23
+ *
24
+ * @returns {Object} Credential command object with CRUD operations
25
+ */
26
+ function createCredentialCommands() {
27
+ const credRepo = createCredentialRepository();
28
+
29
+ return {
30
+ /**
31
+ * Create a new credential
32
+ * @param {Object} params
33
+ * @param {string} params.userId - User ID who owns this credential
34
+ * @param {string} params.externalId - External identifier from the API module
35
+ * @param {string} params.access_token - OAuth access token
36
+ * @param {string} [params.refresh_token] - OAuth refresh token
37
+ * @param {string} [params.domain] - Domain for the credential
38
+ * @param {boolean} [params.authIsValid=true] - Whether authentication is valid
39
+ * @returns {Promise<Object>} Created credential object
40
+ */
41
+ async createCredential({
42
+ userId,
43
+ externalId,
44
+ access_token,
45
+ refresh_token,
46
+ domain,
47
+ authIsValid = true,
48
+ } = {}) {
49
+ try {
50
+ if (!userId || !externalId || !access_token) {
51
+ const error = new Error(
52
+ 'userId, externalId, and access_token are required'
53
+ );
54
+ error.code = 'INVALID_CREDENTIAL_DATA';
55
+ throw error;
56
+ }
57
+
58
+ const credentialData = {
59
+ identifiers: { userId, externalId },
60
+ details: {
61
+ access_token,
62
+ authIsValid,
63
+ },
64
+ };
65
+
66
+ if (refresh_token) {
67
+ credentialData.details.refresh_token = refresh_token;
68
+ }
69
+ if (domain) {
70
+ credentialData.details.domain = domain;
71
+ }
72
+
73
+ const credential = await credRepo.upsertCredential(
74
+ credentialData
75
+ );
76
+
77
+ return {
78
+ id: credential.id,
79
+ userId: credential.userId,
80
+ externalId: credential.externalId,
81
+ access_token: credential.access_token,
82
+ refresh_token: credential.refresh_token,
83
+ authIsValid: credential.authIsValid,
84
+ };
85
+ } catch (error) {
86
+ return mapErrorToResponse(error);
87
+ }
88
+ },
89
+
90
+ /**
91
+ * Find a credential by filter criteria
92
+ * @param {Object} filter
93
+ * @param {string} [filter.userId] - User ID to search for
94
+ * @param {string} [filter.externalId] - External ID to search for
95
+ * @param {string} [filter.credentialId] - Credential ID to search for
96
+ * @returns {Promise<Object|null>} Credential object or null if not found
97
+ */
98
+ async findCredential(filter = {}) {
99
+ try {
100
+ if (
101
+ !filter.userId &&
102
+ !filter.externalId &&
103
+ !filter.credentialId
104
+ ) {
105
+ const error = new Error(
106
+ 'At least one filter criterion is required'
107
+ );
108
+ error.code = 'INVALID_CREDENTIAL_DATA';
109
+ throw error;
110
+ }
111
+
112
+ const credential = await credRepo.findCredential(filter);
113
+
114
+ if (!credential) {
115
+ return null;
116
+ }
117
+
118
+ return {
119
+ id: credential.id,
120
+ userId: credential.userId,
121
+ externalId: credential.externalId,
122
+ access_token: credential.access_token,
123
+ refresh_token: credential.refresh_token,
124
+ authIsValid: credential.authIsValid,
125
+ domain: credential.domain,
126
+ };
127
+ } catch (error) {
128
+ return mapErrorToResponse(error);
129
+ }
130
+ },
131
+
132
+ /**
133
+ * Update a credential by ID
134
+ * @param {string} credentialId - Credential ID to update
135
+ * @param {Object} updates - Fields to update
136
+ * @returns {Promise<Object>} Updated credential object
137
+ */
138
+ async updateCredential(credentialId, updates) {
139
+ try {
140
+ if (!credentialId) {
141
+ const error = new Error('credentialId is required');
142
+ error.code = 'INVALID_CREDENTIAL_DATA';
143
+ throw error;
144
+ }
145
+
146
+ const credential = await credRepo.updateCredential(
147
+ credentialId,
148
+ updates
149
+ );
150
+
151
+ if (!credential) {
152
+ const error = new Error(
153
+ `Credential ${credentialId} not found`
154
+ );
155
+ error.code = 'CREDENTIAL_NOT_FOUND';
156
+ throw error;
157
+ }
158
+
159
+ return {
160
+ id: credential.id,
161
+ userId: credential.userId,
162
+ externalId: credential.externalId,
163
+ access_token: credential.access_token,
164
+ refresh_token: credential.refresh_token,
165
+ authIsValid: credential.authIsValid,
166
+ domain: credential.domain,
167
+ };
168
+ } catch (error) {
169
+ return mapErrorToResponse(error);
170
+ }
171
+ },
172
+
173
+ /**
174
+ * Update authentication status for a credential
175
+ * @param {string} credentialId - Credential ID to update
176
+ * @param {boolean} isValid - Whether authentication is valid
177
+ * @returns {Promise<Object>} Result object with success flag
178
+ */
179
+ async updateAuthenticationStatus(credentialId, isValid) {
180
+ try {
181
+ if (!credentialId) {
182
+ const error = new Error('credentialId is required');
183
+ error.code = 'INVALID_CREDENTIAL_DATA';
184
+ throw error;
185
+ }
186
+
187
+ await credRepo.updateAuthenticationStatus(
188
+ credentialId,
189
+ isValid
190
+ );
191
+
192
+ return { success: true };
193
+ } catch (error) {
194
+ return mapErrorToResponse(error);
195
+ }
196
+ },
197
+
198
+ /**
199
+ * Delete a credential by ID
200
+ * @param {string} credentialId - Credential ID to delete
201
+ * @returns {Promise<Object>} Result object with success flag
202
+ */
203
+ async deleteCredential(credentialId) {
204
+ try {
205
+ if (!credentialId) {
206
+ const error = new Error('credentialId is required');
207
+ error.code = 'INVALID_CREDENTIAL_DATA';
208
+ throw error;
209
+ }
210
+
211
+ await credRepo.deleteCredentialById(credentialId);
212
+
213
+ return { success: true };
214
+ } catch (error) {
215
+ return mapErrorToResponse(error);
216
+ }
217
+ },
218
+
219
+ /**
220
+ * Delete a credential by ID (alias for deleteCredential)
221
+ * @param {string} credentialId - Credential ID to delete
222
+ * @returns {Promise<Object>} Result object with success flag
223
+ */
224
+ async deleteCredentialById(credentialId) {
225
+ try {
226
+ if (!credentialId) {
227
+ const error = new Error('credentialId is required');
228
+ error.code = 'INVALID_CREDENTIAL_DATA';
229
+ throw error;
230
+ }
231
+
232
+ await credRepo.deleteCredentialById(credentialId);
233
+
234
+ return { success: true };
235
+ } catch (error) {
236
+ return mapErrorToResponse(error);
237
+ }
238
+ },
239
+ };
240
+ }
241
+
242
+ module.exports = {
243
+ createCredentialCommands,
244
+ ERROR_CODE_MAP,
245
+ };
@@ -0,0 +1,336 @@
1
+ const {
2
+ createModuleRepository,
3
+ } = require('../../modules/repositories/module-repository-factory');
4
+
5
+ const ERROR_CODE_MAP = {
6
+ ENTITY_NOT_FOUND: 404,
7
+ INVALID_ENTITY_DATA: 400,
8
+ };
9
+
10
+ function mapErrorToResponse(error) {
11
+ const status = ERROR_CODE_MAP[error?.code] || 500;
12
+ return {
13
+ error: status,
14
+ reason: error?.message,
15
+ code: error?.code,
16
+ };
17
+ }
18
+
19
+ /**
20
+ * Create entity command factory
21
+ *
22
+ * NOTE: This is an internal API. Integration developers should use createFriggCommands() instead.
23
+ *
24
+ * @returns {Object} Entity command object with CRUD operations
25
+ */
26
+ function createEntityCommands() {
27
+ const moduleRepo = createModuleRepository();
28
+
29
+ return {
30
+ /**
31
+ * Create a new entity
32
+ * @param {Object} params
33
+ * @param {string} params.userId - User ID who owns this entity
34
+ * @param {string} params.externalId - External identifier from the API module
35
+ * @param {string} params.name - Entity name
36
+ * @param {string} params.moduleName - Module name (e.g., 'husbpot', 'frontify')
37
+ * @param {string} [params.credentialId] - Associated credential ID
38
+ * @returns {Promise<Object>} Created entity object
39
+ */
40
+ async createEntity({
41
+ userId,
42
+ externalId,
43
+ name,
44
+ moduleName,
45
+ credentialId,
46
+ } = {}) {
47
+ try {
48
+ if (!userId || !externalId || !moduleName) {
49
+ const error = new Error(
50
+ 'userId, externalId, and moduleName are required'
51
+ );
52
+ error.code = 'INVALID_ENTITY_DATA';
53
+ throw error;
54
+ }
55
+
56
+ const entityData = {
57
+ user: userId,
58
+ externalId,
59
+ name,
60
+ moduleName,
61
+ };
62
+
63
+ if (credentialId) {
64
+ entityData.credential = credentialId;
65
+ }
66
+
67
+ const entity = await moduleRepo.createEntity(entityData);
68
+
69
+ return {
70
+ id: entity.id,
71
+ userId: entity.userId,
72
+ externalId: entity.externalId,
73
+ name: entity.name,
74
+ moduleName: entity.moduleName,
75
+ credentialId: entity.credential?._id
76
+ ? entity.credential._id.toString()
77
+ : entity.credential,
78
+ };
79
+ } catch (error) {
80
+ return mapErrorToResponse(error);
81
+ }
82
+ },
83
+
84
+ /**
85
+ * Find an entity by filter criteria
86
+ * @param {Object} filter
87
+ * @param {string} [filter.externalId] - External ID to search for
88
+ * @param {string} [filter.userId] - User ID to search for
89
+ * @param {string} [filter.moduleName] - Module name to search for
90
+ * @returns {Promise<Object|null>} Entity object or null if not found
91
+ */
92
+ async findEntity(filter = {}) {
93
+ try {
94
+ if (
95
+ !filter.externalId &&
96
+ !filter.userId &&
97
+ !filter.moduleName
98
+ ) {
99
+ const error = new Error(
100
+ 'At least one filter criterion is required'
101
+ );
102
+ error.code = 'INVALID_ENTITY_DATA';
103
+ throw error;
104
+ }
105
+
106
+ const entity = await moduleRepo.findEntity(filter);
107
+
108
+ if (!entity) {
109
+ return null;
110
+ }
111
+
112
+ return {
113
+ id: entity.id,
114
+ userId: entity.userId,
115
+ externalId: entity.externalId,
116
+ name: entity.name,
117
+ moduleName: entity.moduleName,
118
+ credentialId: entity.credential?._id
119
+ ? entity.credential._id.toString()
120
+ : entity.credential,
121
+ };
122
+ } catch (error) {
123
+ return mapErrorToResponse(error);
124
+ }
125
+ },
126
+
127
+ /**
128
+ * Find all entities for a user
129
+ * @param {string} userId - User ID to search for
130
+ * @returns {Promise<Array>} Array of entity objects
131
+ */
132
+ async findEntitiesByUserId(userId) {
133
+ try {
134
+ if (!userId) {
135
+ const error = new Error('userId is required');
136
+ error.code = 'INVALID_ENTITY_DATA';
137
+ throw error;
138
+ }
139
+
140
+ const entities = await moduleRepo.findEntitiesByUserId(userId);
141
+
142
+ return entities.map((entity) => ({
143
+ id: entity.id,
144
+ userId: entity.userId,
145
+ externalId: entity.externalId,
146
+ name: entity.name,
147
+ moduleName: entity.moduleName,
148
+ credentialId: entity.credential?._id
149
+ ? entity.credential._id.toString()
150
+ : entity.credential,
151
+ }));
152
+ } catch (error) {
153
+ if (error.code) {
154
+ return mapErrorToResponse(error);
155
+ }
156
+ // For find operations, return empty array on error instead of error object
157
+ return [];
158
+ }
159
+ },
160
+
161
+ /**
162
+ * Find entities by user ID and module name
163
+ * @param {string} userId - User ID to search for
164
+ * @param {string} moduleName - Module name to filter by
165
+ * @returns {Promise<Array>} Array of entity objects
166
+ */
167
+ async findEntitiesByUserIdAndModuleName(userId, moduleName) {
168
+ try {
169
+ if (!userId || !moduleName) {
170
+ const error = new Error(
171
+ 'userId and moduleName are required'
172
+ );
173
+ error.code = 'INVALID_ENTITY_DATA';
174
+ throw error;
175
+ }
176
+
177
+ const entities =
178
+ await moduleRepo.findEntitiesByUserIdAndModuleName(
179
+ userId,
180
+ moduleName
181
+ );
182
+
183
+ return entities.map((entity) => ({
184
+ id: entity.id,
185
+ userId: entity.userId,
186
+ externalId: entity.externalId,
187
+ name: entity.name,
188
+ moduleName: entity.moduleName,
189
+ credentialId: entity.credential?._id
190
+ ? entity.credential._id.toString()
191
+ : entity.credential,
192
+ }));
193
+ } catch (error) {
194
+ if (error.code) {
195
+ return mapErrorToResponse(error);
196
+ }
197
+ return [];
198
+ }
199
+ },
200
+
201
+ /**
202
+ * Find an entity by ID
203
+ * @param {string} entityId - Entity ID to search for
204
+ * @returns {Promise<Object>} Entity object
205
+ */
206
+ async findEntityById(entityId) {
207
+ try {
208
+ if (!entityId) {
209
+ const error = new Error('entityId is required');
210
+ error.code = 'INVALID_ENTITY_DATA';
211
+ throw error;
212
+ }
213
+
214
+ const entity = await moduleRepo.findEntityById(entityId);
215
+
216
+ return {
217
+ id: entity.id,
218
+ userId: entity.userId,
219
+ externalId: entity.externalId,
220
+ name: entity.name,
221
+ moduleName: entity.moduleName,
222
+ credentialId: entity.credential?._id
223
+ ? entity.credential._id.toString()
224
+ : entity.credential,
225
+ };
226
+ } catch (error) {
227
+ return mapErrorToResponse(error);
228
+ }
229
+ },
230
+
231
+ /**
232
+ * Update an entity
233
+ * @param {string} entityId - Entity ID to update
234
+ * @param {Object} updates - Fields to update
235
+ * @returns {Promise<Object>} Updated entity object
236
+ */
237
+ async updateEntity(entityId, updates) {
238
+ try {
239
+ if (!entityId) {
240
+ const error = new Error('entityId is required');
241
+ error.code = 'INVALID_ENTITY_DATA';
242
+ throw error;
243
+ }
244
+
245
+ const entity = await moduleRepo.updateEntity(entityId, updates);
246
+
247
+ if (!entity) {
248
+ const error = new Error(`Entity ${entityId} not found`);
249
+ error.code = 'ENTITY_NOT_FOUND';
250
+ throw error;
251
+ }
252
+
253
+ return {
254
+ id: entity.id,
255
+ userId: entity.userId,
256
+ externalId: entity.externalId,
257
+ name: entity.name,
258
+ moduleName: entity.moduleName,
259
+ credentialId: entity.credential?._id
260
+ ? entity.credential._id.toString()
261
+ : entity.credential,
262
+ };
263
+ } catch (error) {
264
+ return mapErrorToResponse(error);
265
+ }
266
+ },
267
+
268
+ /**
269
+ * Delete an entity
270
+ * @param {string} entityId - Entity ID to delete
271
+ * @returns {Promise<Object>} Result object with success flag
272
+ */
273
+ async deleteEntity(entityId) {
274
+ try {
275
+ if (!entityId) {
276
+ const error = new Error('entityId is required');
277
+ error.code = 'INVALID_ENTITY_DATA';
278
+ throw error;
279
+ }
280
+
281
+ await moduleRepo.deleteEntity(entityId);
282
+
283
+ return { success: true };
284
+ } catch (error) {
285
+ return mapErrorToResponse(error);
286
+ }
287
+ },
288
+
289
+ /**
290
+ * Delete an entity by ID (alias for deleteEntity)
291
+ * @param {string} entityId - Entity ID to delete
292
+ * @returns {Promise<Object>} Result object with success flag
293
+ */
294
+ async deleteEntityById(entityId) {
295
+ try {
296
+ if (!entityId) {
297
+ const error = new Error('entityId is required');
298
+ error.code = 'INVALID_ENTITY_DATA';
299
+ throw error;
300
+ }
301
+
302
+ await moduleRepo.deleteEntity(entityId);
303
+
304
+ return { success: true };
305
+ } catch (error) {
306
+ return mapErrorToResponse(error);
307
+ }
308
+ },
309
+
310
+ /**
311
+ * Remove credential reference from an entity
312
+ * @param {string} entityId - Entity ID to update
313
+ * @returns {Promise<Object>} Result object with success flag
314
+ */
315
+ async unsetCredential(entityId) {
316
+ try {
317
+ if (!entityId) {
318
+ const error = new Error('entityId is required');
319
+ error.code = 'INVALID_ENTITY_DATA';
320
+ throw error;
321
+ }
322
+
323
+ const acknowledged = await moduleRepo.unsetCredential(entityId);
324
+
325
+ return { success: acknowledged };
326
+ } catch (error) {
327
+ return mapErrorToResponse(error);
328
+ }
329
+ },
330
+ };
331
+ }
332
+
333
+ module.exports = {
334
+ createEntityCommands,
335
+ ERROR_CODE_MAP,
336
+ };