@friggframework/core 2.0.0--canary.522.cbd3d5a.0 → 2.0.0--canary.517.35ee143.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 (225) hide show
  1. package/CHANGELOG.md +67 -66
  2. package/CLAUDE.md +124 -148
  3. package/README.md +130 -165
  4. package/admin-scripts/index.js +16 -30
  5. package/admin-scripts/repositories/{admin-api-key-repository-documentdb.js → admin-process-repository-documentdb.js} +5 -5
  6. package/admin-scripts/repositories/{admin-api-key-repository-factory.js → admin-process-repository-factory.js} +15 -19
  7. package/admin-scripts/repositories/admin-process-repository-interface.js +150 -0
  8. package/admin-scripts/repositories/admin-process-repository-mongo.js +213 -0
  9. package/admin-scripts/repositories/admin-process-repository-postgres.js +251 -0
  10. package/admin-scripts/repositories/script-schedule-repository-factory.js +2 -6
  11. package/admin-scripts/repositories/script-schedule-repository-interface.js +14 -36
  12. package/admin-scripts/repositories/script-schedule-repository-mongo.js +13 -25
  13. package/admin-scripts/repositories/script-schedule-repository-postgres.js +13 -25
  14. package/application/commands/admin-script-commands.js +102 -266
  15. package/application/commands/integration-commands.js +6 -12
  16. package/application/index.js +3 -1
  17. package/assertions/get.js +4 -1
  18. package/associations/association.js +57 -59
  19. package/associations/model.js +41 -41
  20. package/core/CLAUDE.md +156 -222
  21. package/core/Worker.js +1 -5
  22. package/credential/repositories/credential-repository-documentdb.js +1 -71
  23. package/credential/repositories/credential-repository-interface.js +2 -8
  24. package/credential/repositories/credential-repository-mongo.js +4 -45
  25. package/credential/repositories/credential-repository-postgres.js +3 -44
  26. package/credential/repositories/credential-repository.js +4 -6
  27. package/credential/use-cases/get-credential-for-user.js +3 -21
  28. package/credential/use-cases/update-authentication-status.js +2 -5
  29. package/database/MONGODB_TRANSACTION_FIX.md +52 -72
  30. package/database/adapters/lambda-invoker.js +7 -8
  31. package/database/config.js +13 -15
  32. package/database/documentdb-encryption-service.js +13 -29
  33. package/database/documentdb-utils.js +12 -21
  34. package/database/encryption/README.md +36 -53
  35. package/database/encryption/encryption-schema-registry.js +9 -21
  36. package/database/encryption/field-encryption-service.js +4 -15
  37. package/database/encryption/logger.js +2 -3
  38. package/database/encryption/prisma-encryption-extension.js +8 -5
  39. package/database/index.js +2 -4
  40. package/database/models/IndividualUser.js +15 -15
  41. package/database/models/OrganizationUser.js +4 -6
  42. package/database/models/UserModel.js +2 -2
  43. package/database/models/WebsocketConnection.js +1 -4
  44. package/database/mongoose.js +2 -2
  45. package/database/prisma.js +14 -22
  46. package/database/repositories/health-check-repository-documentdb.js +7 -22
  47. package/database/repositories/health-check-repository-factory.js +3 -9
  48. package/database/repositories/health-check-repository-interface.js +5 -15
  49. package/database/repositories/health-check-repository-mongodb.js +6 -9
  50. package/database/repositories/health-check-repository-postgres.js +1 -1
  51. package/database/repositories/migration-status-repository-s3.js +5 -10
  52. package/database/use-cases/check-database-health-use-case.js +2 -3
  53. package/database/use-cases/check-database-state-use-case.js +7 -9
  54. package/database/use-cases/get-database-state-via-worker-use-case.js +12 -15
  55. package/database/use-cases/get-migration-status-use-case.js +2 -4
  56. package/database/use-cases/run-database-migration-use-case.js +9 -41
  57. package/database/use-cases/test-encryption-use-case.js +5 -4
  58. package/database/use-cases/trigger-database-migration-use-case.js +8 -9
  59. package/database/utils/mongodb-collection-utils.js +3 -11
  60. package/database/utils/mongodb-schema-init.js +4 -10
  61. package/database/utils/prisma-runner.js +74 -144
  62. package/database/utils/prisma-schema-parser.js +2 -2
  63. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +80 -135
  64. package/encrypt/Cryptor.js +2 -8
  65. package/errors/fetch-error.js +1 -1
  66. package/generated/prisma-mongodb/edge.js +16 -59
  67. package/generated/prisma-mongodb/index-browser.js +12 -62
  68. package/generated/prisma-mongodb/index.d.ts +4850 -8136
  69. package/generated/prisma-mongodb/index.js +16 -59
  70. package/generated/prisma-mongodb/package.json +1 -1
  71. package/generated/prisma-mongodb/schema.prisma +33 -75
  72. package/generated/prisma-mongodb/wasm.js +16 -59
  73. package/generated/prisma-postgresql/edge.js +15 -59
  74. package/generated/prisma-postgresql/index-browser.js +11 -62
  75. package/generated/prisma-postgresql/index.d.ts +5963 -8930
  76. package/generated/prisma-postgresql/index.js +15 -59
  77. package/generated/prisma-postgresql/package.json +1 -1
  78. package/generated/prisma-postgresql/schema.prisma +33 -73
  79. package/generated/prisma-postgresql/wasm.js +15 -59
  80. package/handlers/WEBHOOKS.md +81 -104
  81. package/handlers/app-definition-loader.js +1 -1
  82. package/handlers/app-handler-helpers.js +2 -14
  83. package/handlers/backend-utils.js +1 -0
  84. package/handlers/database-migration-handler.js +45 -64
  85. package/handlers/middleware/admin-auth.js +53 -0
  86. package/handlers/routers/HEALTHCHECK.md +135 -170
  87. package/handlers/routers/auth.js +2 -23
  88. package/handlers/routers/db-migration.handler.js +3 -2
  89. package/handlers/routers/db-migration.js +33 -69
  90. package/handlers/routers/health.js +8 -23
  91. package/handlers/routers/integration-defined-routers.js +4 -4
  92. package/handlers/routers/integration-webhook-routers.js +7 -17
  93. package/handlers/routers/websocket.js +3 -9
  94. package/handlers/use-cases/check-integrations-health-use-case.js +6 -13
  95. package/handlers/workers/db-migration.js +26 -54
  96. package/index.js +9 -5
  97. package/integrations/WEBHOOK-QUICKSTART.md +14 -21
  98. package/integrations/index.js +0 -4
  99. package/integrations/integration-base.js +6 -9
  100. package/integrations/integration-router.js +146 -1817
  101. package/integrations/options.js +20 -47
  102. package/integrations/repositories/integration-repository-documentdb.js +24 -53
  103. package/integrations/repositories/integration-repository-factory.js +2 -6
  104. package/integrations/repositories/integration-repository-interface.js +9 -27
  105. package/integrations/repositories/integration-repository-postgres.js +3 -3
  106. package/integrations/repositories/process-repository-factory.js +1 -0
  107. package/integrations/repositories/process-repository-interface.js +5 -9
  108. package/integrations/repositories/process-repository-mongo.js +3 -7
  109. package/integrations/repositories/process-repository-postgres.js +2 -2
  110. package/integrations/tests/doubles/config-capturing-integration.js +8 -9
  111. package/integrations/tests/doubles/dummy-integration-class.js +8 -81
  112. package/integrations/tests/doubles/test-integration-repository.js +11 -51
  113. package/integrations/use-cases/create-integration.js +32 -36
  114. package/integrations/use-cases/create-process.js +9 -20
  115. package/integrations/use-cases/delete-integration-for-user.js +4 -5
  116. package/integrations/use-cases/get-integration-for-user.js +10 -25
  117. package/integrations/use-cases/get-integration-instance-by-definition.js +7 -13
  118. package/integrations/use-cases/get-integrations-for-user.js +1 -4
  119. package/integrations/use-cases/get-possible-integrations.js +1 -1
  120. package/integrations/use-cases/get-process.js +6 -5
  121. package/integrations/use-cases/index.js +1 -3
  122. package/integrations/use-cases/load-integration-context.js +5 -1
  123. package/integrations/use-cases/update-process-state.js +8 -10
  124. package/integrations/utils/map-integration-dto.js +3 -9
  125. package/jest-setup.js +1 -1
  126. package/jest-teardown.js +1 -1
  127. package/lambda/TimeoutCatcher.js +30 -32
  128. package/lambda/index.js +1 -1
  129. package/logs/index.js +3 -3
  130. package/modules/module.js +1 -3
  131. package/modules/repositories/module-repository-documentdb.js +48 -114
  132. package/modules/repositories/module-repository-interface.js +0 -13
  133. package/modules/repositories/module-repository-mongo.js +6 -46
  134. package/modules/repositories/module-repository-postgres.js +6 -48
  135. package/modules/repositories/module-repository.js +1 -34
  136. package/modules/requester/api-key.js +2 -0
  137. package/modules/requester/basic.js +1 -0
  138. package/modules/requester/oauth-2.js +2 -3
  139. package/modules/test/mock-api/definition.js +10 -15
  140. package/modules/test/mock-api/mocks/hubspot.js +36 -36
  141. package/modules/tests/doubles/test-module-factory.js +4 -10
  142. package/modules/tests/doubles/test-module-repository.js +1 -1
  143. package/modules/use-cases/get-entities-for-user.js +1 -1
  144. package/modules/use-cases/get-entity-options-by-id.js +6 -8
  145. package/modules/use-cases/get-module.js +9 -12
  146. package/modules/use-cases/process-authorization-callback.js +6 -12
  147. package/modules/use-cases/refresh-entity-options.js +6 -8
  148. package/modules/use-cases/test-module-auth.js +6 -8
  149. package/modules/utils/map-module-dto.js +2 -2
  150. package/package.json +5 -7
  151. package/prisma-mongodb/schema.prisma +33 -75
  152. package/prisma-postgresql/schema.prisma +33 -73
  153. package/queues/queuer-util.js +1 -5
  154. package/syncs/model.js +51 -51
  155. package/syncs/repositories/sync-repository-documentdb.js +19 -39
  156. package/syncs/repositories/sync-repository-interface.js +2 -6
  157. package/syncs/repositories/sync-repository-postgres.js +13 -19
  158. package/syncs/sync.js +100 -104
  159. package/token/repositories/token-repository-factory.js +3 -1
  160. package/types/assertions/index.d.ts +72 -72
  161. package/types/associations/index.d.ts +57 -57
  162. package/types/core/index.d.ts +53 -59
  163. package/types/database/index.d.ts +2 -2
  164. package/types/encrypt/index.d.ts +3 -3
  165. package/types/errors/index.d.ts +54 -61
  166. package/types/eslint-config/index.d.ts +40 -40
  167. package/types/integrations/index.d.ts +183 -185
  168. package/types/lambda/index.d.ts +26 -26
  169. package/types/logs/index.d.ts +4 -4
  170. package/types/module-plugin/index.d.ts +237 -239
  171. package/types/prettier-config/index.d.ts +5 -5
  172. package/types/syncs/index.d.ts +108 -102
  173. package/types/test-environment/index.d.ts +14 -14
  174. package/types/tsconfig.json +93 -95
  175. package/user/tests/doubles/test-user-repository.js +2 -5
  176. package/user/use-cases/authenticate-user.js +4 -2
  177. package/user/use-cases/authenticate-with-shared-secret.js +1 -1
  178. package/user/use-cases/create-individual-user.js +7 -8
  179. package/user/use-cases/create-organization-user.js +1 -1
  180. package/user/use-cases/create-token-for-user-id.js +1 -1
  181. package/user/use-cases/get-user-from-adopter-jwt.js +2 -0
  182. package/user/use-cases/get-user-from-bearer-token.js +3 -7
  183. package/user/use-cases/get-user-from-x-frigg-headers.js +11 -14
  184. package/user/use-cases/login-user.js +8 -8
  185. package/user/user.js +4 -18
  186. package/utils/backend-path.js +2 -2
  187. package/utils/index.js +1 -4
  188. package/websocket/repositories/websocket-connection-repository-documentdb.js +8 -21
  189. package/websocket/repositories/websocket-connection-repository-mongo.js +4 -8
  190. package/websocket/repositories/websocket-connection-repository-postgres.js +4 -8
  191. package/websocket/repositories/websocket-connection-repository.js +4 -8
  192. package/admin-scripts/repositories/admin-api-key-repository-interface.js +0 -121
  193. package/admin-scripts/repositories/admin-api-key-repository-mongo.js +0 -155
  194. package/admin-scripts/repositories/admin-api-key-repository-postgres.js +0 -189
  195. package/admin-scripts/repositories/script-execution-repository-documentdb.js +0 -21
  196. package/admin-scripts/repositories/script-execution-repository-factory.js +0 -55
  197. package/admin-scripts/repositories/script-execution-repository-interface.js +0 -193
  198. package/admin-scripts/repositories/script-execution-repository-mongo.js +0 -278
  199. package/admin-scripts/repositories/script-execution-repository-postgres.js +0 -320
  200. package/credential/credential-router.js +0 -262
  201. package/credential/use-cases/delete-credential-for-user.js +0 -50
  202. package/credential/use-cases/list-credentials-for-user.js +0 -31
  203. package/credential/use-cases/reauthorize-credential.js +0 -103
  204. package/handlers/routers/admin.js +0 -450
  205. package/handlers/routers/docs.js +0 -180
  206. package/handlers/routers/middleware/loadUser.js +0 -39
  207. package/handlers/routers/middleware/requireAdmin.js +0 -41
  208. package/handlers/routers/middleware/requireLoggedInUser.js +0 -19
  209. package/integrations/use-cases/execute-proxy-request.js +0 -564
  210. package/modules/domain/entities/AuthorizationSession.js +0 -131
  211. package/modules/domain/entities/index.js +0 -10
  212. package/modules/repositories/authorization-session-repository-factory.js +0 -55
  213. package/modules/repositories/authorization-session-repository-interface.js +0 -75
  214. package/modules/repositories/authorization-session-repository-mongo.js +0 -169
  215. package/modules/repositories/authorization-session-repository-postgres.js +0 -170
  216. package/modules/use-cases/delete-module-entity.js +0 -23
  217. package/modules/use-cases/get-authorization-requirements.js +0 -110
  218. package/modules/use-cases/get-module-entity-by-id.js +0 -16
  219. package/modules/use-cases/process-authorization-step.js +0 -160
  220. package/modules/use-cases/start-authorization-session.js +0 -86
  221. package/modules/use-cases/update-module-entity.js +0 -27
  222. package/openapi/openapi-spec-generator.js +0 -370
  223. package/openapi/openapi-v1.yaml +0 -1360
  224. package/openapi/openapi-v2.yaml +0 -1535
  225. package/user/use-cases/delete-user.js +0 -47
