@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
@@ -0,0 +1,251 @@
1
+ const { prisma } = require('../../database/prisma');
2
+ const {
3
+ AdminProcessRepositoryInterface,
4
+ } = require('./admin-process-repository-interface');
5
+
6
+ /**
7
+ * PostgreSQL Admin Process Repository Adapter
8
+ * Handles admin process persistence using Prisma with PostgreSQL
9
+ *
10
+ * PostgreSQL-specific characteristics:
11
+ * - Uses Int IDs with autoincrement
12
+ * - Requires ID conversion: String (app layer) ↔ Int (database)
13
+ * - All returned IDs are converted to strings for application layer consistency
14
+ * - context and results are Json objects
15
+ */
16
+ class AdminProcessRepositoryPostgres extends AdminProcessRepositoryInterface {
17
+ constructor() {
18
+ super();
19
+ this.prisma = prisma;
20
+ }
21
+
22
+ /**
23
+ * Convert string ID to integer for PostgreSQL queries
24
+ * @private
25
+ * @param {string|number|null|undefined} id - ID to convert
26
+ * @returns {number|null|undefined} Integer ID or null/undefined
27
+ * @throws {Error} If ID cannot be converted to integer
28
+ */
29
+ _convertId(id) {
30
+ if (id === null || id === undefined) return id;
31
+ const parsed = Number.parseInt(id, 10);
32
+ if (Number.isNaN(parsed)) {
33
+ throw new Error(`Invalid ID: ${id} cannot be converted to integer`);
34
+ }
35
+ return parsed;
36
+ }
37
+
38
+ /**
39
+ * Convert process object IDs to strings
40
+ * @private
41
+ * @param {Object|null} process - Process object from database
42
+ * @returns {Object|null} Process with string IDs
43
+ */
44
+ _convertProcessIds(process) {
45
+ if (!process) return process;
46
+ return {
47
+ ...process,
48
+ id: process.id?.toString(),
49
+ parentProcessId: process.parentProcessId?.toString(),
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Create a new admin process record
55
+ *
56
+ * @param {Object} params - Process creation parameters
57
+ * @param {string} params.name - Name of the process
58
+ * @param {string} params.type - Type of process (e.g., 'ADMIN_SCRIPT', 'DB_MIGRATION')
59
+ * @param {Object} [params.context] - Context data
60
+ * @returns {Promise<Object>} The created process record with string ID
61
+ */
62
+ async createProcess({ name, type, context = {} }) {
63
+ const data = {
64
+ name,
65
+ type,
66
+ context,
67
+ results: { logs: [] },
68
+ };
69
+
70
+ const process = await this.prisma.adminProcess.create({
71
+ data,
72
+ });
73
+
74
+ return this._convertProcessIds(process);
75
+ }
76
+
77
+ /**
78
+ * Find a process by its ID
79
+ *
80
+ * @param {string|number} id - The process ID
81
+ * @returns {Promise<Object|null>} The process record with string ID or null if not found
82
+ */
83
+ async findProcessById(id) {
84
+ const intId = this._convertId(id);
85
+ const process = await this.prisma.adminProcess.findUnique({
86
+ where: { id: intId },
87
+ });
88
+
89
+ return this._convertProcessIds(process);
90
+ }
91
+
92
+ /**
93
+ * Find all processes with a specific name
94
+ *
95
+ * @param {string} name - The process name to filter by
96
+ * @param {Object} [options] - Query options
97
+ * @param {number} [options.limit] - Maximum number of results
98
+ * @param {number} [options.offset] - Number of results to skip
99
+ * @param {string} [options.sortBy] - Field to sort by
100
+ * @param {string} [options.sortOrder] - Sort order ('asc' or 'desc')
101
+ * @returns {Promise<Array>} Array of process records with string IDs
102
+ */
103
+ async findProcessesByName(name, options = {}) {
104
+ const { limit, offset, sortBy = 'createdAt', sortOrder = 'desc' } = options;
105
+
106
+ const processes = await this.prisma.adminProcess.findMany({
107
+ where: { name },
108
+ orderBy: { [sortBy]: sortOrder },
109
+ take: limit,
110
+ skip: offset,
111
+ });
112
+
113
+ return processes.map((process) => this._convertProcessIds(process));
114
+ }
115
+
116
+ /**
117
+ * Find all processes with a specific state
118
+ *
119
+ * @param {string} state - State to filter by
120
+ * @param {Object} [options] - Query options
121
+ * @param {number} [options.limit] - Maximum number of results
122
+ * @param {number} [options.offset] - Number of results to skip
123
+ * @param {string} [options.sortBy] - Field to sort by
124
+ * @param {string} [options.sortOrder] - Sort order ('asc' or 'desc')
125
+ * @returns {Promise<Array>} Array of process records with string IDs
126
+ */
127
+ async findProcessesByState(state, options = {}) {
128
+ const { limit, offset, sortBy = 'createdAt', sortOrder = 'desc' } = options;
129
+
130
+ const processes = await this.prisma.adminProcess.findMany({
131
+ where: { state },
132
+ orderBy: { [sortBy]: sortOrder },
133
+ take: limit,
134
+ skip: offset,
135
+ });
136
+
137
+ return processes.map((process) => this._convertProcessIds(process));
138
+ }
139
+
140
+ /**
141
+ * Update the state of a process
142
+ *
143
+ * @param {string|number} id - The process ID
144
+ * @param {string} state - New state value
145
+ * @returns {Promise<Object>} Updated process record with string ID
146
+ */
147
+ async updateProcessState(id, state) {
148
+ const intId = this._convertId(id);
149
+ const process = await this.prisma.adminProcess.update({
150
+ where: { id: intId },
151
+ data: { state },
152
+ });
153
+
154
+ return this._convertProcessIds(process);
155
+ }
156
+
157
+ /**
158
+ * Update the results of a process
159
+ * Merges new results with existing results
160
+ *
161
+ * @param {string|number} id - The process ID
162
+ * @param {Object} results - Results data to merge
163
+ * @returns {Promise<Object>} Updated process record with string ID
164
+ */
165
+ async updateProcessResults(id, results) {
166
+ const intId = this._convertId(id);
167
+
168
+ // Get current process to merge results
169
+ const currentProcess = await this.prisma.adminProcess.findUnique({
170
+ where: { id: intId },
171
+ });
172
+
173
+ if (!currentProcess) {
174
+ throw new Error(`AdminProcess ${id} not found`);
175
+ }
176
+
177
+ // Merge new results with existing results
178
+ const mergedResults = {
179
+ ...(currentProcess.results || {}),
180
+ ...results,
181
+ };
182
+
183
+ const process = await this.prisma.adminProcess.update({
184
+ where: { id: intId },
185
+ data: { results: mergedResults },
186
+ });
187
+
188
+ return this._convertProcessIds(process);
189
+ }
190
+
191
+ /**
192
+ * Append a log entry to a process's log array in results
193
+ *
194
+ * @param {string|number} id - The process ID
195
+ * @param {Object} logEntry - Log entry to append
196
+ * @param {string} logEntry.level - Log level ('debug', 'info', 'warn', 'error')
197
+ * @param {string} logEntry.message - Log message
198
+ * @param {Object} [logEntry.data] - Additional log data
199
+ * @param {string} logEntry.timestamp - ISO timestamp
200
+ * @returns {Promise<Object>} Updated process record with string ID
201
+ */
202
+ async appendProcessLog(id, logEntry) {
203
+ const intId = this._convertId(id);
204
+
205
+ // Get current process
206
+ const process = await this.prisma.adminProcess.findUnique({
207
+ where: { id: intId },
208
+ });
209
+
210
+ if (!process) {
211
+ throw new Error(`AdminProcess ${id} not found`);
212
+ }
213
+
214
+ // Get current results and logs
215
+ const results = process.results || {};
216
+ const logs = Array.isArray(results.logs) ? [...results.logs] : [];
217
+ logs.push(logEntry);
218
+
219
+ // Update with new logs array in results
220
+ const updated = await this.prisma.adminProcess.update({
221
+ where: { id: intId },
222
+ data: { results: { ...results, logs } },
223
+ });
224
+
225
+ return this._convertProcessIds(updated);
226
+ }
227
+
228
+ /**
229
+ * Delete all processes older than a specific date
230
+ * Used for cleanup and retention policies
231
+ *
232
+ * @param {Date} date - Delete processes older than this date
233
+ * @returns {Promise<Object>} Deletion result with count
234
+ */
235
+ async deleteProcessesOlderThan(date) {
236
+ const result = await this.prisma.adminProcess.deleteMany({
237
+ where: {
238
+ createdAt: {
239
+ lt: date,
240
+ },
241
+ },
242
+ });
243
+
244
+ return {
245
+ acknowledged: true,
246
+ deletedCount: result.count,
247
+ };
248
+ }
249
+ }
250
+
251
+ module.exports = { AdminProcessRepositoryPostgres };
@@ -1,9 +1,5 @@
1
- const {
2
- ScriptScheduleRepositoryMongo,
3
- } = require('./script-schedule-repository-mongo');
4
- const {
5
- ScriptScheduleRepositoryPostgres,
6
- } = require('./script-schedule-repository-postgres');
1
+ const { ScriptScheduleRepositoryMongo } = require('./script-schedule-repository-mongo');
2
+ const { ScriptScheduleRepositoryPostgres } = require('./script-schedule-repository-postgres');
7
3
  const {
8
4
  ScriptScheduleRepositoryDocumentDB,
9
5
  } = require('./script-schedule-repository-documentdb');
@@ -23,9 +23,7 @@ class ScriptScheduleRepositoryInterface {
23
23
  * @abstract
24
24
  */
25
25
  async findScheduleByScriptName(scriptName) {
26
- throw new Error(
27
- 'Method findScheduleByScriptName must be implemented by subclass'
28
- );
26
+ throw new Error('Method findScheduleByScriptName must be implemented by subclass');
29
27
  }
30
28
 
31
29
  /**
@@ -36,22 +34,13 @@ class ScriptScheduleRepositoryInterface {
36
34
  * @param {boolean} params.enabled - Whether schedule is enabled
37
35
  * @param {string} params.cronExpression - Cron expression
38
36
  * @param {string} [params.timezone] - Timezone (default 'UTC')
39
- * @param {string} [params.awsScheduleArn] - AWS EventBridge Scheduler ARN
40
- * @param {string} [params.awsScheduleName] - AWS EventBridge Scheduler name
37
+ * @param {string} [params.externalScheduleId] - External scheduler ID (e.g., AWS ARN)
38
+ * @param {string} [params.externalScheduleName] - External scheduler name
41
39
  * @returns {Promise<Object>} Created or updated schedule record
42
40
  * @abstract
43
41
  */
44
- async upsertSchedule({
45
- scriptName,
46
- enabled,
47
- cronExpression,
48
- timezone,
49
- awsScheduleArn,
50
- awsScheduleName,
51
- }) {
52
- throw new Error(
53
- 'Method upsertSchedule must be implemented by subclass'
54
- );
42
+ async upsertSchedule({ scriptName, enabled, cronExpression, timezone, externalScheduleId, externalScheduleName }) {
43
+ throw new Error('Method upsertSchedule must be implemented by subclass');
55
44
  }
56
45
 
57
46
  /**
@@ -62,28 +51,21 @@ class ScriptScheduleRepositoryInterface {
62
51
  * @abstract
63
52
  */
64
53
  async deleteSchedule(scriptName) {
65
- throw new Error(
66
- 'Method deleteSchedule must be implemented by subclass'
67
- );
54
+ throw new Error('Method deleteSchedule must be implemented by subclass');
68
55
  }
69
56
 
70
57
  /**
71
- * Update AWS EventBridge Scheduler information
58
+ * Update external scheduler information
72
59
  *
73
60
  * @param {string} scriptName - The script name
74
- * @param {Object} awsInfo - AWS schedule information
75
- * @param {string} [awsInfo.awsScheduleArn] - AWS EventBridge Scheduler ARN
76
- * @param {string} [awsInfo.awsScheduleName] - AWS EventBridge Scheduler name
61
+ * @param {Object} externalInfo - External schedule information
62
+ * @param {string} [externalInfo.externalScheduleId] - External scheduler ID (e.g., AWS ARN)
63
+ * @param {string} [externalInfo.externalScheduleName] - External scheduler name
77
64
  * @returns {Promise<Object>} Updated schedule record
78
65
  * @abstract
79
66
  */
80
- async updateScheduleAwsInfo(
81
- scriptName,
82
- { awsScheduleArn, awsScheduleName }
83
- ) {
84
- throw new Error(
85
- 'Method updateScheduleAwsInfo must be implemented by subclass'
86
- );
67
+ async updateScheduleExternalInfo(scriptName, { externalScheduleId, externalScheduleName }) {
68
+ throw new Error('Method updateScheduleExternalInfo must be implemented by subclass');
87
69
  }
88
70
 
89
71
  /**
@@ -95,9 +77,7 @@ class ScriptScheduleRepositoryInterface {
95
77
  * @abstract
96
78
  */
97
79
  async updateScheduleLastTriggered(scriptName, timestamp) {
98
- throw new Error(
99
- 'Method updateScheduleLastTriggered must be implemented by subclass'
100
- );
80
+ throw new Error('Method updateScheduleLastTriggered must be implemented by subclass');
101
81
  }
102
82
 
103
83
  /**
@@ -109,9 +89,7 @@ class ScriptScheduleRepositoryInterface {
109
89
  * @abstract
110
90
  */
111
91
  async updateScheduleNextTrigger(scriptName, timestamp) {
112
- throw new Error(
113
- 'Method updateScheduleNextTrigger must be implemented by subclass'
114
- );
92
+ throw new Error('Method updateScheduleNextTrigger must be implemented by subclass');
115
93
  }
116
94
 
117
95
  /**
@@ -40,28 +40,20 @@ class ScriptScheduleRepositoryMongo extends ScriptScheduleRepositoryInterface {
40
40
  * @param {boolean} params.enabled - Whether schedule is enabled
41
41
  * @param {string} params.cronExpression - Cron expression
42
42
  * @param {string} [params.timezone] - Timezone (default 'UTC')
43
- * @param {string} [params.awsScheduleArn] - AWS EventBridge Scheduler ARN
44
- * @param {string} [params.awsScheduleName] - AWS EventBridge Scheduler name
43
+ * @param {string} [params.externalScheduleId] - External scheduler ID (e.g., AWS ARN)
44
+ * @param {string} [params.externalScheduleName] - External scheduler name
45
45
  * @returns {Promise<Object>} Created or updated schedule record
46
46
  */
47
- async upsertSchedule({
48
- scriptName,
49
- enabled,
50
- cronExpression,
51
- timezone,
52
- awsScheduleArn,
53
- awsScheduleName,
54
- }) {
47
+ async upsertSchedule({ scriptName, enabled, cronExpression, timezone, externalScheduleId, externalScheduleName }) {
55
48
  const data = {
56
49
  enabled,
57
50
  cronExpression,
58
51
  timezone: timezone || 'UTC',
59
52
  };
60
53
 
61
- // Only set AWS fields if provided
62
- if (awsScheduleArn !== undefined) data.awsScheduleArn = awsScheduleArn;
63
- if (awsScheduleName !== undefined)
64
- data.awsScheduleName = awsScheduleName;
54
+ // Only set external scheduler fields if provided
55
+ if (externalScheduleId !== undefined) data.externalScheduleId = externalScheduleId;
56
+ if (externalScheduleName !== undefined) data.externalScheduleName = externalScheduleName;
65
57
 
66
58
  const schedule = await this.prisma.scriptSchedule.upsert({
67
59
  where: { scriptName },
@@ -105,22 +97,18 @@ class ScriptScheduleRepositoryMongo extends ScriptScheduleRepositoryInterface {
105
97
  }
106
98
 
107
99
  /**
108
- * Update AWS EventBridge Scheduler information
100
+ * Update external scheduler information
109
101
  *
110
102
  * @param {string} scriptName - The script name
111
- * @param {Object} awsInfo - AWS schedule information
112
- * @param {string} [awsInfo.awsScheduleArn] - AWS EventBridge Scheduler ARN
113
- * @param {string} [awsInfo.awsScheduleName] - AWS EventBridge Scheduler name
103
+ * @param {Object} externalInfo - External schedule information
104
+ * @param {string} [externalInfo.externalScheduleId] - External scheduler ID (e.g., AWS ARN)
105
+ * @param {string} [externalInfo.externalScheduleName] - External scheduler name
114
106
  * @returns {Promise<Object>} Updated schedule record
115
107
  */
116
- async updateScheduleAwsInfo(
117
- scriptName,
118
- { awsScheduleArn, awsScheduleName }
119
- ) {
108
+ async updateScheduleExternalInfo(scriptName, { externalScheduleId, externalScheduleName }) {
120
109
  const data = {};
121
- if (awsScheduleArn !== undefined) data.awsScheduleArn = awsScheduleArn;
122
- if (awsScheduleName !== undefined)
123
- data.awsScheduleName = awsScheduleName;
110
+ if (externalScheduleId !== undefined) data.externalScheduleId = externalScheduleId;
111
+ if (externalScheduleName !== undefined) data.externalScheduleName = externalScheduleName;
124
112
 
125
113
  const schedule = await this.prisma.scriptSchedule.update({
126
114
  where: { scriptName },
@@ -71,28 +71,20 @@ class ScriptScheduleRepositoryPostgres extends ScriptScheduleRepositoryInterface
71
71
  * @param {boolean} params.enabled - Whether schedule is enabled
72
72
  * @param {string} params.cronExpression - Cron expression
73
73
  * @param {string} [params.timezone] - Timezone (default 'UTC')
74
- * @param {string} [params.awsScheduleArn] - AWS EventBridge Scheduler ARN
75
- * @param {string} [params.awsScheduleName] - AWS EventBridge Scheduler name
74
+ * @param {string} [params.externalScheduleId] - External scheduler ID (e.g., AWS ARN)
75
+ * @param {string} [params.externalScheduleName] - External scheduler name
76
76
  * @returns {Promise<Object>} Created or updated schedule record with string ID
77
77
  */
78
- async upsertSchedule({
79
- scriptName,
80
- enabled,
81
- cronExpression,
82
- timezone,
83
- awsScheduleArn,
84
- awsScheduleName,
85
- }) {
78
+ async upsertSchedule({ scriptName, enabled, cronExpression, timezone, externalScheduleId, externalScheduleName }) {
86
79
  const data = {
87
80
  enabled,
88
81
  cronExpression,
89
82
  timezone: timezone || 'UTC',
90
83
  };
91
84
 
92
- // Only set AWS fields if provided
93
- if (awsScheduleArn !== undefined) data.awsScheduleArn = awsScheduleArn;
94
- if (awsScheduleName !== undefined)
95
- data.awsScheduleName = awsScheduleName;
85
+ // Only set external scheduler fields if provided
86
+ if (externalScheduleId !== undefined) data.externalScheduleId = externalScheduleId;
87
+ if (externalScheduleName !== undefined) data.externalScheduleName = externalScheduleName;
96
88
 
97
89
  const schedule = await this.prisma.scriptSchedule.upsert({
98
90
  where: { scriptName },
@@ -136,22 +128,18 @@ class ScriptScheduleRepositoryPostgres extends ScriptScheduleRepositoryInterface
136
128
  }
137
129
 
138
130
  /**
139
- * Update AWS EventBridge Scheduler information
131
+ * Update external scheduler information
140
132
  *
141
133
  * @param {string} scriptName - The script name
142
- * @param {Object} awsInfo - AWS schedule information
143
- * @param {string} [awsInfo.awsScheduleArn] - AWS EventBridge Scheduler ARN
144
- * @param {string} [awsInfo.awsScheduleName] - AWS EventBridge Scheduler name
134
+ * @param {Object} externalInfo - External schedule information
135
+ * @param {string} [externalInfo.externalScheduleId] - External scheduler ID (e.g., AWS ARN)
136
+ * @param {string} [externalInfo.externalScheduleName] - External scheduler name
145
137
  * @returns {Promise<Object>} Updated schedule record with string ID
146
138
  */
147
- async updateScheduleAwsInfo(
148
- scriptName,
149
- { awsScheduleArn, awsScheduleName }
150
- ) {
139
+ async updateScheduleExternalInfo(scriptName, { externalScheduleId, externalScheduleName }) {
151
140
  const data = {};
152
- if (awsScheduleArn !== undefined) data.awsScheduleArn = awsScheduleArn;
153
- if (awsScheduleName !== undefined)
154
- data.awsScheduleName = awsScheduleName;
141
+ if (externalScheduleId !== undefined) data.externalScheduleId = externalScheduleId;
142
+ if (externalScheduleName !== undefined) data.externalScheduleName = externalScheduleName;
155
143
 
156
144
  const schedule = await this.prisma.scriptSchedule.update({
157
145
  where: { scriptName },