@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.
- package/CHANGELOG.md +67 -66
- package/CLAUDE.md +124 -148
- package/README.md +130 -165
- package/admin-scripts/index.js +16 -30
- package/admin-scripts/repositories/{admin-api-key-repository-documentdb.js → admin-process-repository-documentdb.js} +5 -5
- package/admin-scripts/repositories/{admin-api-key-repository-factory.js → admin-process-repository-factory.js} +15 -19
- package/admin-scripts/repositories/admin-process-repository-interface.js +150 -0
- package/admin-scripts/repositories/admin-process-repository-mongo.js +213 -0
- package/admin-scripts/repositories/admin-process-repository-postgres.js +251 -0
- package/admin-scripts/repositories/script-schedule-repository-factory.js +2 -6
- package/admin-scripts/repositories/script-schedule-repository-interface.js +14 -36
- package/admin-scripts/repositories/script-schedule-repository-mongo.js +13 -25
- package/admin-scripts/repositories/script-schedule-repository-postgres.js +13 -25
- package/application/commands/admin-script-commands.js +102 -266
- package/application/commands/integration-commands.js +6 -12
- package/application/index.js +3 -1
- package/assertions/get.js +4 -1
- package/associations/association.js +57 -59
- package/associations/model.js +41 -41
- package/core/CLAUDE.md +156 -222
- package/core/Worker.js +1 -5
- package/credential/repositories/credential-repository-documentdb.js +1 -71
- package/credential/repositories/credential-repository-interface.js +2 -8
- package/credential/repositories/credential-repository-mongo.js +4 -45
- package/credential/repositories/credential-repository-postgres.js +3 -44
- package/credential/repositories/credential-repository.js +4 -6
- package/credential/use-cases/get-credential-for-user.js +3 -21
- package/credential/use-cases/update-authentication-status.js +2 -5
- package/database/MONGODB_TRANSACTION_FIX.md +52 -72
- package/database/adapters/lambda-invoker.js +7 -8
- package/database/config.js +13 -15
- package/database/documentdb-encryption-service.js +13 -29
- package/database/documentdb-utils.js +12 -21
- package/database/encryption/README.md +36 -53
- package/database/encryption/encryption-schema-registry.js +9 -21
- package/database/encryption/field-encryption-service.js +4 -15
- package/database/encryption/logger.js +2 -3
- package/database/encryption/prisma-encryption-extension.js +8 -5
- package/database/index.js +2 -4
- package/database/models/IndividualUser.js +15 -15
- package/database/models/OrganizationUser.js +4 -6
- package/database/models/UserModel.js +2 -2
- package/database/models/WebsocketConnection.js +1 -4
- package/database/mongoose.js +2 -2
- package/database/prisma.js +14 -22
- package/database/repositories/health-check-repository-documentdb.js +7 -22
- package/database/repositories/health-check-repository-factory.js +3 -9
- package/database/repositories/health-check-repository-interface.js +5 -15
- package/database/repositories/health-check-repository-mongodb.js +6 -9
- package/database/repositories/health-check-repository-postgres.js +1 -1
- package/database/repositories/migration-status-repository-s3.js +5 -10
- package/database/use-cases/check-database-health-use-case.js +2 -3
- package/database/use-cases/check-database-state-use-case.js +7 -9
- package/database/use-cases/get-database-state-via-worker-use-case.js +12 -15
- package/database/use-cases/get-migration-status-use-case.js +2 -4
- package/database/use-cases/run-database-migration-use-case.js +9 -41
- package/database/use-cases/test-encryption-use-case.js +5 -4
- package/database/use-cases/trigger-database-migration-use-case.js +8 -9
- package/database/utils/mongodb-collection-utils.js +3 -11
- package/database/utils/mongodb-schema-init.js +4 -10
- package/database/utils/prisma-runner.js +74 -144
- package/database/utils/prisma-schema-parser.js +2 -2
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +80 -135
- package/encrypt/Cryptor.js +2 -8
- package/errors/fetch-error.js +1 -1
- package/generated/prisma-mongodb/edge.js +16 -59
- package/generated/prisma-mongodb/index-browser.js +12 -62
- package/generated/prisma-mongodb/index.d.ts +4850 -8136
- package/generated/prisma-mongodb/index.js +16 -59
- package/generated/prisma-mongodb/package.json +1 -1
- package/generated/prisma-mongodb/schema.prisma +33 -75
- package/generated/prisma-mongodb/wasm.js +16 -59
- package/generated/prisma-postgresql/edge.js +15 -59
- package/generated/prisma-postgresql/index-browser.js +11 -62
- package/generated/prisma-postgresql/index.d.ts +5963 -8930
- package/generated/prisma-postgresql/index.js +15 -59
- package/generated/prisma-postgresql/package.json +1 -1
- package/generated/prisma-postgresql/schema.prisma +33 -73
- package/generated/prisma-postgresql/wasm.js +15 -59
- package/handlers/WEBHOOKS.md +81 -104
- package/handlers/app-definition-loader.js +1 -1
- package/handlers/app-handler-helpers.js +2 -14
- package/handlers/backend-utils.js +1 -0
- package/handlers/database-migration-handler.js +45 -64
- package/handlers/middleware/admin-auth.js +53 -0
- package/handlers/routers/HEALTHCHECK.md +135 -170
- package/handlers/routers/auth.js +2 -23
- package/handlers/routers/db-migration.handler.js +3 -2
- package/handlers/routers/db-migration.js +33 -69
- package/handlers/routers/health.js +8 -23
- package/handlers/routers/integration-defined-routers.js +4 -4
- package/handlers/routers/integration-webhook-routers.js +7 -17
- package/handlers/routers/websocket.js +3 -9
- package/handlers/use-cases/check-integrations-health-use-case.js +6 -13
- package/handlers/workers/db-migration.js +26 -54
- package/index.js +9 -5
- package/integrations/WEBHOOK-QUICKSTART.md +14 -21
- package/integrations/index.js +0 -4
- package/integrations/integration-base.js +6 -9
- package/integrations/integration-router.js +146 -1817
- package/integrations/options.js +20 -47
- package/integrations/repositories/integration-repository-documentdb.js +24 -53
- package/integrations/repositories/integration-repository-factory.js +2 -6
- package/integrations/repositories/integration-repository-interface.js +9 -27
- package/integrations/repositories/integration-repository-postgres.js +3 -3
- package/integrations/repositories/process-repository-factory.js +1 -0
- package/integrations/repositories/process-repository-interface.js +5 -9
- package/integrations/repositories/process-repository-mongo.js +3 -7
- package/integrations/repositories/process-repository-postgres.js +2 -2
- package/integrations/tests/doubles/config-capturing-integration.js +8 -9
- package/integrations/tests/doubles/dummy-integration-class.js +8 -81
- package/integrations/tests/doubles/test-integration-repository.js +11 -51
- package/integrations/use-cases/create-integration.js +32 -36
- package/integrations/use-cases/create-process.js +9 -20
- package/integrations/use-cases/delete-integration-for-user.js +4 -5
- package/integrations/use-cases/get-integration-for-user.js +10 -25
- package/integrations/use-cases/get-integration-instance-by-definition.js +7 -13
- package/integrations/use-cases/get-integrations-for-user.js +1 -4
- package/integrations/use-cases/get-possible-integrations.js +1 -1
- package/integrations/use-cases/get-process.js +6 -5
- package/integrations/use-cases/index.js +1 -3
- package/integrations/use-cases/load-integration-context.js +5 -1
- package/integrations/use-cases/update-process-state.js +8 -10
- package/integrations/utils/map-integration-dto.js +3 -9
- package/jest-setup.js +1 -1
- package/jest-teardown.js +1 -1
- package/lambda/TimeoutCatcher.js +30 -32
- package/lambda/index.js +1 -1
- package/logs/index.js +3 -3
- package/modules/module.js +1 -3
- package/modules/repositories/module-repository-documentdb.js +48 -114
- package/modules/repositories/module-repository-interface.js +0 -13
- package/modules/repositories/module-repository-mongo.js +6 -46
- package/modules/repositories/module-repository-postgres.js +6 -48
- package/modules/repositories/module-repository.js +1 -34
- package/modules/requester/api-key.js +2 -0
- package/modules/requester/basic.js +1 -0
- package/modules/requester/oauth-2.js +2 -3
- package/modules/test/mock-api/definition.js +10 -15
- package/modules/test/mock-api/mocks/hubspot.js +36 -36
- package/modules/tests/doubles/test-module-factory.js +4 -10
- package/modules/tests/doubles/test-module-repository.js +1 -1
- package/modules/use-cases/get-entities-for-user.js +1 -1
- package/modules/use-cases/get-entity-options-by-id.js +6 -8
- package/modules/use-cases/get-module.js +9 -12
- package/modules/use-cases/process-authorization-callback.js +6 -12
- package/modules/use-cases/refresh-entity-options.js +6 -8
- package/modules/use-cases/test-module-auth.js +6 -8
- package/modules/utils/map-module-dto.js +2 -2
- package/package.json +5 -7
- package/prisma-mongodb/schema.prisma +33 -75
- package/prisma-postgresql/schema.prisma +33 -73
- package/queues/queuer-util.js +1 -5
- package/syncs/model.js +51 -51
- package/syncs/repositories/sync-repository-documentdb.js +19 -39
- package/syncs/repositories/sync-repository-interface.js +2 -6
- package/syncs/repositories/sync-repository-postgres.js +13 -19
- package/syncs/sync.js +100 -104
- package/token/repositories/token-repository-factory.js +3 -1
- package/types/assertions/index.d.ts +72 -72
- package/types/associations/index.d.ts +57 -57
- package/types/core/index.d.ts +53 -59
- package/types/database/index.d.ts +2 -2
- package/types/encrypt/index.d.ts +3 -3
- package/types/errors/index.d.ts +54 -61
- package/types/eslint-config/index.d.ts +40 -40
- package/types/integrations/index.d.ts +183 -185
- package/types/lambda/index.d.ts +26 -26
- package/types/logs/index.d.ts +4 -4
- package/types/module-plugin/index.d.ts +237 -239
- package/types/prettier-config/index.d.ts +5 -5
- package/types/syncs/index.d.ts +108 -102
- package/types/test-environment/index.d.ts +14 -14
- package/types/tsconfig.json +93 -95
- package/user/tests/doubles/test-user-repository.js +2 -5
- package/user/use-cases/authenticate-user.js +4 -2
- package/user/use-cases/authenticate-with-shared-secret.js +1 -1
- package/user/use-cases/create-individual-user.js +7 -8
- package/user/use-cases/create-organization-user.js +1 -1
- package/user/use-cases/create-token-for-user-id.js +1 -1
- package/user/use-cases/get-user-from-adopter-jwt.js +2 -0
- package/user/use-cases/get-user-from-bearer-token.js +3 -7
- package/user/use-cases/get-user-from-x-frigg-headers.js +11 -14
- package/user/use-cases/login-user.js +8 -8
- package/user/user.js +4 -18
- package/utils/backend-path.js +2 -2
- package/utils/index.js +1 -4
- package/websocket/repositories/websocket-connection-repository-documentdb.js +8 -21
- package/websocket/repositories/websocket-connection-repository-mongo.js +4 -8
- package/websocket/repositories/websocket-connection-repository-postgres.js +4 -8
- package/websocket/repositories/websocket-connection-repository.js +4 -8
- package/admin-scripts/repositories/admin-api-key-repository-interface.js +0 -121
- package/admin-scripts/repositories/admin-api-key-repository-mongo.js +0 -155
- package/admin-scripts/repositories/admin-api-key-repository-postgres.js +0 -189
- package/admin-scripts/repositories/script-execution-repository-documentdb.js +0 -21
- package/admin-scripts/repositories/script-execution-repository-factory.js +0 -55
- package/admin-scripts/repositories/script-execution-repository-interface.js +0 -193
- package/admin-scripts/repositories/script-execution-repository-mongo.js +0 -278
- package/admin-scripts/repositories/script-execution-repository-postgres.js +0 -320
- package/credential/credential-router.js +0 -262
- package/credential/use-cases/delete-credential-for-user.js +0 -50
- package/credential/use-cases/list-credentials-for-user.js +0 -31
- package/credential/use-cases/reauthorize-credential.js +0 -103
- package/handlers/routers/admin.js +0 -450
- package/handlers/routers/docs.js +0 -180
- package/handlers/routers/middleware/loadUser.js +0 -39
- package/handlers/routers/middleware/requireAdmin.js +0 -41
- package/handlers/routers/middleware/requireLoggedInUser.js +0 -19
- package/integrations/use-cases/execute-proxy-request.js +0 -564
- package/modules/domain/entities/AuthorizationSession.js +0 -131
- package/modules/domain/entities/index.js +0 -10
- package/modules/repositories/authorization-session-repository-factory.js +0 -55
- package/modules/repositories/authorization-session-repository-interface.js +0 -75
- package/modules/repositories/authorization-session-repository-mongo.js +0 -169
- package/modules/repositories/authorization-session-repository-postgres.js +0 -170
- package/modules/use-cases/delete-module-entity.js +0 -23
- package/modules/use-cases/get-authorization-requirements.js +0 -110
- package/modules/use-cases/get-module-entity-by-id.js +0 -16
- package/modules/use-cases/process-authorization-step.js +0 -160
- package/modules/use-cases/start-authorization-session.js +0 -86
- package/modules/use-cases/update-module-entity.js +0 -27
- package/openapi/openapi-spec-generator.js +0 -370
- package/openapi/openapi-v1.yaml +0 -1360
- package/openapi/openapi-v2.yaml +0 -1535
- 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
|
-
|
|
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.
|
|
40
|
-
* @param {string} [params.
|
|
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
|
-
|
|
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
|
|
58
|
+
* Update external scheduler information
|
|
72
59
|
*
|
|
73
60
|
* @param {string} scriptName - The script name
|
|
74
|
-
* @param {Object}
|
|
75
|
-
* @param {string} [
|
|
76
|
-
* @param {string} [
|
|
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
|
|
81
|
-
|
|
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.
|
|
44
|
-
* @param {string} [params.
|
|
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
|
|
62
|
-
if (
|
|
63
|
-
if (
|
|
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
|
|
100
|
+
* Update external scheduler information
|
|
109
101
|
*
|
|
110
102
|
* @param {string} scriptName - The script name
|
|
111
|
-
* @param {Object}
|
|
112
|
-
* @param {string} [
|
|
113
|
-
* @param {string} [
|
|
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
|
|
117
|
-
scriptName,
|
|
118
|
-
{ awsScheduleArn, awsScheduleName }
|
|
119
|
-
) {
|
|
108
|
+
async updateScheduleExternalInfo(scriptName, { externalScheduleId, externalScheduleName }) {
|
|
120
109
|
const data = {};
|
|
121
|
-
if (
|
|
122
|
-
if (
|
|
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.
|
|
75
|
-
* @param {string} [params.
|
|
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
|
|
93
|
-
if (
|
|
94
|
-
if (
|
|
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
|
|
131
|
+
* Update external scheduler information
|
|
140
132
|
*
|
|
141
133
|
* @param {string} scriptName - The script name
|
|
142
|
-
* @param {Object}
|
|
143
|
-
* @param {string} [
|
|
144
|
-
* @param {string} [
|
|
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
|
|
148
|
-
scriptName,
|
|
149
|
-
{ awsScheduleArn, awsScheduleName }
|
|
150
|
-
) {
|
|
139
|
+
async updateScheduleExternalInfo(scriptName, { externalScheduleId, externalScheduleName }) {
|
|
151
140
|
const data = {};
|
|
152
|
-
if (
|
|
153
|
-
if (
|
|
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 },
|