package/modules/module.js CHANGED
@@ -42,9 +42,7 @@ class Module extends Delegate {
42
42
  const apiParams = {
43
43
  ...this.definition.env,
44
44
  delegate: this,
45
- ...(this.credential?.data
46
- ? this.apiParamsFromCredential(this.credential.data)
47
- : {}), // Handle case when credential is undefined
45
+ ...(this.credential?.data ? this.apiParamsFromCredential(this.credential.data) : {}), // Handle case when credential is undefined
48
46
  ...this.apiParamsFromEntity(this.entity),
49
47
  };
50
48
  this.api = new this.apiClass(apiParams);
@@ -9,9 +9,7 @@ const {
9
9
  deleteOne,
10
10
  } = require('../../database/documentdb-utils');
11
11
  const { ModuleRepositoryInterface } = require('./module-repository-interface');
12
- const {
13
- DocumentDBEncryptionService,
14
- } = require('../../database/documentdb-encryption-service');
12
+ const { DocumentDBEncryptionService } = require('../../database/documentdb-encryption-service');
15
13
 
16
14
  /**
17
15
  * Module/Entity repository for DocumentDB.
@@ -52,34 +50,16 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
52
50
  }
53
51
  const filter = { userId: objectId };
54
52
  const docs = await findMany(this.prisma, 'Entity', filter);
55
- const credentialMap = await this._fetchCredentialsBulk(
56
- docs.map((doc) => doc.credentialId)
57
- );
58
- return docs.map((doc) =>
59
- this._mapEntity(
60
- doc,
61
- credentialMap.get(fromObjectId(doc.credentialId)) || null
62
- )
63
- );
53
+ const credentialMap = await this._fetchCredentialsBulk(docs.map((doc) => doc.credentialId));
54
+ return docs.map((doc) => this._mapEntity(doc, credentialMap.get(fromObjectId(doc.credentialId)) || null));
64
55
  }
65
56
 
66
57
  async findEntitiesByIds(entitiesIds) {
67
- const ids = (entitiesIds || [])
68
- .map((id) => toObjectId(id))
69
- .filter(Boolean);
58
+ const ids = (entitiesIds || []).map((id) => toObjectId(id)).filter(Boolean);
70
59
  if (ids.length === 0) return [];
71
- const docs = await findMany(this.prisma, 'Entity', {
72
- _id: { $in: ids },
73
- });
74
- const credentialMap = await this._fetchCredentialsBulk(
75
- docs.map((doc) => doc.credentialId)
76
- );
77
- return docs.map((doc) =>
78
- this._mapEntity(
79
- doc,
80
- credentialMap.get(fromObjectId(doc.credentialId)) || null
81
- )
82
- );
60
+ const docs = await findMany(this.prisma, 'Entity', { _id: { $in: ids } });
61
+ const credentialMap = await this._fetchCredentialsBulk(docs.map((doc) => doc.credentialId));
62
+ return docs.map((doc) => this._mapEntity(doc, credentialMap.get(fromObjectId(doc.credentialId)) || null));
83
63
  }
84
64
 
85
65
  async findEntitiesByUserIdAndModuleName(userId, moduleName) {
@@ -92,15 +72,8 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
92
72
  moduleName,
93
73
  };
94
74
  const docs = await findMany(this.prisma, 'Entity', filter);
95
- const credentialMap = await this._fetchCredentialsBulk(
96
- docs.map((doc) => doc.credentialId)
97
- );
98
- return docs.map((doc) =>
99
- this._mapEntity(
100
- doc,
101
- credentialMap.get(fromObjectId(doc.credentialId)) || null
102
- )
103
- );
75
+ const credentialMap = await this._fetchCredentialsBulk(docs.map((doc) => doc.credentialId));
76
+ return docs.map((doc) => this._mapEntity(doc, credentialMap.get(fromObjectId(doc.credentialId)) || null));
104
77
  }
105
78
 
106
79
  async unsetCredential(entityId) {
@@ -128,23 +101,16 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
128
101
  }
129
102
 
130
103
  async createEntity(entityData) {
131
- const isGlobal = entityData.isGlobal || false;
132
-
133
104
  const document = {
134
- userId: isGlobal ? null : toObjectId(entityData.user || entityData.userId),
135
- credentialId:
136
- toObjectId(entityData.credential || entityData.credentialId) ||
137
- null,
105
+ userId: toObjectId(entityData.user || entityData.userId),
106
+ credentialId: toObjectId(entityData.credential || entityData.credentialId) || null,
138
107
  name: entityData.name ?? null,
139
108
  moduleName: entityData.moduleName ?? null,
140
109
  externalId: entityData.externalId ?? null,
141
110
  accountId: entityData.accountId ?? null,
142
- isGlobal,
143
111
  };
144
112
  const insertedId = await insertOne(this.prisma, 'Entity', document);
145
- const created = await findOne(this.prisma, 'Entity', {
146
- _id: insertedId,
147
- });
113
+ const created = await findOne(this.prisma, 'Entity', { _id: insertedId });
148
114
  const credential = await this._fetchCredential(created?.credentialId);
149
115
  return this._mapEntity(created, credential);
150
116
  }
@@ -154,27 +120,17 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
154
120
  if (!objectId) return null;
155
121
  const updatePayload = {};
156
122
  if (updates.user !== undefined || updates.userId !== undefined) {
157
- const userVal =
158
- updates.user !== undefined ? updates.user : updates.userId;
123
+ const userVal = updates.user !== undefined ? updates.user : updates.userId;
159
124
  updatePayload.userId = toObjectId(userVal) || null;
160
125
  }
161
- if (
162
- updates.credential !== undefined ||
163
- updates.credentialId !== undefined
164
- ) {
165
- const credVal =
166
- updates.credential !== undefined
167
- ? updates.credential
168
- : updates.credentialId;
126
+ if (updates.credential !== undefined || updates.credentialId !== undefined) {
127
+ const credVal = updates.credential !== undefined ? updates.credential : updates.credentialId;
169
128
  updatePayload.credentialId = toObjectId(credVal) || null;
170
129
  }
171
130
  if (updates.name !== undefined) updatePayload.name = updates.name;
172
- if (updates.moduleName !== undefined)
173
- updatePayload.moduleName = updates.moduleName;
174
- if (updates.externalId !== undefined)
175
- updatePayload.externalId = updates.externalId;
176
- if (updates.accountId !== undefined)
177
- updatePayload.accountId = updates.accountId;
131
+ if (updates.moduleName !== undefined) updatePayload.moduleName = updates.moduleName;
132
+ if (updates.externalId !== undefined) updatePayload.externalId = updates.externalId;
133
+ if (updates.accountId !== undefined) updatePayload.accountId = updates.accountId;
178
134
  const result = await updateOne(
179
135
  this.prisma,
180
136
  'Entity',
@@ -191,9 +147,7 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
191
147
  async deleteEntity(entityId) {
192
148
  const objectId = toObjectId(entityId);
193
149
  if (!objectId) return false;
194
- const result = await deleteOne(this.prisma, 'Entity', {
195
- _id: objectId,
196
- });
150
+ const result = await deleteOne(this.prisma, 'Entity', { _id: objectId });
197
151
  const deleted = result?.n ?? 0;
198
152
  return deleted > 0;
199
153
  }
@@ -209,17 +163,13 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
209
163
 
210
164
  // Use raw findOne to bypass Prisma encryption extension
211
165
  const rawCredential = await findOne(this.prisma, 'Credential', {
212
- _id: objectId,
166
+ _id: objectId
213
167
  });
214
168
 
215
169
  if (!rawCredential) return null;
216
170
 
217
171
  // Decrypt sensitive fields using service
218
- const decryptedCredential =
219
- await this.encryptionService.decryptFields(
220
- 'Credential',
221
- rawCredential
222
- );
172
+ const decryptedCredential = await this.encryptionService.decryptFields('Credential', rawCredential);
223
173
 
224
174
  // Return in same format
225
175
  const credential = {
@@ -229,15 +179,12 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
229
179
  authIsValid: decryptedCredential.authIsValid ?? null,
230
180
  createdAt: decryptedCredential.createdAt,
231
181
  updatedAt: decryptedCredential.updatedAt,
232
- data: decryptedCredential.data,
182
+ data: decryptedCredential.data
233
183
  };
234
184
 
235
185
  return this._convertCredentialIds(credential);
236
186
  } catch (error) {
237
- console.error(
238
- `Failed to fetch/decrypt credential ${id}:`,
239
- error.message
240
- );
187
+ console.error(`Failed to fetch/decrypt credential ${id}:`, error.message);
241
188
  // Return null instead of throwing to allow graceful degradation
242
189
  // This repository is read-only (doesn't create/update credentials)
243
190
  // Entities can still be loaded even if their credential is corrupted/unreadable
@@ -255,55 +202,45 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
255
202
 
256
203
  try {
257
204
  // Convert string IDs to ObjectIds for bulk query
258
- const objectIds = ids.map((id) => toObjectId(id)).filter(Boolean);
205
+ const objectIds = ids.map(id => toObjectId(id)).filter(Boolean);
259
206
  if (objectIds.length === 0) return new Map();
260
207
 
261
208
  // Use raw findMany to bypass Prisma encryption extension
262
209
  const rawCredentials = await findMany(this.prisma, 'Credential', {
263
- _id: { $in: objectIds },
210
+ _id: { $in: objectIds }
264
211
  });
265
212
 
266
213
  // Decrypt all credentials in parallel
267
- const decryptionPromises = rawCredentials.map(
268
- async (rawCredential) => {
269
- try {
270
- // Decrypt sensitive fields using service
271
- const decryptedCredential =
272
- await this.encryptionService.decryptFields(
273
- 'Credential',
274
- rawCredential
275
- );
214
+ const decryptionPromises = rawCredentials.map(async (rawCredential) => {
215
+ try {
216
+ // Decrypt sensitive fields using service
217
+ const decryptedCredential = await this.encryptionService.decryptFields('Credential', rawCredential);
276
218
 
277
- // Build credential object in same format as Prisma would return
278
- const credential = {
279
- id: fromObjectId(decryptedCredential._id),
280
- userId: fromObjectId(decryptedCredential.userId),
281
- externalId: decryptedCredential.externalId ?? null,
282
- authIsValid:
283
- decryptedCredential.authIsValid ?? null,
284
- createdAt: decryptedCredential.createdAt,
285
- updatedAt: decryptedCredential.updatedAt,
286
- data: decryptedCredential.data,
287
- };
219
+ // Build credential object in same format as Prisma would return
220
+ const credential = {
221
+ id: fromObjectId(decryptedCredential._id),
222
+ userId: fromObjectId(decryptedCredential.userId),
223
+ externalId: decryptedCredential.externalId ?? null,
224
+ authIsValid: decryptedCredential.authIsValid ?? null,
225
+ createdAt: decryptedCredential.createdAt,
226
+ updatedAt: decryptedCredential.updatedAt,
227
+ data: decryptedCredential.data
228
+ };
288
229
 
289
- return this._convertCredentialIds(credential);
290
- } catch (error) {
291
- const credId = fromObjectId(rawCredential._id);
292
- console.error(
293
- `Failed to decrypt credential ${credId}:`,
294
- error.message
295
- );
296
- return null;
297
- }
230
+ return this._convertCredentialIds(credential);
231
+ } catch (error) {
232
+ const credId = fromObjectId(rawCredential._id);
233
+ console.error(`Failed to decrypt credential ${credId}:`, error.message);
234
+ return null;
298
235
  }
299
- );
236
+ });
300
237
 
301
238
  // Wait for all decryptions to complete
302
239
  const decryptedCredentials = await Promise.all(decryptionPromises);
303
240
 
304
241
  // Build Map from results, filtering out nulls
305
242
  const map = new Map();
306
- decryptedCredentials.forEach((credential) => {
243
+ decryptedCredentials.forEach(credential => {
307
244
  if (credential) {
308
245
  map.set(credential.id, credential);
309
246
  }
@@ -344,15 +281,12 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
344
281
  if (userObj) query.userId = userObj;
345
282
  }
346
283
  if (filter.credential || filter.credentialId) {
347
- const credObj = toObjectId(
348
- filter.credential || filter.credentialId
349
- );
284
+ const credObj = toObjectId(filter.credential || filter.credentialId);
350
285
  if (credObj) query.credentialId = credObj;
351
286
  }
352
287
  if (filter.name) query.name = filter.name;
353
288
  if (filter.moduleName) query.moduleName = filter.moduleName;
354
289
  if (filter.externalId) query.externalId = filter.externalId;
355
- if (filter.isGlobal !== undefined) query.isGlobal = filter.isGlobal;
356
290
  return query;
357
291
  }
358
292
 
@@ -365,9 +299,9 @@ class ModuleRepositoryDocumentDB extends ModuleRepositoryInterface {
365
299
  name: doc?.name ?? null,
366
300
  externalId: doc?.externalId ?? null,
367
301
  moduleName: doc?.moduleName ?? null,
368
- isGlobal: doc?.isGlobal ?? null,
369
302
  };
370
303
  }
371
304
  }
372
305
 
373
306
  module.exports = { ModuleRepositoryDocumentDB };
307
+
@@ -91,19 +91,6 @@ class ModuleRepositoryInterface {
91
91
  throw new Error('Method findEntity must be implemented by subclass');
92
92
  }
93
93
 
94
- /**
95
- * Find entities matching filter criteria
96
- *
97
- * @param {Object} filter - Filter criteria
98
- * @returns {Promise<Array>} Array of entity objects
99
- * @abstract
100
- */
101
- async findEntitiesBy(filter) {
102
- throw new Error(
103
- 'Method findEntitiesBy must be implemented by subclass'
104
- );
105
- }
106
-
107
94
  /**
108
95
  * Create a new entity
109
96
  *
@@ -58,9 +58,7 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
58
58
  return new Map();
59
59
  }
60
60
 
61
- const validIds = credentialIds.filter(
62
- (id) => id !== null && id !== undefined
63
- );
61
+ const validIds = credentialIds.filter(id => id !== null && id !== undefined);
64
62
 
65
63
  if (validIds.length === 0) {
66
64
  return new Map();
@@ -120,9 +118,7 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
120
118
  where: { userId },
121
119
  });
122
120
 
123
- const credentialIds = entities
124
- .map((e) => e.credentialId)
125
- .filter(Boolean);
121
+ const credentialIds = entities.map(e => e.credentialId).filter(Boolean);
126
122
  const credentialMap = await this._fetchCredentialsBulk(credentialIds);
127
123
 
128
124
  return entities.map((e) => ({
@@ -148,9 +144,7 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
148
144
  where: { id: { in: entitiesIds } },
149
145
  });
150
146
 
151
- const credentialIds = entities
152
- .map((e) => e.credentialId)
153
- .filter(Boolean);
147
+ const credentialIds = entities.map(e => e.credentialId).filter(Boolean);
154
148
  const credentialMap = await this._fetchCredentialsBulk(credentialIds);
155
149
 
156
150
  return entities.map((e) => ({
@@ -180,9 +174,7 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
180
174
  },
181
175
  });
182
176
 
183
- const credentialIds = entities
184
- .map((e) => e.credentialId)
185
- .filter(Boolean);
177
+ const credentialIds = entities.map(e => e.credentialId).filter(Boolean);
186
178
  const credentialMap = await this._fetchCredentialsBulk(credentialIds);
187
179
 
188
180
  return entities.map((e) => ({
@@ -239,35 +231,9 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
239
231
  name: entity.name,
240
232
  externalId: entity.externalId,
241
233
  moduleName: entity.moduleName,
242
- isGlobal: entity.isGlobal,
243
234
  };
244
235
  }
245
236
 
246
- /**
247
- * Find entities matching filter criteria
248
- * @param {Object} filter - Filter criteria (e.g., { isGlobal: true, moduleName: 'api-name' })
249
- * @returns {Promise<Array>} Array of entity objects with string IDs
250
- */
251
- async findEntitiesBy(filter) {
252
- const where = this._convertFilterToWhere(filter);
253
- const entities = await this.prisma.entity.findMany({
254
- where,
255
- include: { credential: true },
256
- });
257
-
258
- return entities.map((e) => ({
259
- id: e.id,
260
- accountId: e.accountId,
261
- credential: e.credential,
262
- userId: e.userId,
263
- name: e.name,
264
- externalId: e.externalId,
265
- type: e.subType,
266
- moduleName: e.moduleName,
267
- isGlobal: e.isGlobal,
268
- }));
269
- }
270
-
271
237
  /**
272
238
  * Create a new entity
273
239
  * Replaces: Entity.create(entityData)
@@ -276,16 +242,13 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
276
242
  * @returns {Promise<Object>} Created entity object with string IDs
277
243
  */
278
244
  async createEntity(entityData) {
279
- const isGlobal = entityData.isGlobal || false;
280
-
281
245
  const data = {
282
- userId: isGlobal ? null : entityData.user || entityData.userId,
246
+ userId: entityData.user || entityData.userId,
283
247
  credentialId: entityData.credential || entityData.credentialId,
284
248
  name: entityData.name,
285
249
  moduleName: entityData.moduleName,
286
250
  externalId: entityData.externalId,
287
251
  accountId: entityData.accountId,
288
- isGlobal,
289
252
  };
290
253
 
291
254
  const entity = await this.prisma.entity.create({
@@ -302,7 +265,6 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
302
265
  name: entity.name,
303
266
  externalId: entity.externalId,
304
267
  moduleName: entity.moduleName,
305
- isGlobal: entity.isGlobal,
306
268
  };
307
269
  }
308
270
 
@@ -406,9 +368,7 @@ class ModuleRepositoryMongo extends ModuleRepositoryInterface {
406
368
  if (filter.credentialId) where.credentialId = filter.credentialId;
407
369
  if (filter.name) where.name = filter.name;
408
370
  if (filter.moduleName) where.moduleName = filter.moduleName;
409
- if (filter.externalId)
410
- where.externalId = this._toString(filter.externalId);
411
- if (filter.isGlobal !== undefined) where.isGlobal = filter.isGlobal;
371
+ if (filter.externalId) where.externalId = this._toString(filter.externalId);
412
372
 
413
373
  return where;
414
374
  }
@@ -87,9 +87,7 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
87
87
  return new Map();
88
88
  }
89
89
 
90
- const validIds = credentialIds.filter(
91
- (id) => id !== null && id !== undefined
92
- );
90
+ const validIds = credentialIds.filter(id => id !== null && id !== undefined);
93
91
 
94
92
  if (validIds.length === 0) {
95
93
  return new Map();
@@ -156,9 +154,7 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
156
154
  where: { userId: intUserId },
157
155
  });
