-
Notifications
You must be signed in to change notification settings - Fork 1
/
workflows.ts
72 lines (67 loc) · 3.01 KB
/
workflows.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { mainLog } from './utils/logger.js';
import { ArgumentParser } from './utils/argumentparser.js';
import { ApiClient } from './utils/apiclient.js';
import { writeWorkflowObject } from './utils/csvFile.js';
import { BasicNode, ListResponse, ReleasePackage } from './utils/onshapetypes.js';
import { writeReleasePackage, writeTask } from './utils/csvFile.js';
const LOG = mainLog();
/** Basic response of workflowable object. This is basically a summary */
interface ObjectWorkflow extends BasicNode {
objectType: 'RELEASE' | 'TASK' | 'OBSOLETION';
state: 'PENDING' | 'RELEASED' | 'OBSOLETE' | 'REJECTED' | 'OPEN' | 'COMPLETE' | 'SETUP';
metadataState: 'IN_PROGRESS' | 'PENDING' | 'RELEASED' | 'OBSOLETE' | 'REJECTED';
canBeDiscarded: boolean;
isDiscarded: boolean;
isFrozen: boolean;
/** Extended information about specific type of object like RELEASE or TASK */
href: string;
}
async function findAllWorkflowableObjects(apiClient: ApiClient, companyId: string, objectTypes: string[], states: string[]) {
const queryParams = new URLSearchParams();
objectTypes.forEach(a => queryParams.append('objectTypes', a));
states.forEach(a => queryParams.append('states', a));
let nextBatchUri = `api/workflow/companies/${companyId}/objects?` + queryParams.toString();
let totalCount = 0;
while (nextBatchUri) {
LOG.info(`Calling ${nextBatchUri}`);
const wfResponse = await apiClient.get(nextBatchUri) as ListResponse<ObjectWorkflow>;
if (wfResponse.items) {
totalCount += wfResponse.items.length;
LOG.info(`Found total workflow objects = ${totalCount}`);
for (const wfObject of wfResponse.items) {
try {
if (wfObject.href) {
if (wfObject.objectType === 'RELEASE' || wfObject.objectType === 'OBSOLETION') {
const releasePackage = await apiClient.get(wfObject.href) as ReleasePackage;
wfObject.name = releasePackage.name;
writeReleasePackage(releasePackage);
} else if (wfObject.objectType === 'TASK') {
const task = await apiClient.get(wfObject.href) as BasicNode;
wfObject.name = task.name;
writeTask(task);
}
}
} catch (error) {
LOG.error(`Error fetching ${wfObject.href}`);
}
await writeWorkflowObject(wfObject);
}
}
nextBatchUri = wfResponse.next;
}
}
try {
const stackToUse: string = ArgumentParser.get('stack');
const states: string[] = ArgumentParser.getArray('state');
const objectTypes: string[] = ArgumentParser.getArray('objectType');
const apiClient = await ApiClient.createApiClient(stackToUse);
const companyInfo = await apiClient.findCompanyInfo();
if (!companyInfo.admin) {
throw new Error('Company admin permission required');
}
LOG.info(`Fetching objectTypes=${objectTypes} states=${states}`);
await findAllWorkflowableObjects(apiClient, companyInfo.id, objectTypes, states);
} catch (error) {
console.error(error);
LOG.error('Enumerating all workflow objects failed', error);
}