@forge/teamwork-graph 3.0.2 → 3.1.0-next.1
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/README.md +84 -0
- package/out/__test__/task-management.test.d.ts +2 -0
- package/out/__test__/task-management.test.d.ts.map +1 -0
- package/out/__test__/task-management.test.js +420 -0
- package/out/__test__/validators.test.js +100 -0
- package/out/graph.d.ts +4 -1
- package/out/graph.d.ts.map +1 -1
- package/out/graph.js +66 -0
- package/out/types/graph.d.ts +4 -1
- package/out/types/graph.d.ts.map +1 -1
- package/out/types/index.d.ts +1 -0
- package/out/types/index.d.ts.map +1 -1
- package/out/types/index.js +1 -0
- package/out/types/orchestration.d.ts +19 -0
- package/out/types/orchestration.d.ts.map +1 -0
- package/out/types/orchestration.js +2 -0
- package/out/types/requests.d.ts +39 -1
- package/out/types/requests.d.ts.map +1 -1
- package/out/utils/endpoints.d.ts +5 -0
- package/out/utils/endpoints.d.ts.map +1 -1
- package/out/utils/endpoints.js +5 -0
- package/out/utils/validators.d.ts +8 -0
- package/out/utils/validators.d.ts.map +1 -1
- package/out/utils/validators.js +78 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -200,6 +200,78 @@ const deleteGroupsResult = await graph.deleteGroupsByExternalId({
|
|
|
200
200
|
});
|
|
201
201
|
```
|
|
202
202
|
|
|
203
|
+
### Orchestration
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { graph } from '@forge/teamwork-graph';
|
|
207
|
+
|
|
208
|
+
// Schedule or update a task
|
|
209
|
+
const scheduleResult = await graph.scheduleOrUpdateTask({
|
|
210
|
+
connectionId: 'data-source:connection-123',
|
|
211
|
+
scheduleInterval: {
|
|
212
|
+
value: 30,
|
|
213
|
+
timeUnit: 'minutes'
|
|
214
|
+
},
|
|
215
|
+
task: {
|
|
216
|
+
taskType: 'data-sync',
|
|
217
|
+
taskId: '550e8400-e29b-41d4-a716-446655440000'
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
if (scheduleResult.status === 'ACCEPTED') {
|
|
222
|
+
console.log('Task scheduled successfully:', scheduleResult.taskId);
|
|
223
|
+
} else if (scheduleResult.error) {
|
|
224
|
+
console.error('Failed to schedule task:', scheduleResult.error);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Schedule a child task
|
|
228
|
+
const childTaskResult = await graph.scheduleChildTask({
|
|
229
|
+
scanId: 'scan-123',
|
|
230
|
+
taskExecutionId: 'execution-456',
|
|
231
|
+
connectionId: 'data-source:connection-789',
|
|
232
|
+
task: {
|
|
233
|
+
parentTaskId: '550e8400-e29b-41d4-a716-446655440000',
|
|
234
|
+
taskType: 'data-sync',
|
|
235
|
+
taskId: '550e8400-e29b-41d4-a716-446655440001'
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
if (childTaskResult.status === 'ACCEPTED') {
|
|
240
|
+
console.log('Child task scheduled successfully');
|
|
241
|
+
} else if (childTaskResult.error) {
|
|
242
|
+
console.error('Failed to schedule child task:', childTaskResult.error);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Update task status
|
|
246
|
+
const statusUpdateResult = await graph.updateTaskStatus({
|
|
247
|
+
scanId: 'scan-456',
|
|
248
|
+
taskExecutionId: 'execution-789',
|
|
249
|
+
connectionId: 'data-source:connection-123',
|
|
250
|
+
status: 'success',
|
|
251
|
+
task: {
|
|
252
|
+
taskId: '550e8400-e29b-41d4-a716-446655440002'
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
if (statusUpdateResult.status === 'ACCEPTED') {
|
|
257
|
+
console.log('Task status updated successfully');
|
|
258
|
+
} else if (statusUpdateResult.error) {
|
|
259
|
+
console.error('Failed to update task status:', statusUpdateResult.error);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Update task status with failure reason
|
|
263
|
+
const failureStatusResult = await graph.updateTaskStatus({
|
|
264
|
+
scanId: 'scan-456',
|
|
265
|
+
taskExecutionId: 'execution-789',
|
|
266
|
+
connectionId: 'data-source:connection-123',
|
|
267
|
+
status: 'failure',
|
|
268
|
+
task: {
|
|
269
|
+
taskId: '550e8400-e29b-41d4-a716-446655440002'
|
|
270
|
+
},
|
|
271
|
+
failureReason: 'RETRY_LIMIT_EXCEEDED'
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
203
275
|
## Error Handling
|
|
204
276
|
|
|
205
277
|
The SDK provides comprehensive error handling with consistent error responses and access to original error objects for debugging.
|
|
@@ -299,6 +371,18 @@ import type {
|
|
|
299
371
|
GetGroupByExternalIdRequest,
|
|
300
372
|
GetGroupByExternalIdResponse,
|
|
301
373
|
|
|
374
|
+
// Orchestration types
|
|
375
|
+
ScheduleInterval,
|
|
376
|
+
Task,
|
|
377
|
+
ChildTask,
|
|
378
|
+
TaskStatusUpdateTask,
|
|
379
|
+
TaskScheduleRequest,
|
|
380
|
+
TaskScheduleResponse,
|
|
381
|
+
ChildTaskScheduleRequest,
|
|
382
|
+
ChildTaskScheduleResponse,
|
|
383
|
+
TaskStatusUpdateRequest,
|
|
384
|
+
TaskStatusUpdateResponse,
|
|
385
|
+
|
|
302
386
|
// Common types
|
|
303
387
|
DeleteObjectsByExternalIdRequest,
|
|
304
388
|
DeleteObjectsByExternalIdResponse,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-management.test.d.ts","sourceRoot":"","sources":["../../src/__test__/task-management.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const api_1 = require("@forge/api");
|
|
4
|
+
const graph_1 = require("../graph");
|
|
5
|
+
const endpoints_1 = require("../utils/endpoints");
|
|
6
|
+
jest.mock('@forge/api');
|
|
7
|
+
describe('TeamWorkGraphClient - Task Management APIs', () => {
|
|
8
|
+
let graphClient;
|
|
9
|
+
let mockFetch;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
graphClient = new graph_1.TeamWorkGraphClient();
|
|
12
|
+
mockFetch = jest.fn();
|
|
13
|
+
api_1.__fetchProduct.mockReturnValue(mockFetch);
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
});
|
|
16
|
+
describe('scheduleOrUpdateTask', () => {
|
|
17
|
+
const validScheduleInterval = {
|
|
18
|
+
value: 30,
|
|
19
|
+
timeUnit: 'minutes'
|
|
20
|
+
};
|
|
21
|
+
const validTask = {
|
|
22
|
+
taskType: 'data-sync',
|
|
23
|
+
taskId: '550e8400-e29b-41d4-a716-446655440000'
|
|
24
|
+
};
|
|
25
|
+
const validRequest = {
|
|
26
|
+
connectionId: 'data-source:connection-123',
|
|
27
|
+
scheduleInterval: validScheduleInterval,
|
|
28
|
+
task: validTask
|
|
29
|
+
};
|
|
30
|
+
it('should successfully schedule a task', async () => {
|
|
31
|
+
const mockResponse = {
|
|
32
|
+
status: 'ACCEPTED',
|
|
33
|
+
message: 'Task scheduled successfully',
|
|
34
|
+
taskId: '550e8400-e29b-41d4-a716-446655440000'
|
|
35
|
+
};
|
|
36
|
+
const expectedResponse = {
|
|
37
|
+
status: 'ACCEPTED',
|
|
38
|
+
message: 'Task scheduled successfully',
|
|
39
|
+
taskId: '550e8400-e29b-41d4-a716-446655440000'
|
|
40
|
+
};
|
|
41
|
+
mockFetch.mockResolvedValueOnce({
|
|
42
|
+
ok: true,
|
|
43
|
+
json: () => Promise.resolve(mockResponse)
|
|
44
|
+
});
|
|
45
|
+
const result = await graphClient.scheduleOrUpdateTask(validRequest);
|
|
46
|
+
expect(mockFetch).toHaveBeenCalledWith((0, endpoints_1.getFullPath)(endpoints_1.ENDPOINTS.ORCHESTRATION.TASK_SCHEDULE), {
|
|
47
|
+
method: 'PUT',
|
|
48
|
+
body: JSON.stringify({
|
|
49
|
+
connectionId: 'data-source:connection-123',
|
|
50
|
+
scheduleInterval: validScheduleInterval,
|
|
51
|
+
task: validTask
|
|
52
|
+
}),
|
|
53
|
+
redirect: 'follow',
|
|
54
|
+
headers: {
|
|
55
|
+
'Atl-Connection-Id': 'data-source:connection-123',
|
|
56
|
+
'Content-Type': 'application/json'
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
expect(result).toEqual(expectedResponse);
|
|
60
|
+
});
|
|
61
|
+
it('should handle API error response', async () => {
|
|
62
|
+
const errorResponse = {
|
|
63
|
+
ok: false,
|
|
64
|
+
status: 400,
|
|
65
|
+
statusText: 'Bad Request',
|
|
66
|
+
headers: {
|
|
67
|
+
get: () => null
|
|
68
|
+
},
|
|
69
|
+
json: () => Promise.resolve({
|
|
70
|
+
code: 'INVALID_REQUEST',
|
|
71
|
+
message: 'Invalid task schedule request'
|
|
72
|
+
})
|
|
73
|
+
};
|
|
74
|
+
mockFetch.mockResolvedValueOnce(errorResponse);
|
|
75
|
+
const result = await graphClient.scheduleOrUpdateTask(validRequest);
|
|
76
|
+
expect(result).toEqual({
|
|
77
|
+
success: false,
|
|
78
|
+
error: 'Failed to schedule task: Bad Request - Invalid task schedule request',
|
|
79
|
+
originalError: expect.any(Error)
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
it('should throw validation error for missing connectionId', async () => {
|
|
83
|
+
const invalidRequest = {
|
|
84
|
+
...validRequest,
|
|
85
|
+
connectionId: ''
|
|
86
|
+
};
|
|
87
|
+
await expect(graphClient.scheduleOrUpdateTask(invalidRequest)).rejects.toThrow('connectionId is required');
|
|
88
|
+
});
|
|
89
|
+
it('should throw validation error for invalid schedule interval value', async () => {
|
|
90
|
+
const invalidRequest = {
|
|
91
|
+
...validRequest,
|
|
92
|
+
scheduleInterval: {
|
|
93
|
+
value: 0,
|
|
94
|
+
timeUnit: 'minutes'
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
await expect(graphClient.scheduleOrUpdateTask(invalidRequest)).rejects.toThrow('scheduleInterval.value must be between 1 and 60');
|
|
98
|
+
});
|
|
99
|
+
it('should throw validation error for invalid schedule interval timeUnit', async () => {
|
|
100
|
+
const invalidRequest = {
|
|
101
|
+
...validRequest,
|
|
102
|
+
scheduleInterval: {
|
|
103
|
+
value: 30,
|
|
104
|
+
timeUnit: 'invalid'
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
await expect(graphClient.scheduleOrUpdateTask(invalidRequest)).rejects.toThrow('scheduleInterval.timeUnit must be one of: minutes, hours, days');
|
|
108
|
+
});
|
|
109
|
+
it('should throw validation error for missing task type', async () => {
|
|
110
|
+
const invalidRequest = {
|
|
111
|
+
...validRequest,
|
|
112
|
+
task: {
|
|
113
|
+
...validTask,
|
|
114
|
+
taskType: ''
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
await expect(graphClient.scheduleOrUpdateTask(invalidRequest)).rejects.toThrow('task.taskType is required');
|
|
118
|
+
});
|
|
119
|
+
it('should throw validation error for invalid task ID format', async () => {
|
|
120
|
+
const invalidRequest = {
|
|
121
|
+
...validRequest,
|
|
122
|
+
task: {
|
|
123
|
+
...validTask,
|
|
124
|
+
taskId: 'invalid-uuid'
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
await expect(graphClient.scheduleOrUpdateTask(invalidRequest)).rejects.toThrow('task.taskId must be a valid UUID');
|
|
128
|
+
});
|
|
129
|
+
it('should throw validation error for task type exceeding max length', async () => {
|
|
130
|
+
const longTaskType = 'a'.repeat(256);
|
|
131
|
+
const invalidRequest = {
|
|
132
|
+
...validRequest,
|
|
133
|
+
task: {
|
|
134
|
+
...validTask,
|
|
135
|
+
taskType: longTaskType
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
await expect(graphClient.scheduleOrUpdateTask(invalidRequest)).rejects.toThrow('task.taskType must not exceed 255 characters');
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe('scheduleChildTask', () => {
|
|
142
|
+
const validChildTask = {
|
|
143
|
+
parentTaskId: 'parent-task-123',
|
|
144
|
+
taskType: 'child-data-sync',
|
|
145
|
+
taskId: '550e8400-e29b-41d4-a716-446655440001'
|
|
146
|
+
};
|
|
147
|
+
const validRequest = {
|
|
148
|
+
scanId: 'scan-123',
|
|
149
|
+
taskExecutionId: 'execution-456',
|
|
150
|
+
connectionId: 'data-source:connection-789',
|
|
151
|
+
task: validChildTask
|
|
152
|
+
};
|
|
153
|
+
it('should successfully schedule a child task', async () => {
|
|
154
|
+
const mockResponse = {
|
|
155
|
+
status: 'ACCEPTED',
|
|
156
|
+
message: 'Child task scheduled successfully'
|
|
157
|
+
};
|
|
158
|
+
const expectedResponse = {
|
|
159
|
+
status: 'ACCEPTED',
|
|
160
|
+
message: 'Child task scheduled successfully'
|
|
161
|
+
};
|
|
162
|
+
mockFetch.mockResolvedValueOnce({
|
|
163
|
+
ok: true,
|
|
164
|
+
json: () => Promise.resolve(mockResponse)
|
|
165
|
+
});
|
|
166
|
+
const result = await graphClient.scheduleChildTask(validRequest);
|
|
167
|
+
expect(mockFetch).toHaveBeenCalledWith((0, endpoints_1.getFullPath)('/scan/scan-123/taskExecution/execution-456/schedule'), {
|
|
168
|
+
method: 'POST',
|
|
169
|
+
body: JSON.stringify({
|
|
170
|
+
connectionId: 'data-source:connection-789',
|
|
171
|
+
task: validChildTask
|
|
172
|
+
}),
|
|
173
|
+
redirect: 'follow',
|
|
174
|
+
headers: {
|
|
175
|
+
'Atl-Connection-Id': 'data-source:connection-789',
|
|
176
|
+
'Content-Type': 'application/json'
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
expect(result).toEqual(expectedResponse);
|
|
180
|
+
});
|
|
181
|
+
it('should handle API error response', async () => {
|
|
182
|
+
const errorResponse = {
|
|
183
|
+
ok: false,
|
|
184
|
+
status: 404,
|
|
185
|
+
statusText: 'Not Found',
|
|
186
|
+
headers: {
|
|
187
|
+
get: () => null
|
|
188
|
+
},
|
|
189
|
+
json: () => Promise.resolve({
|
|
190
|
+
code: 'SCAN_NOT_FOUND',
|
|
191
|
+
message: 'Scan not found'
|
|
192
|
+
})
|
|
193
|
+
};
|
|
194
|
+
mockFetch.mockResolvedValueOnce(errorResponse);
|
|
195
|
+
const result = await graphClient.scheduleChildTask(validRequest);
|
|
196
|
+
expect(result).toEqual({
|
|
197
|
+
success: false,
|
|
198
|
+
error: 'Failed to schedule child tasks: Not Found - Scan not found',
|
|
199
|
+
originalError: expect.any(Error)
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
it('should throw validation error for missing connectionId', async () => {
|
|
203
|
+
const invalidRequest = {
|
|
204
|
+
...validRequest,
|
|
205
|
+
connectionId: ''
|
|
206
|
+
};
|
|
207
|
+
await expect(graphClient.scheduleChildTask(invalidRequest)).rejects.toThrow('connectionId is required');
|
|
208
|
+
});
|
|
209
|
+
it('should throw validation error for missing parent task ID', async () => {
|
|
210
|
+
const invalidRequest = {
|
|
211
|
+
...validRequest,
|
|
212
|
+
task: {
|
|
213
|
+
...validChildTask,
|
|
214
|
+
parentTaskId: ''
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
await expect(graphClient.scheduleChildTask(invalidRequest)).rejects.toThrow('task.parentTaskId is required');
|
|
218
|
+
});
|
|
219
|
+
it('should throw validation error for missing task type', async () => {
|
|
220
|
+
const invalidRequest = {
|
|
221
|
+
...validRequest,
|
|
222
|
+
task: {
|
|
223
|
+
...validChildTask,
|
|
224
|
+
taskType: ''
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
await expect(graphClient.scheduleChildTask(invalidRequest)).rejects.toThrow('task.taskType is required');
|
|
228
|
+
});
|
|
229
|
+
it('should throw validation error for invalid task ID format', async () => {
|
|
230
|
+
const invalidRequest = {
|
|
231
|
+
...validRequest,
|
|
232
|
+
task: {
|
|
233
|
+
...validChildTask,
|
|
234
|
+
taskId: 'not-a-uuid'
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
await expect(graphClient.scheduleChildTask(invalidRequest)).rejects.toThrow('task.taskId must be a valid UUID');
|
|
238
|
+
});
|
|
239
|
+
it('should throw validation error for task type exceeding max length', async () => {
|
|
240
|
+
const longTaskType = 'a'.repeat(256);
|
|
241
|
+
const invalidRequest = {
|
|
242
|
+
...validRequest,
|
|
243
|
+
task: {
|
|
244
|
+
...validChildTask,
|
|
245
|
+
taskType: longTaskType
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
await expect(graphClient.scheduleChildTask(invalidRequest)).rejects.toThrow('task.taskType must not exceed 255 characters');
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
describe('updateTaskStatus', () => {
|
|
252
|
+
const validTask = {
|
|
253
|
+
taskId: '550e8400-e29b-41d4-a716-446655440002'
|
|
254
|
+
};
|
|
255
|
+
const validRequest = {
|
|
256
|
+
scanId: 'scan-456',
|
|
257
|
+
taskExecutionId: 'execution-789',
|
|
258
|
+
connectionId: 'data-source:connection-123',
|
|
259
|
+
status: 'success',
|
|
260
|
+
task: validTask
|
|
261
|
+
};
|
|
262
|
+
it('should successfully update task status to success', async () => {
|
|
263
|
+
const mockResponse = {
|
|
264
|
+
status: 'ACCEPTED',
|
|
265
|
+
message: 'Task status updated successfully'
|
|
266
|
+
};
|
|
267
|
+
const expectedResponse = {
|
|
268
|
+
status: 'ACCEPTED',
|
|
269
|
+
message: 'Task status updated successfully'
|
|
270
|
+
};
|
|
271
|
+
mockFetch.mockResolvedValueOnce({
|
|
272
|
+
ok: true,
|
|
273
|
+
json: () => Promise.resolve(mockResponse)
|
|
274
|
+
});
|
|
275
|
+
const result = await graphClient.updateTaskStatus(validRequest);
|
|
276
|
+
expect(mockFetch).toHaveBeenCalledWith((0, endpoints_1.getFullPath)('/scan/scan-456/taskExecution/execution-789/status'), {
|
|
277
|
+
method: 'POST',
|
|
278
|
+
body: JSON.stringify({
|
|
279
|
+
connectionId: 'data-source:connection-123',
|
|
280
|
+
status: 'success',
|
|
281
|
+
task: validTask,
|
|
282
|
+
failureReason: undefined
|
|
283
|
+
}),
|
|
284
|
+
redirect: 'follow',
|
|
285
|
+
headers: {
|
|
286
|
+
'Atl-Connection-Id': 'data-source:connection-123',
|
|
287
|
+
'Content-Type': 'application/json'
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
expect(result).toEqual(expectedResponse);
|
|
291
|
+
});
|
|
292
|
+
it('should successfully update task status to failure with failure reason', async () => {
|
|
293
|
+
const mockResponse = {
|
|
294
|
+
status: 'ACCEPTED',
|
|
295
|
+
message: 'Task status updated successfully'
|
|
296
|
+
};
|
|
297
|
+
const expectedResponse = {
|
|
298
|
+
status: 'ACCEPTED',
|
|
299
|
+
message: 'Task status updated successfully'
|
|
300
|
+
};
|
|
301
|
+
mockFetch.mockResolvedValueOnce({
|
|
302
|
+
ok: true,
|
|
303
|
+
json: () => Promise.resolve(mockResponse)
|
|
304
|
+
});
|
|
305
|
+
const failureRequest = {
|
|
306
|
+
...validRequest,
|
|
307
|
+
status: 'failure',
|
|
308
|
+
failureReason: 'RETRY_LIMIT_EXCEEDED'
|
|
309
|
+
};
|
|
310
|
+
const result = await graphClient.updateTaskStatus(failureRequest);
|
|
311
|
+
expect(mockFetch).toHaveBeenCalledWith((0, endpoints_1.getFullPath)('/scan/scan-456/taskExecution/execution-789/status'), {
|
|
312
|
+
method: 'POST',
|
|
313
|
+
body: JSON.stringify({
|
|
314
|
+
connectionId: 'data-source:connection-123',
|
|
315
|
+
status: 'failure',
|
|
316
|
+
task: validTask,
|
|
317
|
+
failureReason: 'RETRY_LIMIT_EXCEEDED'
|
|
318
|
+
}),
|
|
319
|
+
redirect: 'follow',
|
|
320
|
+
headers: {
|
|
321
|
+
'Atl-Connection-Id': 'data-source:connection-123',
|
|
322
|
+
'Content-Type': 'application/json'
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
expect(result).toEqual(expectedResponse);
|
|
326
|
+
});
|
|
327
|
+
it('should handle API error response', async () => {
|
|
328
|
+
const errorResponse = {
|
|
329
|
+
ok: false,
|
|
330
|
+
status: 500,
|
|
331
|
+
statusText: 'Internal Server Error',
|
|
332
|
+
headers: {
|
|
333
|
+
get: () => null
|
|
334
|
+
},
|
|
335
|
+
json: () => Promise.resolve({
|
|
336
|
+
code: 'INTERNAL_ERROR',
|
|
337
|
+
message: 'Internal server error occurred'
|
|
338
|
+
})
|
|
339
|
+
};
|
|
340
|
+
mockFetch.mockResolvedValueOnce(errorResponse);
|
|
341
|
+
const result = await graphClient.updateTaskStatus(validRequest);
|
|
342
|
+
expect(result).toEqual({
|
|
343
|
+
success: false,
|
|
344
|
+
error: 'Failed to update task status: Internal Server Error - Internal server error occurred',
|
|
345
|
+
originalError: expect.any(Error)
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
it('should throw validation error for missing connectionId', async () => {
|
|
349
|
+
const invalidRequest = {
|
|
350
|
+
...validRequest,
|
|
351
|
+
connectionId: ''
|
|
352
|
+
};
|
|
353
|
+
await expect(graphClient.updateTaskStatus(invalidRequest)).rejects.toThrow('connectionId is required');
|
|
354
|
+
});
|
|
355
|
+
it('should throw validation error for invalid status', async () => {
|
|
356
|
+
const invalidRequest = {
|
|
357
|
+
...validRequest,
|
|
358
|
+
status: 'invalid'
|
|
359
|
+
};
|
|
360
|
+
await expect(graphClient.updateTaskStatus(invalidRequest)).rejects.toThrow('status must be one of: success, failure');
|
|
361
|
+
});
|
|
362
|
+
it('should throw validation error for missing task ID', async () => {
|
|
363
|
+
const invalidRequest = {
|
|
364
|
+
...validRequest,
|
|
365
|
+
task: {
|
|
366
|
+
taskId: ''
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
await expect(graphClient.updateTaskStatus(invalidRequest)).rejects.toThrow('task.taskId is required');
|
|
370
|
+
});
|
|
371
|
+
it('should throw validation error for invalid task ID format', async () => {
|
|
372
|
+
const invalidRequest = {
|
|
373
|
+
...validRequest,
|
|
374
|
+
task: {
|
|
375
|
+
taskId: 'invalid-uuid-format'
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
await expect(graphClient.updateTaskStatus(invalidRequest)).rejects.toThrow('task.taskId must be a valid UUID');
|
|
379
|
+
});
|
|
380
|
+
it('should throw validation error for invalid failure reason', async () => {
|
|
381
|
+
const invalidRequest = {
|
|
382
|
+
...validRequest,
|
|
383
|
+
status: 'failure',
|
|
384
|
+
failureReason: 'INVALID_REASON'
|
|
385
|
+
};
|
|
386
|
+
await expect(graphClient.updateTaskStatus(invalidRequest)).rejects.toThrow('failureReason must be one of: ENTITY_NOT_FOUND, RETRY_LIMIT_EXCEEDED, NON_RETRYABLE_ERROR, UNAUTHORIZED, AUTH_TOKEN_REVOKED, AUTH_TOKEN_EXPIRED, RATE_LIMITED, RETRYABLE_ERROR');
|
|
387
|
+
});
|
|
388
|
+
it('should accept all valid failure reasons', async () => {
|
|
389
|
+
const validFailureReasons = [
|
|
390
|
+
'ENTITY_NOT_FOUND',
|
|
391
|
+
'RETRY_LIMIT_EXCEEDED',
|
|
392
|
+
'NON_RETRYABLE_ERROR',
|
|
393
|
+
'UNAUTHORIZED',
|
|
394
|
+
'AUTH_TOKEN_REVOKED',
|
|
395
|
+
'AUTH_TOKEN_EXPIRED',
|
|
396
|
+
'RATE_LIMITED',
|
|
397
|
+
'RETRYABLE_ERROR'
|
|
398
|
+
];
|
|
399
|
+
const mockResponse = {
|
|
400
|
+
status: 'ACCEPTED',
|
|
401
|
+
message: 'Task status updated successfully'
|
|
402
|
+
};
|
|
403
|
+
mockFetch.mockResolvedValue({
|
|
404
|
+
ok: true,
|
|
405
|
+
json: () => Promise.resolve(mockResponse)
|
|
406
|
+
});
|
|
407
|
+
for (const failureReason of validFailureReasons) {
|
|
408
|
+
const request = {
|
|
409
|
+
...validRequest,
|
|
410
|
+
status: 'failure',
|
|
411
|
+
failureReason: failureReason
|
|
412
|
+
};
|
|
413
|
+
await expect(graphClient.updateTaskStatus(request)).resolves.toEqual({
|
|
414
|
+
status: 'ACCEPTED',
|
|
415
|
+
message: 'Task status updated successfully'
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
});
|
|
@@ -195,4 +195,104 @@ describe('TeamWorkGraphClient - Validators', () => {
|
|
|
195
195
|
expect(() => (0, validators_1.validateDeleteObjectsByPropertiesRequest)(properties, null)).toThrow(errors_1.ForgeTeamWorkGraphValidationError);
|
|
196
196
|
});
|
|
197
197
|
});
|
|
198
|
+
describe('validateTaskScheduleRequest', () => {
|
|
199
|
+
const validScheduleInterval = {
|
|
200
|
+
value: 30,
|
|
201
|
+
timeUnit: 'minutes'
|
|
202
|
+
};
|
|
203
|
+
const validTask = {
|
|
204
|
+
taskType: 'data-sync',
|
|
205
|
+
taskId: '550e8400-e29b-41d4-a716-446655440000'
|
|
206
|
+
};
|
|
207
|
+
it('should pass with valid request', () => {
|
|
208
|
+
expect(() => (0, validators_1.validateTaskScheduleRequest)('data-source:connection-123', validScheduleInterval, validTask)).not.toThrow();
|
|
209
|
+
});
|
|
210
|
+
it('should throw validation error for empty connectionId', () => {
|
|
211
|
+
expect(() => (0, validators_1.validateTaskScheduleRequest)('', validScheduleInterval, validTask)).toThrow('connectionId is required');
|
|
212
|
+
});
|
|
213
|
+
it('should throw validation error for invalid schedule interval value', () => {
|
|
214
|
+
const invalidInterval = { value: 0, timeUnit: 'minutes' };
|
|
215
|
+
expect(() => (0, validators_1.validateTaskScheduleRequest)('data-source:connection-123', invalidInterval, validTask)).toThrow('scheduleInterval.value must be between 1 and 60');
|
|
216
|
+
});
|
|
217
|
+
it('should throw validation error for invalid schedule interval timeUnit', () => {
|
|
218
|
+
const invalidInterval = { value: 30, timeUnit: 'invalid' };
|
|
219
|
+
expect(() => (0, validators_1.validateTaskScheduleRequest)('data-source:connection-123', invalidInterval, validTask)).toThrow('scheduleInterval.timeUnit must be one of: minutes, hours, days');
|
|
220
|
+
});
|
|
221
|
+
it('should throw validation error for missing task type', () => {
|
|
222
|
+
const invalidTask = { ...validTask, taskType: '' };
|
|
223
|
+
expect(() => (0, validators_1.validateTaskScheduleRequest)('data-source:connection-123', validScheduleInterval, invalidTask)).toThrow('task.taskType is required');
|
|
224
|
+
});
|
|
225
|
+
it('should throw validation error for invalid task ID format', () => {
|
|
226
|
+
const invalidTask = { ...validTask, taskId: 'invalid-uuid' };
|
|
227
|
+
expect(() => (0, validators_1.validateTaskScheduleRequest)('data-source:connection-123', validScheduleInterval, invalidTask)).toThrow('task.taskId must be a valid UUID');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('validateChildTaskScheduleRequest', () => {
|
|
231
|
+
const validTask = {
|
|
232
|
+
parentTaskId: 'parent-task-123',
|
|
233
|
+
taskType: 'child-data-sync',
|
|
234
|
+
taskId: '550e8400-e29b-41d4-a716-446655440001'
|
|
235
|
+
};
|
|
236
|
+
it('should pass with valid request', () => {
|
|
237
|
+
expect(() => (0, validators_1.validateChildTaskScheduleRequest)('data-source:connection-123', validTask)).not.toThrow();
|
|
238
|
+
});
|
|
239
|
+
it('should throw validation error for empty connectionId', () => {
|
|
240
|
+
expect(() => (0, validators_1.validateChildTaskScheduleRequest)('', validTask)).toThrow('connectionId is required');
|
|
241
|
+
});
|
|
242
|
+
it('should throw validation error for missing parent task ID', () => {
|
|
243
|
+
const invalidTask = { ...validTask, parentTaskId: '' };
|
|
244
|
+
expect(() => (0, validators_1.validateChildTaskScheduleRequest)('data-source:connection-123', invalidTask)).toThrow('task.parentTaskId is required');
|
|
245
|
+
});
|
|
246
|
+
it('should throw validation error for missing task type', () => {
|
|
247
|
+
const invalidTask = { ...validTask, taskType: '' };
|
|
248
|
+
expect(() => (0, validators_1.validateChildTaskScheduleRequest)('data-source:connection-123', invalidTask)).toThrow('task.taskType is required');
|
|
249
|
+
});
|
|
250
|
+
it('should throw validation error for invalid task ID format', () => {
|
|
251
|
+
const invalidTask = { ...validTask, taskId: 'not-a-uuid' };
|
|
252
|
+
expect(() => (0, validators_1.validateChildTaskScheduleRequest)('data-source:connection-123', invalidTask)).toThrow('task.taskId must be a valid UUID');
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
describe('validateTaskStatusUpdateRequest', () => {
|
|
256
|
+
const validTask = {
|
|
257
|
+
taskId: '550e8400-e29b-41d4-a716-446655440002'
|
|
258
|
+
};
|
|
259
|
+
it('should pass with valid success request', () => {
|
|
260
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'success', validTask)).not.toThrow();
|
|
261
|
+
});
|
|
262
|
+
it('should pass with valid failure request and failure reason', () => {
|
|
263
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'failure', validTask, 'RETRY_LIMIT_EXCEEDED')).not.toThrow();
|
|
264
|
+
});
|
|
265
|
+
it('should throw validation error for empty connectionId', () => {
|
|
266
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('', 'success', validTask)).toThrow('connectionId is required');
|
|
267
|
+
});
|
|
268
|
+
it('should throw validation error for invalid status', () => {
|
|
269
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'invalid', validTask)).toThrow('status must be one of: success, failure');
|
|
270
|
+
});
|
|
271
|
+
it('should throw validation error for missing task ID', () => {
|
|
272
|
+
const invalidTask = { taskId: '' };
|
|
273
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'success', invalidTask)).toThrow('task.taskId is required');
|
|
274
|
+
});
|
|
275
|
+
it('should throw validation error for invalid task ID format', () => {
|
|
276
|
+
const invalidTask = { taskId: 'invalid-uuid-format' };
|
|
277
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'success', invalidTask)).toThrow('task.taskId must be a valid UUID');
|
|
278
|
+
});
|
|
279
|
+
it('should throw validation error for invalid failure reason', () => {
|
|
280
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'failure', validTask, 'INVALID_REASON')).toThrow('failureReason must be one of: ENTITY_NOT_FOUND, RETRY_LIMIT_EXCEEDED, NON_RETRYABLE_ERROR, UNAUTHORIZED, AUTH_TOKEN_REVOKED, AUTH_TOKEN_EXPIRED, RATE_LIMITED, RETRYABLE_ERROR');
|
|
281
|
+
});
|
|
282
|
+
it('should accept all valid failure reasons', () => {
|
|
283
|
+
const validFailureReasons = [
|
|
284
|
+
'ENTITY_NOT_FOUND',
|
|
285
|
+
'RETRY_LIMIT_EXCEEDED',
|
|
286
|
+
'NON_RETRYABLE_ERROR',
|
|
287
|
+
'UNAUTHORIZED',
|
|
288
|
+
'AUTH_TOKEN_REVOKED',
|
|
289
|
+
'AUTH_TOKEN_EXPIRED',
|
|
290
|
+
'RATE_LIMITED',
|
|
291
|
+
'RETRYABLE_ERROR'
|
|
292
|
+
];
|
|
293
|
+
validFailureReasons.forEach((reason) => {
|
|
294
|
+
expect(() => (0, validators_1.validateTaskStatusUpdateRequest)('data-source:connection-123', 'failure', validTask, reason)).not.toThrow();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
});
|
|
198
298
|
});
|
package/out/graph.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TeamWorkGraph, SetObjectsRequest, BulkObjectResponse, BulkUsersRequest, BulkUsersResponse, DeleteUsersByExternalIdRequest, DeleteUsersByExternalIdResponse, GetUserByExternalIdRequest, GetUserByExternalIdResponse, MapUsersRequest, MapUsersResponse, BulkGroupsRequest, BulkGroupsResponse, DeleteGroupsByExternalIdRequest, DeleteGroupsByExternalIdResponse, GetGroupByExternalIdRequest, GetGroupByExternalIdResponse, GetObjectByExternalIdRequest, GetObjectByExternalIdResponse, DeleteObjectsByExternalIdRequest, DeleteObjectsByExternalIdResponse, DeleteObjectsByPropertiesRequest, DeleteObjectsByPropertiesResponse } from './types';
|
|
1
|
+
import { TeamWorkGraph, SetObjectsRequest, BulkObjectResponse, BulkUsersRequest, BulkUsersResponse, DeleteUsersByExternalIdRequest, DeleteUsersByExternalIdResponse, GetUserByExternalIdRequest, GetUserByExternalIdResponse, MapUsersRequest, MapUsersResponse, BulkGroupsRequest, BulkGroupsResponse, DeleteGroupsByExternalIdRequest, DeleteGroupsByExternalIdResponse, GetGroupByExternalIdRequest, GetGroupByExternalIdResponse, GetObjectByExternalIdRequest, GetObjectByExternalIdResponse, DeleteObjectsByExternalIdRequest, DeleteObjectsByExternalIdResponse, DeleteObjectsByPropertiesRequest, DeleteObjectsByPropertiesResponse, TaskScheduleRequest, TaskScheduleResponse, ChildTaskScheduleRequest, ChildTaskScheduleResponse, TaskStatusUpdateRequest, TaskStatusUpdateResponse } from './types';
|
|
2
2
|
export declare class TeamWorkGraphClient implements TeamWorkGraph {
|
|
3
3
|
setObjects: (request: SetObjectsRequest) => Promise<BulkObjectResponse>;
|
|
4
4
|
getObjectByExternalId: (request: GetObjectByExternalIdRequest) => Promise<GetObjectByExternalIdResponse>;
|
|
@@ -11,6 +11,9 @@ export declare class TeamWorkGraphClient implements TeamWorkGraph {
|
|
|
11
11
|
deleteUsersByExternalId: (request: DeleteUsersByExternalIdRequest) => Promise<DeleteUsersByExternalIdResponse>;
|
|
12
12
|
getUserByExternalId: (request: GetUserByExternalIdRequest) => Promise<GetUserByExternalIdResponse>;
|
|
13
13
|
mapUsers: (request: MapUsersRequest) => Promise<MapUsersResponse>;
|
|
14
|
+
scheduleOrUpdateTask: (request: TaskScheduleRequest) => Promise<TaskScheduleResponse>;
|
|
15
|
+
scheduleChildTask: (request: ChildTaskScheduleRequest) => Promise<ChildTaskScheduleResponse>;
|
|
16
|
+
updateTaskStatus: (request: TaskStatusUpdateRequest) => Promise<TaskStatusUpdateResponse>;
|
|
14
17
|
private sendRequest;
|
|
15
18
|
}
|
|
16
19
|
export declare const teamworkgraph: TeamWorkGraphClient;
|
package/out/graph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,8BAA8B,EAC9B,+BAA+B,EAC/B,0BAA0B,EAC1B,2BAA2B,EAC3B,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAChC,iCAAiC,EACjC,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,qBAAa,mBAAoB,YAAW,aAAa;IACvD,UAAU,YAAmB,iBAAiB,KAAG,QAAQ,kBAAkB,CAAC,CAwB1E;IAKF,qBAAqB,YAAmB,4BAA4B,KAAG,QAAQ,6BAA6B,CAAC,CAwB3G;IAKF,yBAAyB,YACd,gCAAgC,KACxC,QAAQ,iCAAiC,CAAC,CAmB3C;IAKF,yBAAyB,YACd,gCAAgC,KACxC,QAAQ,iCAAiC,CAAC,CAsB3C;IAKF,SAAS,YAAmB,iBAAiB,KAAG,QAAQ,kBAAkB,CAAC,CAuBzE;IAKF,wBAAwB,YACb,+BAA+B,KACvC,QAAQ,gCAAgC,CAAC,CAoB1C;IAKF,oBAAoB,YAAmB,2BAA2B,KAAG,QAAQ,4BAA4B,CAAC,CAoBxG;IAEF,QAAQ,YAAmB,gBAAgB,KAAG,QAAQ,iBAAiB,CAAC,CAwBtE;IAEF,uBAAuB,YACZ,8BAA8B,KACtC,QAAQ,+BAA+B,CAAC,CAoBzC;IAEF,mBAAmB,YAAmB,0BAA0B,KAAG,QAAQ,2BAA2B,CAAC,CAoBrG;IAEF,QAAQ,YAAmB,eAAe,KAAG,QAAQ,gBAAgB,CAAC,CAuBpE;IAOF,oBAAoB,YAAmB,mBAAmB,KAAG,QAAQ,oBAAoB,CAAC,CAyBxF;IAKF,iBAAiB,YAAmB,wBAAwB,KAAG,QAAQ,yBAAyB,CAAC,CA4B/F;IAKF,gBAAgB,YAAmB,uBAAuB,KAAG,QAAQ,wBAAwB,CAAC,CA6B5F;YAEY,WAAW;CAiC1B;AAED,eAAO,MAAM,aAAa,qBAA4B,CAAC"}
|
package/out/graph.js
CHANGED
|
@@ -212,6 +212,72 @@ class TeamWorkGraphClient {
|
|
|
212
212
|
return (0, error_handling_1.handleError)(error, 'map users');
|
|
213
213
|
}
|
|
214
214
|
};
|
|
215
|
+
scheduleOrUpdateTask = async (request) => {
|
|
216
|
+
const { scheduleInterval, task, connectionId } = request;
|
|
217
|
+
(0, validators_1.validateTaskScheduleRequest)(connectionId, scheduleInterval, task);
|
|
218
|
+
try {
|
|
219
|
+
const response = await this.sendRequest(endpoints_1.ENDPOINTS.ORCHESTRATION.TASK_SCHEDULE, {
|
|
220
|
+
method: 'PUT',
|
|
221
|
+
body: JSON.stringify({
|
|
222
|
+
connectionId,
|
|
223
|
+
scheduleInterval,
|
|
224
|
+
task
|
|
225
|
+
})
|
|
226
|
+
}, connectionId);
|
|
227
|
+
return {
|
|
228
|
+
status: response.status || 'ACCEPTED',
|
|
229
|
+
message: response.message || 'Task scheduled successfully',
|
|
230
|
+
taskId: response.taskId
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
return (0, error_handling_1.handleError)(error, 'schedule task');
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
scheduleChildTask = async (request) => {
|
|
238
|
+
const { scanId, taskExecutionId, task, connectionId } = request;
|
|
239
|
+
(0, validators_1.validateChildTaskScheduleRequest)(connectionId, task);
|
|
240
|
+
try {
|
|
241
|
+
const endpoint = endpoints_1.ENDPOINTS.ORCHESTRATION.CHILD_TASK_SCHEDULE.replace('{scanId}', scanId).replace('{taskExecutionId}', taskExecutionId);
|
|
242
|
+
const response = await this.sendRequest(endpoint, {
|
|
243
|
+
method: 'POST',
|
|
244
|
+
body: JSON.stringify({
|
|
245
|
+
connectionId,
|
|
246
|
+
task
|
|
247
|
+
})
|
|
248
|
+
}, connectionId);
|
|
249
|
+
return {
|
|
250
|
+
status: response.status || 'ACCEPTED',
|
|
251
|
+
message: response.message || 'Child task scheduled successfully'
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
return (0, error_handling_1.handleError)(error, 'schedule child tasks');
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
updateTaskStatus = async (request) => {
|
|
259
|
+
const { scanId, taskExecutionId, status, task, failureReason, connectionId } = request;
|
|
260
|
+
(0, validators_1.validateTaskStatusUpdateRequest)(connectionId, status, task, failureReason);
|
|
261
|
+
const endpoint = endpoints_1.ENDPOINTS.ORCHESTRATION.TASK_STATUS_UPDATE.replace('{scanId}', scanId).replace('{taskExecutionId}', taskExecutionId);
|
|
262
|
+
try {
|
|
263
|
+
const response = await this.sendRequest(endpoint, {
|
|
264
|
+
method: 'POST',
|
|
265
|
+
body: JSON.stringify({
|
|
266
|
+
connectionId,
|
|
267
|
+
status,
|
|
268
|
+
task,
|
|
269
|
+
failureReason
|
|
270
|
+
})
|
|
271
|
+
}, connectionId);
|
|
272
|
+
return {
|
|
273
|
+
status: response.status || 'ACCEPTED',
|
|
274
|
+
message: response.message || 'Task status updated successfully'
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return (0, error_handling_1.handleError)(error, 'update task status');
|
|
279
|
+
}
|
|
280
|
+
};
|
|
215
281
|
async sendRequest(path, options, connectionId) {
|
|
216
282
|
try {
|
|
217
283
|
const reqPath = (0, endpoints_1.getFullPath)(path);
|
package/out/types/graph.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SetObjectsRequest, BulkObjectResponse, BulkUsersRequest, BulkUsersResponse, DeleteUsersByExternalIdRequest, DeleteUsersByExternalIdResponse, GetUserByExternalIdRequest, GetUserByExternalIdResponse, MapUsersRequest, MapUsersResponse, BulkGroupsRequest, BulkGroupsResponse, DeleteGroupsByExternalIdRequest, DeleteGroupsByExternalIdResponse, GetGroupByExternalIdRequest, GetGroupByExternalIdResponse, GetObjectByExternalIdRequest, GetObjectByExternalIdResponse, DeleteObjectsByExternalIdRequest, DeleteObjectsByExternalIdResponse, DeleteObjectsByPropertiesRequest, DeleteObjectsByPropertiesResponse } from './';
|
|
1
|
+
import { SetObjectsRequest, BulkObjectResponse, BulkUsersRequest, BulkUsersResponse, DeleteUsersByExternalIdRequest, DeleteUsersByExternalIdResponse, GetUserByExternalIdRequest, GetUserByExternalIdResponse, MapUsersRequest, MapUsersResponse, BulkGroupsRequest, BulkGroupsResponse, DeleteGroupsByExternalIdRequest, DeleteGroupsByExternalIdResponse, GetGroupByExternalIdRequest, GetGroupByExternalIdResponse, GetObjectByExternalIdRequest, GetObjectByExternalIdResponse, DeleteObjectsByExternalIdRequest, DeleteObjectsByExternalIdResponse, DeleteObjectsByPropertiesRequest, DeleteObjectsByPropertiesResponse, TaskScheduleRequest, TaskScheduleResponse, ChildTaskScheduleRequest, ChildTaskScheduleResponse, TaskStatusUpdateRequest, TaskStatusUpdateResponse } from './';
|
|
2
2
|
export interface TeamWorkGraph {
|
|
3
3
|
setObjects(request: SetObjectsRequest): Promise<BulkObjectResponse>;
|
|
4
4
|
getObjectByExternalId(request: GetObjectByExternalIdRequest): Promise<GetObjectByExternalIdResponse>;
|
|
@@ -11,5 +11,8 @@ export interface TeamWorkGraph {
|
|
|
11
11
|
setGroups(request: BulkGroupsRequest): Promise<BulkGroupsResponse>;
|
|
12
12
|
deleteGroupsByExternalId(request: DeleteGroupsByExternalIdRequest): Promise<DeleteGroupsByExternalIdResponse>;
|
|
13
13
|
getGroupByExternalId(request: GetGroupByExternalIdRequest): Promise<GetGroupByExternalIdResponse>;
|
|
14
|
+
scheduleOrUpdateTask(request: TaskScheduleRequest): Promise<TaskScheduleResponse>;
|
|
15
|
+
scheduleChildTask(request: ChildTaskScheduleRequest): Promise<ChildTaskScheduleResponse>;
|
|
16
|
+
updateTaskStatus(request: TaskStatusUpdateRequest): Promise<TaskStatusUpdateResponse>;
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=graph.d.ts.map
|
package/out/types/graph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/types/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,8BAA8B,EAC9B,+BAA+B,EAC/B,0BAA0B,EAC1B,2BAA2B,EAC3B,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAChC,iCAAiC,
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/types/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,8BAA8B,EAC9B,+BAA+B,EAC/B,0BAA0B,EAC1B,2BAA2B,EAC3B,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAChC,iCAAiC,EACjC,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,IAAI,CAAC;AAEZ,MAAM,WAAW,aAAa;IAE5B,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpE,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACrG,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACjH,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAGjH,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChE,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC3G,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC/F,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAG9D,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnE,wBAAwB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC9G,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAGlG,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClF,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACzF,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACvF"}
|
package/out/types/index.d.ts
CHANGED
package/out/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,iBAAiB,CAAC;AAEhC,cAAc,SAAS,CAAC"}
|
package/out/types/index.js
CHANGED
|
@@ -6,4 +6,5 @@ tslib_1.__exportStar(require("./objects"), exports);
|
|
|
6
6
|
tslib_1.__exportStar(require("./requests"), exports);
|
|
7
7
|
tslib_1.__exportStar(require("./users"), exports);
|
|
8
8
|
tslib_1.__exportStar(require("./groups"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./orchestration"), exports);
|
|
9
10
|
tslib_1.__exportStar(require("./graph"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare type ScheduleInterval = {
|
|
2
|
+
value: number;
|
|
3
|
+
timeUnit: 'minutes' | 'hours' | 'days';
|
|
4
|
+
};
|
|
5
|
+
export declare type Task = {
|
|
6
|
+
taskType: string;
|
|
7
|
+
taskId: string;
|
|
8
|
+
};
|
|
9
|
+
export declare type ChildTask = {
|
|
10
|
+
parentTaskId: string;
|
|
11
|
+
taskType: string;
|
|
12
|
+
taskId: string;
|
|
13
|
+
temporalTaskMetadata?: any;
|
|
14
|
+
persistentTaskMetadata?: any;
|
|
15
|
+
};
|
|
16
|
+
export declare type TaskStatusUpdateTask = {
|
|
17
|
+
taskId: string;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=orchestration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestration.d.ts","sourceRoot":"","sources":["../../src/types/orchestration.ts"],"names":[],"mappings":"AAEA,oBAAY,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;CACxC,CAAC;AAEF,oBAAY,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,sBAAsB,CAAC,EAAE,GAAG,CAAC;CAC9B,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
package/out/types/requests.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Object, UserPayload, User, GroupPayload, Group } from './';
|
|
1
|
+
import { Object, UserPayload, User, GroupPayload, Group, Task, ScheduleInterval, ChildTask, TaskStatusUpdateTask } from './';
|
|
2
2
|
export declare type SetObjectsRequest = {
|
|
3
3
|
objects: Array<Object>;
|
|
4
4
|
properties?: Record<string, string>;
|
|
@@ -205,4 +205,42 @@ export declare type GetGroupByExternalIdResponse = {
|
|
|
205
205
|
error?: string;
|
|
206
206
|
originalError?: unknown;
|
|
207
207
|
};
|
|
208
|
+
export declare type TaskScheduleRequest = {
|
|
209
|
+
connectionId: string;
|
|
210
|
+
scheduleInterval: ScheduleInterval;
|
|
211
|
+
task: Task;
|
|
212
|
+
};
|
|
213
|
+
export declare type TaskScheduleResponse = {
|
|
214
|
+
status: string;
|
|
215
|
+
message: string;
|
|
216
|
+
taskId: string;
|
|
217
|
+
error?: string;
|
|
218
|
+
originalError?: unknown;
|
|
219
|
+
};
|
|
220
|
+
export declare type ChildTaskScheduleRequest = {
|
|
221
|
+
scanId: string;
|
|
222
|
+
taskExecutionId: string;
|
|
223
|
+
task: ChildTask;
|
|
224
|
+
connectionId: string;
|
|
225
|
+
};
|
|
226
|
+
export declare type ChildTaskScheduleResponse = {
|
|
227
|
+
status: string;
|
|
228
|
+
message: string;
|
|
229
|
+
error?: string;
|
|
230
|
+
originalError?: unknown;
|
|
231
|
+
};
|
|
232
|
+
export declare type TaskStatusUpdateRequest = {
|
|
233
|
+
scanId: string;
|
|
234
|
+
taskExecutionId: string;
|
|
235
|
+
status: 'success' | 'failure';
|
|
236
|
+
task: TaskStatusUpdateTask;
|
|
237
|
+
failureReason?: 'ENTITY_NOT_FOUND' | 'RETRY_LIMIT_EXCEEDED' | 'NON_RETRYABLE_ERROR' | 'UNAUTHORIZED' | 'AUTH_TOKEN_REVOKED' | 'AUTH_TOKEN_EXPIRED' | 'RATE_LIMITED' | 'RETRYABLE_ERROR';
|
|
238
|
+
connectionId: string;
|
|
239
|
+
};
|
|
240
|
+
export declare type TaskStatusUpdateResponse = {
|
|
241
|
+
status: string;
|
|
242
|
+
message: string;
|
|
243
|
+
error?: string;
|
|
244
|
+
originalError?: unknown;
|
|
245
|
+
};
|
|
208
246
|
//# sourceMappingURL=requests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/types/requests.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/types/requests.ts"],"names":[],"mappings":"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"}
|
package/out/utils/endpoints.d.ts
CHANGED
|
@@ -16,6 +16,11 @@ export declare const ENDPOINTS: {
|
|
|
16
16
|
readonly GET_BY_EXTERNAL_ID: "/users";
|
|
17
17
|
readonly MAPPINGS: "/usermappings";
|
|
18
18
|
};
|
|
19
|
+
readonly ORCHESTRATION: {
|
|
20
|
+
readonly TASK_SCHEDULE: "/task/schedule";
|
|
21
|
+
readonly CHILD_TASK_SCHEDULE: "/scan/{scanId}/taskExecution/{taskExecutionId}/schedule";
|
|
22
|
+
readonly TASK_STATUS_UPDATE: "/scan/{scanId}/taskExecution/{taskExecutionId}/status";
|
|
23
|
+
};
|
|
19
24
|
};
|
|
20
25
|
export declare const STARGATE_BASE = "/graph/connector/{contextAri}";
|
|
21
26
|
export declare const getFullPath: (endpoint: string, stargateBase?: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/utils/endpoints.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/utils/endpoints.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;CA8BZ,CAAC;AAKX,eAAO,MAAM,aAAa,kCAAkC,CAAC;AAM7D,eAAO,MAAM,WAAW,aAAc,MAAM,iBAAgB,MAAM,KAAmB,MAEpF,CAAC"}
|
package/out/utils/endpoints.js
CHANGED
|
@@ -18,6 +18,11 @@ exports.ENDPOINTS = {
|
|
|
18
18
|
DELETE: '/users/bulk',
|
|
19
19
|
GET_BY_EXTERNAL_ID: '/users',
|
|
20
20
|
MAPPINGS: '/usermappings'
|
|
21
|
+
},
|
|
22
|
+
ORCHESTRATION: {
|
|
23
|
+
TASK_SCHEDULE: '/task/schedule',
|
|
24
|
+
CHILD_TASK_SCHEDULE: '/scan/{scanId}/taskExecution/{taskExecutionId}/schedule',
|
|
25
|
+
TASK_STATUS_UPDATE: '/scan/{scanId}/taskExecution/{taskExecutionId}/status'
|
|
21
26
|
}
|
|
22
27
|
};
|
|
23
28
|
exports.STARGATE_BASE = '/graph/connector/{contextAri}';
|
|
@@ -23,4 +23,12 @@ export declare function validateGetUserByExternalIdRequest(externalId: string):
|
|
|
23
23
|
export declare function validateGetGroupByExternalIdRequest(externalId: string): void;
|
|
24
24
|
export declare function validateMapUsersRequest(directMappings: any[]): void;
|
|
25
25
|
export declare function validateDeleteObjectsByPropertiesRequest(properties: Record<string, string>, objectType: string): void;
|
|
26
|
+
export declare function validateStringMaxLength(value: string, fieldName: string, maxLength: number): void;
|
|
27
|
+
export declare function validateNumberRange(value: number, fieldName: string, min: number, max: number): void;
|
|
28
|
+
export declare function validateUUID(value: string, fieldName: string): void;
|
|
29
|
+
export declare function validateTimeUnit(value: string, fieldName: string): void;
|
|
30
|
+
export declare function validateEnumValue(value: string, fieldName: string, allowedValues: string[]): void;
|
|
31
|
+
export declare function validateTaskScheduleRequest(connectionId: string, scheduleInterval: any, task: any): void;
|
|
32
|
+
export declare function validateChildTaskScheduleRequest(connectionId: string, task: any): void;
|
|
33
|
+
export declare function validateTaskStatusUpdateRequest(connectionId: string, status: string, task: any, failureReason?: string): void;
|
|
26
34
|
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
|
package/out/utils/validators.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateDeleteObjectsByPropertiesRequest = exports.validateMapUsersRequest = exports.validateGetGroupByExternalIdRequest = exports.validateGetUserByExternalIdRequest = exports.validateGetObjectByExternalIdRequest = exports.validateDeleteGroupsByExternalIdRequest = exports.validateDeleteUsersByExternalIdRequest = exports.validateDeleteObjectsByExternalIdRequest = exports.validateSetGroupsRequest = exports.validateSetUsersRequest = exports.validateSetObjectsRequest = exports.validatePropertyCount = exports.validateObject = exports.validateRequiredString = exports.validateArrayMaxLength = exports.validateArray = exports.MAX_PROPERTIES_DELETE = exports.MAX_BULK_GROUPS_DELETE = exports.MAX_BULK_USERS_DELETE = exports.MAX_PROPERTIES = exports.MAX_USER_MAPPINGS = exports.MAX_BULK_OBJECTS_DELETE = exports.MAX_BULK_GROUPS = exports.MAX_BULK_USERS = exports.MAX_BULK_OBJECTS = void 0;
|
|
3
|
+
exports.validateTaskStatusUpdateRequest = exports.validateChildTaskScheduleRequest = exports.validateTaskScheduleRequest = exports.validateEnumValue = exports.validateTimeUnit = exports.validateUUID = exports.validateNumberRange = exports.validateStringMaxLength = exports.validateDeleteObjectsByPropertiesRequest = exports.validateMapUsersRequest = exports.validateGetGroupByExternalIdRequest = exports.validateGetUserByExternalIdRequest = exports.validateGetObjectByExternalIdRequest = exports.validateDeleteGroupsByExternalIdRequest = exports.validateDeleteUsersByExternalIdRequest = exports.validateDeleteObjectsByExternalIdRequest = exports.validateSetGroupsRequest = exports.validateSetUsersRequest = exports.validateSetObjectsRequest = exports.validatePropertyCount = exports.validateObject = exports.validateRequiredString = exports.validateArrayMaxLength = exports.validateArray = exports.MAX_PROPERTIES_DELETE = exports.MAX_BULK_GROUPS_DELETE = exports.MAX_BULK_USERS_DELETE = exports.MAX_PROPERTIES = exports.MAX_USER_MAPPINGS = exports.MAX_BULK_OBJECTS_DELETE = exports.MAX_BULK_GROUPS = exports.MAX_BULK_USERS = exports.MAX_BULK_OBJECTS = void 0;
|
|
4
4
|
const errors_1 = require("./errors");
|
|
5
|
+
const uuid_1 = require("uuid");
|
|
5
6
|
exports.MAX_BULK_OBJECTS = 100;
|
|
6
7
|
exports.MAX_BULK_USERS = 100;
|
|
7
8
|
exports.MAX_BULK_GROUPS = 100;
|
|
@@ -121,3 +122,79 @@ function validateDeleteObjectsByPropertiesRequest(properties, objectType) {
|
|
|
121
122
|
validateRequiredString(objectType, 'objectType');
|
|
122
123
|
}
|
|
123
124
|
exports.validateDeleteObjectsByPropertiesRequest = validateDeleteObjectsByPropertiesRequest;
|
|
125
|
+
function validateStringMaxLength(value, fieldName, maxLength) {
|
|
126
|
+
if (value.length > maxLength) {
|
|
127
|
+
throw new errors_1.ForgeTeamWorkGraphValidationError(`${fieldName} must not exceed ${maxLength} characters. Received ${value.length}`, fieldName, { maxLength, actualLength: value.length });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.validateStringMaxLength = validateStringMaxLength;
|
|
131
|
+
function validateNumberRange(value, fieldName, min, max) {
|
|
132
|
+
if (value < min || value > max) {
|
|
133
|
+
throw new errors_1.ForgeTeamWorkGraphValidationError(`${fieldName} must be between ${min} and ${max}. Received ${value}`, fieldName, { min, max, actual: value });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.validateNumberRange = validateNumberRange;
|
|
137
|
+
function validateUUID(value, fieldName) {
|
|
138
|
+
if (!(0, uuid_1.validate)(value)) {
|
|
139
|
+
throw new errors_1.ForgeTeamWorkGraphValidationError(`${fieldName} must be a valid UUID format. Received: ${value}`, fieldName, { value });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.validateUUID = validateUUID;
|
|
143
|
+
function validateTimeUnit(value, fieldName) {
|
|
144
|
+
const validTimeUnits = ['minutes', 'hours', 'days'];
|
|
145
|
+
if (!validTimeUnits.includes(value)) {
|
|
146
|
+
throw new errors_1.ForgeTeamWorkGraphValidationError(`${fieldName} must be one of: ${validTimeUnits.join(', ')}. Received: ${value}`, fieldName, { value, validTimeUnits });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.validateTimeUnit = validateTimeUnit;
|
|
150
|
+
function validateEnumValue(value, fieldName, allowedValues) {
|
|
151
|
+
if (!allowedValues.includes(value)) {
|
|
152
|
+
throw new errors_1.ForgeTeamWorkGraphValidationError(`${fieldName} must be one of: ${allowedValues.join(', ')}. Received: ${value}`, fieldName, { allowedValues, received: value });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.validateEnumValue = validateEnumValue;
|
|
156
|
+
function validateTaskScheduleRequest(connectionId, scheduleInterval, task) {
|
|
157
|
+
validateRequiredString(connectionId, 'connectionId');
|
|
158
|
+
validateObject(scheduleInterval, 'scheduleInterval');
|
|
159
|
+
if (typeof scheduleInterval.value !== 'number' || scheduleInterval.value < 1 || scheduleInterval.value > 60) {
|
|
160
|
+
throw new errors_1.ForgeTeamWorkGraphValidationError('scheduleInterval.value must be between 1 and 60', 'scheduleInterval.value');
|
|
161
|
+
}
|
|
162
|
+
validateTimeUnit(scheduleInterval.timeUnit, 'scheduleInterval.timeUnit');
|
|
163
|
+
validateObject(task, 'task');
|
|
164
|
+
validateRequiredString(task.taskType, 'task.taskType');
|
|
165
|
+
validateStringMaxLength(task.taskType, 'task.taskType', 255);
|
|
166
|
+
validateRequiredString(task.taskId, 'task.taskId');
|
|
167
|
+
validateUUID(task.taskId, 'task.taskId');
|
|
168
|
+
}
|
|
169
|
+
exports.validateTaskScheduleRequest = validateTaskScheduleRequest;
|
|
170
|
+
function validateChildTaskScheduleRequest(connectionId, task) {
|
|
171
|
+
validateRequiredString(connectionId, 'connectionId');
|
|
172
|
+
validateObject(task, 'task');
|
|
173
|
+
validateRequiredString(task.parentTaskId, 'task.parentTaskId');
|
|
174
|
+
validateRequiredString(task.taskType, 'task.taskType');
|
|
175
|
+
validateStringMaxLength(task.taskType, 'task.taskType', 255);
|
|
176
|
+
validateRequiredString(task.taskId, 'task.taskId');
|
|
177
|
+
validateUUID(task.taskId, 'task.taskId');
|
|
178
|
+
}
|
|
179
|
+
exports.validateChildTaskScheduleRequest = validateChildTaskScheduleRequest;
|
|
180
|
+
function validateTaskStatusUpdateRequest(connectionId, status, task, failureReason) {
|
|
181
|
+
validateRequiredString(connectionId, 'connectionId');
|
|
182
|
+
validateEnumValue(status, 'status', ['success', 'failure']);
|
|
183
|
+
validateObject(task, 'task');
|
|
184
|
+
validateRequiredString(task.taskId, 'task.taskId');
|
|
185
|
+
validateUUID(task.taskId, 'task.taskId');
|
|
186
|
+
if (failureReason) {
|
|
187
|
+
const validFailureReasons = [
|
|
188
|
+
'ENTITY_NOT_FOUND',
|
|
189
|
+
'RETRY_LIMIT_EXCEEDED',
|
|
190
|
+
'NON_RETRYABLE_ERROR',
|
|
191
|
+
'UNAUTHORIZED',
|
|
192
|
+
'AUTH_TOKEN_REVOKED',
|
|
193
|
+
'AUTH_TOKEN_EXPIRED',
|
|
194
|
+
'RATE_LIMITED',
|
|
195
|
+
'RETRYABLE_ERROR'
|
|
196
|
+
];
|
|
197
|
+
validateEnumValue(failureReason, 'failureReason', validFailureReasons);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.validateTaskStatusUpdateRequest = validateTaskStatusUpdateRequest;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/teamwork-graph",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.1.0-next.1",
|
|
4
4
|
"description": "Forge TeamworkGraph SDK",
|
|
5
5
|
"author": "Atlassian",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -17,12 +17,14 @@
|
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@types/node": "20.19.1",
|
|
19
19
|
"@types/node-fetch": "^2.6.12",
|
|
20
|
+
"@types/uuid": "^9.0.8",
|
|
20
21
|
"expect-type": "^0.17.3",
|
|
21
22
|
"node-fetch": "2.7.0",
|
|
22
23
|
"jest-when": "^3.6.0"
|
|
23
24
|
},
|
|
24
25
|
"dependencies": {
|
|
25
|
-
"@forge/api": "^6.2.0"
|
|
26
|
+
"@forge/api": "^6.2.1-next.0",
|
|
27
|
+
"uuid": "^9.0.1"
|
|
26
28
|
},
|
|
27
29
|
"publishConfig": {
|
|
28
30
|
"registry": "https://packages.atlassian.com/api/npm/npm-public/"
|