158
156
 
159
- const credentialIds = entities
160
- .map((e) => e.credentialId)
161
- .filter(Boolean);
157
+ const credentialIds = entities.map(e => e.credentialId).filter(Boolean);
162
158
  const credentialMap = await this._fetchCredentialsBulk(credentialIds);
163
159
 
164
160
  return entities.map((e) => ({
@@ -186,9 +182,7 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
186
182
  where: { id: { in: intIds } },
187
183
  });
188
184
 
189
- const credentialIds = entities
190
- .map((e) => e.credentialId)
191
- .filter(Boolean);
185
+ const credentialIds = entities.map(e => e.credentialId).filter(Boolean);
192
186
  const credentialMap = await this._fetchCredentialsBulk(credentialIds);
193
187
 
194
188
  return entities.map((e) => ({
@@ -220,9 +214,7 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
220
214
  },
221
215
  });
222
216
 
223
- const credentialIds = entities
224
- .map((e) => e.credentialId)
225
- .filter(Boolean);
217
+ const credentialIds = entities.map(e => e.credentialId).filter(Boolean);
226
218
  const credentialMap = await this._fetchCredentialsBulk(credentialIds);
227
219
 
228
220
  return entities.map((e) => ({
@@ -280,37 +272,9 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
280
272
  name: entity.name,
281
273
  externalId: entity.externalId,
282
274
  moduleName: entity.moduleName,
283
- isGlobal: entity.isGlobal,
284
275
  };
285
276
  }
286
277
 
287
- /**
288
- * Find entities matching filter criteria
289
- * Replaces: Entity.find(filter).populate('credential')
290
- *
291
- * @param {Object} filter - Filter criteria (e.g., { isGlobal: true, type: 'someType', status: 'connected' })
292
- * @returns {Promise<Array>} Array of entity objects with string IDs
293
- */
294
- async findEntitiesBy(filter) {
295
- const where = this._convertFilterToWhere(filter);
296
- const entities = await this.prisma.entity.findMany({
297
- where,
298
- include: { credential: true },
299
- });
300
-
301
- return entities.map((e) => ({
302
- id: e.id.toString(),
303
- accountId: e.accountId,
304
- credential: this._convertCredentialIds(e.credential),
305
- userId: e.userId?.toString(),
306
- name: e.name,
307
- externalId: e.externalId,
308
- type: e.subType,
309
- moduleName: e.moduleName,
310
- isGlobal: e.isGlobal,
311
- }));
312
- }
313
-
314
278
  /**
315
279
  * Create a new entity
316
280
  * Replaces: Entity.create(entityData)
@@ -319,10 +283,8 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
319
283
  * @returns {Promise<Object>} Created entity object with string IDs
320
284
  */
321
285
  async createEntity(entityData) {
322
- const isGlobal = entityData.isGlobal || false;
323
-
324
286
  const data = {
325
- userId: isGlobal ? null : this._convertId(entityData.user || entityData.userId),
287
+ userId: this._convertId(entityData.user || entityData.userId),
326
288
  credentialId: this._convertId(
327
289
  entityData.credential || entityData.credentialId
328
290
  ),
@@ -330,7 +292,6 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
330
292
  moduleName: entityData.moduleName,
331
293
  externalId: entityData.externalId,
332
294
  accountId: entityData.accountId,
333
- isGlobal,
334
295
  };
335
296
 
336
297
  const entity = await this.prisma.entity.create({
@@ -347,7 +308,6 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
347
308
  name: entity.name,
348
309
  externalId: entity.externalId,
349
310
  moduleName: entity.moduleName,
350
- isGlobal: entity.isGlobal,
351
311
  };
352
312
  }
353
313
 
@@ -457,9 +417,7 @@ class ModuleRepositoryPostgres extends ModuleRepositoryInterface {
457
417
  where.credentialId = this._convertId(filter.credentialId);
458
418
  if (filter.name) where.name = filter.name;
459
419
  if (filter.moduleName) where.moduleName = filter.moduleName;
460
- if (filter.externalId)
461
- where.externalId = this._toString(filter.externalId);
462
- if (filter.isGlobal !== undefined) where.isGlobal = filter.isGlobal;
420
+ if (filter.externalId) where.externalId = this._toString(filter.externalId);
463
421
 
464
422
  return where;
465
423
  }
@@ -169,37 +169,9 @@ class ModuleRepository extends ModuleRepositoryInterface {
169
169
  name: entity.name,
170
170
  externalId: entity.externalId,
171
171
  moduleName: entity.moduleName,
172
- isGlobal: entity.isGlobal,
173
172
  };
174
173
  }
175
174
 
176
- /**
177
- * Find entities matching filter criteria
178
- * Replaces: Entity.find(filter).populate('credential')
179
- *
180
- * @param {Object} filter - Filter criteria
181
- * @returns {Promise<Array>} Array of entity objects
182
- */
183
- async findEntitiesBy(filter) {
184
- const where = this._convertFilterToWhere(filter);
185
- const entities = await this.prisma.entity.findMany({
186
- where,
187
- include: { credential: true },
188
- });
189
-
190
- return entities.map((e) => ({
191
- id: e.id,
192
- accountId: e.accountId,
193
- credential: e.credential,
194
- userId: e.userId,
195
- name: e.name,
196
- externalId: e.externalId,
197
- type: e.subType,
198
- moduleName: e.moduleName,
199
- isGlobal: e.isGlobal,
200
- }));
201
- }
202
-
203
175
  /**
204
176
  * Create a new entity
205
177
  * Replaces: Entity.create(entityData)
@@ -208,17 +180,14 @@ class ModuleRepository extends ModuleRepositoryInterface {
208
180
  * @returns {Promise<Object>} Created entity object
209
181
  */
210
182
  async createEntity(entityData) {
211
- const isGlobal = entityData.isGlobal || false;
212
-
213
183
  // Convert Mongoose-style fields to Prisma
214
184
  const data = {
215
- userId: isGlobal ? null : entityData.user || entityData.userId,
185
+ userId: entityData.user || entityData.userId,
216
186
  credentialId: entityData.credential || entityData.credentialId,
217
187
  name: entityData.name,
218
188
  moduleName: entityData.moduleName,
219
189
  externalId: entityData.externalId,
220
190
  accountId: entityData.accountId,
221
- isGlobal,
222
191
  };
223
192
 
224
193
  const entity = await this.prisma.entity.create({
@@ -234,7 +203,6 @@ class ModuleRepository extends ModuleRepositoryInterface {
234
203
  name: entity.name,
235
204
  externalId: entity.externalId,
236
205
  moduleName: entity.moduleName,
237
- isGlobal: entity.isGlobal,
238
206
  };
239
207
  }
240
208
 
@@ -340,7 +308,6 @@ class ModuleRepository extends ModuleRepositoryInterface {
340
308
  if (filter.name) where.name = filter.name;
341
309
  if (filter.moduleName) where.moduleName = filter.moduleName;
342
310
  if (filter.externalId) where.externalId = filter.externalId;
343
- if (filter.isGlobal !== undefined) where.isGlobal = filter.isGlobal;
344
311
 
345
312
  return where;
346
313
  }
@@ -2,7 +2,9 @@ const { Requester } = require('./requester');
2
2
  const { get } = require('../../assertions');
3
3
  const { ModuleConstants } = require('../ModuleConstants');
4
4
 
5
+
5
6
  class ApiKeyRequester extends Requester {
7
+
6
8
  static requesterType = ModuleConstants.authType.apiKey;
7
9
 
8
10
  constructor(params) {
@@ -3,6 +3,7 @@ const { get } = require('../../assertions');
3
3
  const { ModuleConstants } = require('../ModuleConstants');
4
4
 
5
5
  class BasicAuthRequester extends Requester {
6
+
6
7
  static requesterType = ModuleConstants.authType.basic;
7
8
 
8
9
  constructor(params) {
@@ -3,6 +3,7 @@ const { get } = require('../../assertions');
3
3
  const { ModuleConstants } = require('../ModuleConstants');
4
4
 
5
5
  class OAuth2Requester extends Requester {
6
+
6
7
  static requesterType = ModuleConstants.authType.oauth2;
7
8
 
8
9
  constructor(params) {
@@ -43,9 +44,7 @@ class OAuth2Requester extends Requester {
43
44
  );
44
45
 
45
46
  this.accessTokenExpire = new Date(Date.now() + accessExpiresIn * 1000);
46
- this.refreshTokenExpire = new Date(
47
- Date.now() + refreshExpiresIn * 1000
48
- );
47
+ this.refreshTokenExpire = new Date(Date.now() + refreshExpiresIn * 1000);
49
48
 
50
49
  await this.notify(this.DLGT_TOKEN_UPDATE);
51
50
  }