@cap-js/process 0.0.0 → 0.1.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/LICENSE +201 -0
- package/README.md +635 -0
- package/cds-plugin.js +2 -0
- package/dist/cds-plugin.js +4 -0
- package/dist/cds-plugin.js.map +1 -0
- package/dist/lib/api/index.js +23 -0
- package/dist/lib/api/index.js.map +1 -0
- package/dist/lib/api/local-workflow-store.js +85 -0
- package/dist/lib/api/local-workflow-store.js.map +1 -0
- package/dist/lib/api/process-api-client.js +103 -0
- package/dist/lib/api/process-api-client.js.map +1 -0
- package/dist/lib/api/workflow-client.js +174 -0
- package/dist/lib/api/workflow-client.js.map +1 -0
- package/dist/lib/auth/credentials.js +17 -0
- package/dist/lib/auth/credentials.js.map +1 -0
- package/dist/lib/auth/index.js +11 -0
- package/dist/lib/auth/index.js.map +1 -0
- package/dist/lib/auth/token-cache.js +67 -0
- package/dist/lib/auth/token-cache.js.map +1 -0
- package/dist/lib/auth/token-provider.js +32 -0
- package/dist/lib/auth/token-provider.js.map +1 -0
- package/dist/lib/build/constants.js +106 -0
- package/dist/lib/build/constants.js.map +1 -0
- package/dist/lib/build/index.js +22 -0
- package/dist/lib/build/index.js.map +1 -0
- package/dist/lib/build/plugin.js +126 -0
- package/dist/lib/build/plugin.js.map +1 -0
- package/dist/lib/build/validation-utils.js +309 -0
- package/dist/lib/build/validation-utils.js.map +1 -0
- package/dist/lib/build/validations.js +185 -0
- package/dist/lib/build/validations.js.map +1 -0
- package/dist/lib/constants.js +78 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/handlers/annotationCache.js +47 -0
- package/dist/lib/handlers/annotationCache.js.map +1 -0
- package/dist/lib/handlers/annotationHandlers.js +57 -0
- package/dist/lib/handlers/annotationHandlers.js.map +1 -0
- package/dist/lib/handlers/index.js +26 -0
- package/dist/lib/handlers/index.js.map +1 -0
- package/dist/lib/handlers/onDeleteUtils.js +63 -0
- package/dist/lib/handlers/onDeleteUtils.js.map +1 -0
- package/dist/lib/handlers/processActionHandler.js +55 -0
- package/dist/lib/handlers/processActionHandler.js.map +1 -0
- package/dist/lib/handlers/processCancel.js +28 -0
- package/dist/lib/handlers/processCancel.js.map +1 -0
- package/dist/lib/handlers/processResume.js +28 -0
- package/dist/lib/handlers/processResume.js.map +1 -0
- package/dist/lib/handlers/processService.js +125 -0
- package/dist/lib/handlers/processService.js.map +1 -0
- package/dist/lib/handlers/processStart.js +156 -0
- package/dist/lib/handlers/processStart.js.map +1 -0
- package/dist/lib/handlers/processSuspend.js +28 -0
- package/dist/lib/handlers/processSuspend.js.map +1 -0
- package/dist/lib/handlers/utils.js +124 -0
- package/dist/lib/handlers/utils.js.map +1 -0
- package/dist/lib/index.js +43 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/processImport.js +450 -0
- package/dist/lib/processImport.js.map +1 -0
- package/dist/lib/processImportRegistration.js +27 -0
- package/dist/lib/processImportRegistration.js.map +1 -0
- package/dist/lib/shared/businessKey-helper.js +27 -0
- package/dist/lib/shared/businessKey-helper.js.map +1 -0
- package/dist/lib/shared/input-parser.js +650 -0
- package/dist/lib/shared/input-parser.js.map +1 -0
- package/dist/lib/types/csn-extensions.js +37 -0
- package/dist/lib/types/csn-extensions.js.map +1 -0
- package/dist/srv/BTPProcessService.js +117 -0
- package/dist/srv/BTPProcessService.js.map +1 -0
- package/dist/srv/localProcessService.js +152 -0
- package/dist/srv/localProcessService.js.map +1 -0
- package/package.json +98 -1
- package/srv/BTPProcessService.cds +42 -0
- package/srv/BTPProcessService.js +2 -0
- package/srv/localProcessService.cds +3 -0
- package/srv/localProcessService.js +2 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.localWorkflowStore = exports.LocalWorkflowStore = void 0;
|
|
7
|
+
const workflow_client_1 = require("./workflow-client");
|
|
8
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
9
|
+
class LocalWorkflowStore {
|
|
10
|
+
instances = [];
|
|
11
|
+
startWorkflow(params) {
|
|
12
|
+
const { definitionId, businessKey, context = {} } = params;
|
|
13
|
+
const instance = {
|
|
14
|
+
id: cds_1.default.utils.uuid(),
|
|
15
|
+
definitionId,
|
|
16
|
+
businessKey,
|
|
17
|
+
status: workflow_client_1.WorkflowStatus.RUNNING,
|
|
18
|
+
context,
|
|
19
|
+
attributes: [
|
|
20
|
+
{
|
|
21
|
+
id: 'ExampleCustomAttribute',
|
|
22
|
+
label: 'Example of custom attribute',
|
|
23
|
+
value: 'PRO_247',
|
|
24
|
+
type: 'string',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: 'Cur',
|
|
28
|
+
label: 'Currency',
|
|
29
|
+
value: 'EUR',
|
|
30
|
+
type: 'string',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
outputs: {
|
|
34
|
+
processedBy: 'system-admin',
|
|
35
|
+
completionStatus: 'success',
|
|
36
|
+
},
|
|
37
|
+
createdAt: new Date(),
|
|
38
|
+
updatedAt: new Date(),
|
|
39
|
+
};
|
|
40
|
+
this.instances.push(instance);
|
|
41
|
+
return {
|
|
42
|
+
id: instance.id,
|
|
43
|
+
success: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
getInstancesByBusinessKey(businessKey, status) {
|
|
47
|
+
let filtered = this.instances.filter((i) => i.businessKey === businessKey);
|
|
48
|
+
if (status) {
|
|
49
|
+
filtered = filtered.filter((i) => status.includes(i.status));
|
|
50
|
+
}
|
|
51
|
+
return filtered;
|
|
52
|
+
}
|
|
53
|
+
getInstance(instanceId) {
|
|
54
|
+
return this.instances.find((i) => i.id === instanceId);
|
|
55
|
+
}
|
|
56
|
+
updateStatus(instanceId, status) {
|
|
57
|
+
const instance = this.getInstance(instanceId);
|
|
58
|
+
if (!instance) {
|
|
59
|
+
return {
|
|
60
|
+
id: instanceId,
|
|
61
|
+
success: false,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
instance.status = status;
|
|
65
|
+
instance.updatedAt = new Date();
|
|
66
|
+
return {
|
|
67
|
+
id: instanceId,
|
|
68
|
+
success: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
updateMultipleStatus(instanceIds, status) {
|
|
72
|
+
return instanceIds.map((id) => this.updateStatus(id, status));
|
|
73
|
+
}
|
|
74
|
+
getAttributes(instanceId) {
|
|
75
|
+
const instance = this.getInstance(instanceId);
|
|
76
|
+
return instance?.attributes;
|
|
77
|
+
}
|
|
78
|
+
getOutputs(instanceId) {
|
|
79
|
+
const instance = this.getInstance(instanceId);
|
|
80
|
+
return instance?.outputs;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.LocalWorkflowStore = LocalWorkflowStore;
|
|
84
|
+
exports.localWorkflowStore = new LocalWorkflowStore();
|
|
85
|
+
//# sourceMappingURL=local-workflow-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-workflow-store.js","sourceRoot":"","sources":["../../../lib/api/local-workflow-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fetchProcessHeader = fetchProcessHeader;
|
|
7
|
+
exports.fetchArtifact = fetchArtifact;
|
|
8
|
+
exports.fetchAllDataTypes = fetchAllDataTypes;
|
|
9
|
+
exports.createProcessApiClient = createProcessApiClient;
|
|
10
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
13
|
+
const BASE_PATH = '/public/unified/v1';
|
|
14
|
+
// ============ Implementation Functions ============
|
|
15
|
+
async function fetchJson(url, jwt) {
|
|
16
|
+
LOG.debug('Invoking url: ' + url);
|
|
17
|
+
const response = await fetch(url, {
|
|
18
|
+
method: 'GET',
|
|
19
|
+
headers: { Authorization: `Bearer ${jwt}` },
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
const body = await response.text();
|
|
23
|
+
const errorMessage = `API request failed to fetch JSON: ${body || response.statusText || 'Unknown error'}`;
|
|
24
|
+
throw cds_1.default.error(response.status, errorMessage);
|
|
25
|
+
}
|
|
26
|
+
return response.json();
|
|
27
|
+
}
|
|
28
|
+
async function fetchProcessHeader(serviceUrl, jwt, projectId, processId) {
|
|
29
|
+
const url = `${serviceUrl}${BASE_PATH}/projects/${encodeURIComponent(projectId)}/artifacts/${encodeURIComponent(processId)}`;
|
|
30
|
+
return fetchJson(url, jwt);
|
|
31
|
+
}
|
|
32
|
+
async function fetchArtifact(serviceUrl, jwt, projectId, artifactUid) {
|
|
33
|
+
const url = `${serviceUrl}${BASE_PATH}/projects/${encodeURIComponent(projectId)}/artifacts/${encodeURIComponent(artifactUid)}`;
|
|
34
|
+
return fetchJson(url, jwt);
|
|
35
|
+
}
|
|
36
|
+
async function fetchAllDataTypes(serviceUrl, jwt, projectId, dependencies) {
|
|
37
|
+
const result = [];
|
|
38
|
+
const fetched = new Set();
|
|
39
|
+
let currentBatch = dependencies.filter((d) => {
|
|
40
|
+
if (d.type === 'content') {
|
|
41
|
+
LOG.debug(`Skipping content dependency: ${d.artifactUid}`);
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return !fetched.has(d.artifactUid);
|
|
45
|
+
});
|
|
46
|
+
while (currentBatch.length > 0) {
|
|
47
|
+
currentBatch.forEach((d) => fetched.add(d.artifactUid));
|
|
48
|
+
const fetchPromises = currentBatch.map(async (dep) => {
|
|
49
|
+
try {
|
|
50
|
+
const artifact = await fetchArtifact(serviceUrl, jwt, projectId, dep.artifactUid);
|
|
51
|
+
return { status: 'fulfilled', artifact, dep };
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return { status: 'rejected', error, dep };
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// eslint-disable-next-line no-await-in-loop -- Intentional: must await batch to collect nested dependencies for next iteration
|
|
58
|
+
const responses = await Promise.all(fetchPromises);
|
|
59
|
+
const nextBatch = [];
|
|
60
|
+
for (const response of responses) {
|
|
61
|
+
if (response.status === 'rejected') {
|
|
62
|
+
LOG.warn(`Could not fetch artifact ${response.dep.artifactUid}: ${response.error}`);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const artifact = response.artifact;
|
|
66
|
+
if (artifact.type === 'datatype' || artifact.type === 'bpi.datatype') {
|
|
67
|
+
LOG.debug(`Fetched data type: ${artifact.name}`);
|
|
68
|
+
result.push(artifact);
|
|
69
|
+
artifact.dependencies
|
|
70
|
+
?.filter((d) => !fetched.has(d.artifactUid) && d.type !== 'content')
|
|
71
|
+
.forEach((d) => nextBatch.push(d));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// prepare for next iteration
|
|
75
|
+
currentBatch = [];
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
for (const d of nextBatch) {
|
|
78
|
+
if (!seen.has(d.artifactUid)) {
|
|
79
|
+
seen.add(d.artifactUid);
|
|
80
|
+
currentBatch.push(d);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
// ============ Factory Function ============
|
|
87
|
+
function createProcessApiClient(serviceUrl, getToken) {
|
|
88
|
+
return {
|
|
89
|
+
fetchProcessHeader: async (projectId, processId) => {
|
|
90
|
+
const jwt = await getToken();
|
|
91
|
+
return fetchProcessHeader(serviceUrl, jwt, projectId, processId);
|
|
92
|
+
},
|
|
93
|
+
fetchArtifact: async (projectId, artifactUid) => {
|
|
94
|
+
const jwt = await getToken();
|
|
95
|
+
return fetchArtifact(serviceUrl, jwt, projectId, artifactUid);
|
|
96
|
+
},
|
|
97
|
+
fetchAllDataTypes: async (projectId, dependencies) => {
|
|
98
|
+
const jwt = await getToken();
|
|
99
|
+
return fetchAllDataTypes(serviceUrl, jwt, projectId, dependencies);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=process-api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-api-client.js","sourceRoot":"","sources":["../../../lib/api/process-api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WorkflowStatus = void 0;
|
|
7
|
+
exports.startWorkflow = startWorkflow;
|
|
8
|
+
exports.getWorkflowsByBusinessKey = getWorkflowsByBusinessKey;
|
|
9
|
+
exports.updateWorkflowStatus = updateWorkflowStatus;
|
|
10
|
+
exports.updateMultipleWorkflowStatus = updateMultipleWorkflowStatus;
|
|
11
|
+
exports.getAttributes = getAttributes;
|
|
12
|
+
exports.getOutputs = getOutputs;
|
|
13
|
+
exports.createWorkflowInstanceClient = createWorkflowInstanceClient;
|
|
14
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
15
|
+
const constants_1 = require("../constants");
|
|
16
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
17
|
+
const BASE_PATH = '/public/workflow/rest';
|
|
18
|
+
// ============ Types & Enums ============
|
|
19
|
+
var WorkflowStatus;
|
|
20
|
+
(function (WorkflowStatus) {
|
|
21
|
+
WorkflowStatus["RUNNING"] = "RUNNING";
|
|
22
|
+
WorkflowStatus["SUSPENDED"] = "SUSPENDED";
|
|
23
|
+
WorkflowStatus["CANCELED"] = "CANCELED";
|
|
24
|
+
WorkflowStatus["ERRONEOUS"] = "ERRONEOUS";
|
|
25
|
+
WorkflowStatus["COMPLETED"] = "COMPLETED";
|
|
26
|
+
})(WorkflowStatus || (exports.WorkflowStatus = WorkflowStatus = {}));
|
|
27
|
+
// ============ Implementation Functions ============
|
|
28
|
+
async function startWorkflow(serviceUrl, jwt, definitionId, context) {
|
|
29
|
+
const url = `${serviceUrl}${BASE_PATH}/v1/workflow-instances`;
|
|
30
|
+
LOG.debug('Invoking url: ' + url);
|
|
31
|
+
const res = await fetch(url, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
Authorization: `Bearer ${jwt}`,
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify({ definitionId, context }),
|
|
38
|
+
});
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
const body = await res.text();
|
|
41
|
+
const errorMessage = `Failed to start workflow: ${body || res.statusText || 'Unknown error'}`;
|
|
42
|
+
throw cds_1.default.error(res.status, errorMessage);
|
|
43
|
+
}
|
|
44
|
+
const workflowInstance = await res.json();
|
|
45
|
+
LOG.debug(`Workflow instance started with ID: ${workflowInstance.id}`);
|
|
46
|
+
return { id: workflowInstance.id, success: true };
|
|
47
|
+
}
|
|
48
|
+
async function getWorkflowsByBusinessKey(serviceUrl, jwt, businessKey, status) {
|
|
49
|
+
const encodedBusinessKey = encodeURIComponent(businessKey);
|
|
50
|
+
let queryUrl = `${serviceUrl}${BASE_PATH}/v1/workflow-instances?businessKey=${encodedBusinessKey}`;
|
|
51
|
+
status.forEach((s) => {
|
|
52
|
+
queryUrl += `&status=${s}`;
|
|
53
|
+
});
|
|
54
|
+
LOG.debug('Invoking url: ' + queryUrl);
|
|
55
|
+
const res = await fetch(queryUrl, {
|
|
56
|
+
method: 'GET',
|
|
57
|
+
headers: {
|
|
58
|
+
Authorization: `Bearer ${jwt}`,
|
|
59
|
+
'Content-Type': 'application/json',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
const body = await res.text();
|
|
64
|
+
const errorMessage = `Failed to retrieve workflow instances: ${body || res.statusText || 'Unknown error'}`;
|
|
65
|
+
throw cds_1.default.error(res.status, errorMessage);
|
|
66
|
+
}
|
|
67
|
+
return await res.json();
|
|
68
|
+
}
|
|
69
|
+
async function updateWorkflowStatus(serviceUrl, jwt, instanceId, status, cascade) {
|
|
70
|
+
const url = `${serviceUrl}${BASE_PATH}/v1/workflow-instances/${instanceId}`;
|
|
71
|
+
LOG.debug('Invoking url: ' + url);
|
|
72
|
+
const res = await fetch(url, {
|
|
73
|
+
method: 'PATCH',
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: `Bearer ${jwt}`,
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({ status, cascade }),
|
|
79
|
+
});
|
|
80
|
+
if (!res.ok) {
|
|
81
|
+
const errorBody = await res.text();
|
|
82
|
+
const errorMessage = `Failed to update workflow instance: ${errorBody || res.statusText || 'Unknown error'}`;
|
|
83
|
+
throw cds_1.default.error(res.status, errorMessage);
|
|
84
|
+
}
|
|
85
|
+
return { id: instanceId, success: true };
|
|
86
|
+
}
|
|
87
|
+
async function updateMultipleWorkflowStatus(serviceUrl, jwt, instances, status, cascade) {
|
|
88
|
+
const results = await Promise.all(instances.map((instance) => updateWorkflowStatus(serviceUrl, jwt, instance.id, status, cascade).catch(() => {
|
|
89
|
+
return { id: instance.id, success: false };
|
|
90
|
+
})));
|
|
91
|
+
const successCount = results.filter((r) => r.success).length;
|
|
92
|
+
const failedCount = instances.length - successCount;
|
|
93
|
+
if (failedCount > 0) {
|
|
94
|
+
LOG.warn(`Updated ${successCount}/${instances.length} workflow instances to status ${status}. ${failedCount} failed.`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
LOG.debug(`Successfully updated all ${successCount} workflow instances to status ${status}`);
|
|
98
|
+
}
|
|
99
|
+
return results;
|
|
100
|
+
}
|
|
101
|
+
async function getAttributes(serviceUrl, jwt, instanceId) {
|
|
102
|
+
const url = `${serviceUrl}${BASE_PATH}/v1/workflow-instances/${instanceId}/attributes`;
|
|
103
|
+
LOG.debug('Invoking url: ' + url);
|
|
104
|
+
const res = await fetch(url, {
|
|
105
|
+
method: 'GET',
|
|
106
|
+
headers: {
|
|
107
|
+
Authorization: `Bearer ${jwt}`,
|
|
108
|
+
'Content-Type': 'application/json',
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
const errorBody = await res.text();
|
|
113
|
+
const errorMessage = `Failed to get workflow instance attributes: ${errorBody || res.statusText || 'Unknown error'}`;
|
|
114
|
+
throw cds_1.default.error(res.status, errorMessage);
|
|
115
|
+
}
|
|
116
|
+
const responseText = await res.text();
|
|
117
|
+
if (!responseText || responseText.trim() === '') {
|
|
118
|
+
LOG.debug(`No attributes available for workflow instance ${instanceId}`);
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
return JSON.parse(responseText);
|
|
122
|
+
}
|
|
123
|
+
async function getOutputs(serviceUrl, jwt, instanceId) {
|
|
124
|
+
const url = `${serviceUrl}${BASE_PATH}/v1/workflow-instances/${instanceId}/outputs`;
|
|
125
|
+
LOG.debug('Invoking url: ' + url);
|
|
126
|
+
const res = await fetch(url, {
|
|
127
|
+
method: 'GET',
|
|
128
|
+
headers: {
|
|
129
|
+
Authorization: `Bearer ${jwt}`,
|
|
130
|
+
'Content-Type': 'application/json',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
if (!res.ok) {
|
|
134
|
+
const errorBody = await res.text();
|
|
135
|
+
const errorMessage = `Failed to get workflow instance outputs: ${errorBody || res.statusText || 'Unknown error'}`;
|
|
136
|
+
throw cds_1.default.error(res.status, errorMessage);
|
|
137
|
+
}
|
|
138
|
+
const responseText = await res.text();
|
|
139
|
+
if (!responseText || responseText.trim() === '') {
|
|
140
|
+
LOG.debug(`No outputs available for workflow instance ${instanceId}`);
|
|
141
|
+
return {};
|
|
142
|
+
}
|
|
143
|
+
return JSON.parse(responseText);
|
|
144
|
+
}
|
|
145
|
+
// ============ Factory Function ============
|
|
146
|
+
function createWorkflowInstanceClient(serviceUrl, getToken) {
|
|
147
|
+
return {
|
|
148
|
+
startWorkflow: async (definitionId, context) => {
|
|
149
|
+
const jwt = await getToken();
|
|
150
|
+
return startWorkflow(serviceUrl, jwt, definitionId, context);
|
|
151
|
+
},
|
|
152
|
+
getWorkflowsByBusinessKey: async (businessKey, status) => {
|
|
153
|
+
const jwt = await getToken();
|
|
154
|
+
return getWorkflowsByBusinessKey(serviceUrl, jwt, businessKey, status);
|
|
155
|
+
},
|
|
156
|
+
updateWorkflowStatus: async (instanceId, status, cascade) => {
|
|
157
|
+
const jwt = await getToken();
|
|
158
|
+
return updateWorkflowStatus(serviceUrl, jwt, instanceId, status, cascade);
|
|
159
|
+
},
|
|
160
|
+
updateMultipleWorkflowStatus: async (instances, status, cascade) => {
|
|
161
|
+
const jwt = await getToken();
|
|
162
|
+
return updateMultipleWorkflowStatus(serviceUrl, jwt, instances, status, cascade);
|
|
163
|
+
},
|
|
164
|
+
getAttributes: async (instanceId) => {
|
|
165
|
+
const jwt = await getToken();
|
|
166
|
+
return getAttributes(serviceUrl, jwt, instanceId);
|
|
167
|
+
},
|
|
168
|
+
getOutputs: async (instanceId) => {
|
|
169
|
+
const jwt = await getToken();
|
|
170
|
+
return getOutputs(serviceUrl, jwt, instanceId);
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=workflow-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-client.js","sourceRoot":"","sources":["../../../lib/api/workflow-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getServiceCredentials = void 0;
|
|
7
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
8
|
+
/**
|
|
9
|
+
* Gets service credentials from CDS environment configuration.
|
|
10
|
+
* @param name - The service name to look up
|
|
11
|
+
* @returns The credentials object or undefined if not found
|
|
12
|
+
*/
|
|
13
|
+
const getServiceCredentials = (name) => {
|
|
14
|
+
return cds_1.default?.env?.requires?.[name]?.credentials;
|
|
15
|
+
};
|
|
16
|
+
exports.getServiceCredentials = getServiceCredentials;
|
|
17
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../lib/auth/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,mDAA2B;AAY3B;;;;GAIG;AACI,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAA6B,EAAE;IAC/E,OAAO,aAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;AACjD,CAAC,CAAC;AAFW,QAAA,qBAAqB,yBAEhC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Auth module - centralized authentication utilities
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.createXsuaaTokenProvider = exports.CachingTokenProvider = exports.getServiceCredentials = void 0;
|
|
5
|
+
var credentials_1 = require("./credentials");
|
|
6
|
+
Object.defineProperty(exports, "getServiceCredentials", { enumerable: true, get: function () { return credentials_1.getServiceCredentials; } });
|
|
7
|
+
var token_cache_1 = require("./token-cache");
|
|
8
|
+
Object.defineProperty(exports, "CachingTokenProvider", { enumerable: true, get: function () { return token_cache_1.CachingTokenProvider; } });
|
|
9
|
+
var token_provider_1 = require("./token-provider");
|
|
10
|
+
Object.defineProperty(exports, "createXsuaaTokenProvider", { enumerable: true, get: function () { return token_provider_1.createXsuaaTokenProvider; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/auth/index.ts"],"names":[],"mappings":";AAAA,qDAAqD;;;AAErD,6CAAsD;AAA7C,oHAAA,qBAAqB,OAAA;AAC9B,6CAAqD;AAA5C,mHAAA,oBAAoB,OAAA;AAC7B,mDAAyF;AAAnD,0HAAA,wBAAwB,OAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CachingTokenProvider = void 0;
|
|
7
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
8
|
+
const constants_1 = require("../constants");
|
|
9
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
10
|
+
class CachingTokenProvider {
|
|
11
|
+
cache;
|
|
12
|
+
pendingFetches;
|
|
13
|
+
tokenProvider;
|
|
14
|
+
constructor(tokenProvider) {
|
|
15
|
+
this.cache = new Map();
|
|
16
|
+
this.pendingFetches = new Map();
|
|
17
|
+
this.tokenProvider = tokenProvider;
|
|
18
|
+
}
|
|
19
|
+
async getToken(tenantId) {
|
|
20
|
+
const cacheKey = tenantId ?? 'single-tenant';
|
|
21
|
+
// check cache first
|
|
22
|
+
const cachedToken = this.getCached(cacheKey);
|
|
23
|
+
if (cachedToken) {
|
|
24
|
+
LOG.debug(`Using cached token for tenant: ${cacheKey}`);
|
|
25
|
+
return cachedToken;
|
|
26
|
+
}
|
|
27
|
+
// check if a fetch is already in progress for this tenant
|
|
28
|
+
const pendingFetch = this.pendingFetches.get(cacheKey);
|
|
29
|
+
if (pendingFetch) {
|
|
30
|
+
LOG.debug(`Waiting for pending token fetch for tenant: ${cacheKey}`);
|
|
31
|
+
return pendingFetch;
|
|
32
|
+
}
|
|
33
|
+
// start new fetch and track the promise
|
|
34
|
+
const fetchPromise = this.fetchAndCache(cacheKey, tenantId);
|
|
35
|
+
this.pendingFetches.set(cacheKey, fetchPromise);
|
|
36
|
+
try {
|
|
37
|
+
return await fetchPromise;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
LOG.debug(`Deleting fetch promise from pending fetches for tenant: ${cacheKey}`);
|
|
41
|
+
this.pendingFetches.delete(cacheKey);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
getCached(key) {
|
|
45
|
+
const entry = this.cache.get(key);
|
|
46
|
+
if (!entry) {
|
|
47
|
+
LOG.debug(`No token found for ${key}.`);
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (Date.now() >= entry.expiresAt) {
|
|
51
|
+
this.cache.delete(key);
|
|
52
|
+
LOG.debug(`Token expired for tenant: ${key}`);
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
LOG.debug(`Token retrieved for key: ${key}.`);
|
|
56
|
+
return entry.token;
|
|
57
|
+
}
|
|
58
|
+
async fetchAndCache(cacheKey, tenantId) {
|
|
59
|
+
const { jwt, expires_in } = await this.tokenProvider.fetchToken(tenantId);
|
|
60
|
+
const expiresAt = Date.now() + expires_in * 1000;
|
|
61
|
+
this.cache.set(cacheKey, { token: jwt, expiresAt });
|
|
62
|
+
LOG.debug(`Token fetched and cached for tenant: ${cacheKey}, expires in ${expires_in} seconds.`);
|
|
63
|
+
return jwt;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.CachingTokenProvider = CachingTokenProvider;
|
|
67
|
+
//# sourceMappingURL=token-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-cache.js","sourceRoot":"","sources":["../../../lib/auth/token-cache.ts"],"names":[],"mappings":";;;;;;AAAA,mDAA2B;AAC3B,4CAAqD;AAGrD,MAAM,GAAG,GAAG,aAAG,CAAC,GAAG,CAAC,iCAAqB,CAAC,CAAC;AAO3C,MAAa,oBAAoB;IACvB,KAAK,CAA0B;IAC/B,cAAc,CAA+B;IAC7C,aAAa,CAAiB;IAEtC,YAAY,aAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAiB;QAC9B,MAAM,QAAQ,GAAG,QAAQ,IAAI,eAAe,CAAC;QAE7C,oBAAoB;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;YACxD,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,0DAA0D;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;YACrE,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,wCAAwC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,OAAO,MAAM,YAAY,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,KAAK,CAAC,2DAA2D,QAAQ,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,GAAG,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,4BAA4B,GAAG,GAAG,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,QAAiB;QAC7D,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAgB,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,KAAK,CACP,wCAAwC,QAAQ,gBAAgB,UAAU,WAAW,CACtF,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAlED,oDAkEC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createXsuaaTokenProvider = createXsuaaTokenProvider;
|
|
7
|
+
const xssec_1 = require("@sap/xssec");
|
|
8
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
11
|
+
// ============ XSUAA Implementation ============
|
|
12
|
+
async function fetchXsuaaToken(uaaCredentials, tenantId) {
|
|
13
|
+
const xsuaaService = new xssec_1.XsuaaService(uaaCredentials);
|
|
14
|
+
const { access_token: jwt, expires_in } = await xsuaaService.fetchClientCredentialsToken({
|
|
15
|
+
...(tenantId && { zid: tenantId }),
|
|
16
|
+
});
|
|
17
|
+
if (!jwt) {
|
|
18
|
+
throw new Error('Empty JWT returned from XSUAA authorization service.');
|
|
19
|
+
}
|
|
20
|
+
LOG.debug('XSUAA token fetched successfully');
|
|
21
|
+
return { jwt, expires_in };
|
|
22
|
+
}
|
|
23
|
+
// ============ Factory ============
|
|
24
|
+
function createXsuaaTokenProvider(credentials) {
|
|
25
|
+
if (!credentials?.uaa) {
|
|
26
|
+
throw new Error('Missing UAA credentials for XSUAA token provider.');
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
fetchToken: (tenantId) => fetchXsuaaToken(credentials.uaa, tenantId),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=token-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../../../lib/auth/token-provider.ts"],"names":[],"mappings":";;;;;AA+CA,4DAQC;AAvDD,sCAA0C;AAC1C,mDAA2B;AAC3B,4CAAqD;AASrD,MAAM,GAAG,GAAG,aAAG,CAAC,GAAG,CAAC,iCAAqB,CAAC,CAAC;AAe3C,iDAAiD;AAEjD,KAAK,UAAU,eAAe,CAC5B,cAA8B,EAC9B,QAAiB;IAEjB,MAAM,YAAY,GAAG,IAAI,oBAAY,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC;QACvF,GAAG,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC9C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED,oCAAoC;AAEpC,SAAgB,wBAAwB,CAAC,WAAsC;IAC7E,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,CAAC,QAAiB,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;KAC9E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Build validation message constants.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WARNING_INPUTS_NOT_VALIDATED = exports.WARNING_INPUT_PATH_NOT_IN_ENTITY = exports.ERROR_MISSING_MANDATORY_PROCESS_INPUT = exports.WARNING_MANDATORY_MISMATCH = exports.ERROR_MISSING_PROCESS_INPUT = exports.WARNING_ARRAY_MISMATCH = exports.WARNING_TYPE_MISMATCH = exports.WARNING_ATTRIBUTE_NOT_IN_PROCESS_DEF = exports.ERROR_CASCADE_MUST_BE_BOOLEAN = exports.ERROR_BUSINESS_KEY_REQUIRED = exports.ERROR_ON_REQUIRED = exports.ERROR_ANNOTATION_REQUIRES_OTHER = exports.WARNING_NO_PROCESS_DEFINITION = exports.ERROR_START_ID_MUST_BE_STRING = exports.ERROR_START_ID_REQUIRES_ON = exports.ERROR_START_ON_REQUIRES_ID = exports.ERROR_BUSINESS_KEY_MUST_BE_EXPRESSION = exports.ERROR_IF_MUST_BE_EXPRESSION = exports.ERROR_ANNOTATION_MUST_BE_EVENT_OR_ACTION = exports.ERROR_ANNOTATION_MUST_BE_STRING = exports.WARNING_UNKNOWN_ANNOTATION = void 0;
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Annotation Validation Messages
|
|
9
|
+
// =============================================================================
|
|
10
|
+
const WARNING_UNKNOWN_ANNOTATION = (entityName, key, allowedAnnotations) => {
|
|
11
|
+
return `${entityName}: Unknown annotation '${key}'. Allowed annotations are: ${allowedAnnotations.join(', ')}`;
|
|
12
|
+
};
|
|
13
|
+
exports.WARNING_UNKNOWN_ANNOTATION = WARNING_UNKNOWN_ANNOTATION;
|
|
14
|
+
const ERROR_ANNOTATION_MUST_BE_STRING = (entityName, annotationOn) => {
|
|
15
|
+
return `${entityName}: ${annotationOn} must be a string representing a lifecycle event or action name`;
|
|
16
|
+
};
|
|
17
|
+
exports.ERROR_ANNOTATION_MUST_BE_STRING = ERROR_ANNOTATION_MUST_BE_STRING;
|
|
18
|
+
const ERROR_ANNOTATION_MUST_BE_EVENT_OR_ACTION = (entityName, annotationOn) => {
|
|
19
|
+
return `${entityName}: ${annotationOn} must be either a lifecycle event (CREATE, UPDATE, DELETE) or an action defined on the entity`;
|
|
20
|
+
};
|
|
21
|
+
exports.ERROR_ANNOTATION_MUST_BE_EVENT_OR_ACTION = ERROR_ANNOTATION_MUST_BE_EVENT_OR_ACTION;
|
|
22
|
+
const ERROR_IF_MUST_BE_EXPRESSION = (entityName, annotationIf) => {
|
|
23
|
+
return `${entityName}: ${annotationIf} must be a valid expression`;
|
|
24
|
+
};
|
|
25
|
+
exports.ERROR_IF_MUST_BE_EXPRESSION = ERROR_IF_MUST_BE_EXPRESSION;
|
|
26
|
+
const ERROR_BUSINESS_KEY_MUST_BE_EXPRESSION = (entityName, annotationBKey) => {
|
|
27
|
+
return `${entityName}: ${annotationBKey} must be a valid expression`;
|
|
28
|
+
};
|
|
29
|
+
exports.ERROR_BUSINESS_KEY_MUST_BE_EXPRESSION = ERROR_BUSINESS_KEY_MUST_BE_EXPRESSION;
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Start Annotation Validation Messages
|
|
32
|
+
// =============================================================================
|
|
33
|
+
const ERROR_START_ON_REQUIRES_ID = (entityName, annotationOn, annotationId) => {
|
|
34
|
+
return `${entityName}: ${annotationOn} requires ${annotationId}`;
|
|
35
|
+
};
|
|
36
|
+
exports.ERROR_START_ON_REQUIRES_ID = ERROR_START_ON_REQUIRES_ID;
|
|
37
|
+
const ERROR_START_ID_REQUIRES_ON = (entityName, annotationId, annotationOn) => {
|
|
38
|
+
return `${entityName}: ${annotationId} requires ${annotationOn}`;
|
|
39
|
+
};
|
|
40
|
+
exports.ERROR_START_ID_REQUIRES_ON = ERROR_START_ID_REQUIRES_ON;
|
|
41
|
+
const ERROR_START_ID_MUST_BE_STRING = (entityName, annotationId) => {
|
|
42
|
+
return `${entityName}: ${annotationId} must be a string`;
|
|
43
|
+
};
|
|
44
|
+
exports.ERROR_START_ID_MUST_BE_STRING = ERROR_START_ID_MUST_BE_STRING;
|
|
45
|
+
const WARNING_NO_PROCESS_DEFINITION = (entityName, annotationId, processId) => {
|
|
46
|
+
return `${entityName}: No process definition found for ${annotationId} '${processId}'. Process inputs cannot be validated!`;
|
|
47
|
+
};
|
|
48
|
+
exports.WARNING_NO_PROCESS_DEFINITION = WARNING_NO_PROCESS_DEFINITION;
|
|
49
|
+
// =============================================================================
|
|
50
|
+
// Generic Lifecycle Annotation Validation Messages
|
|
51
|
+
// =============================================================================
|
|
52
|
+
const ERROR_ANNOTATION_REQUIRES_OTHER = (entityName, annotation, requiredAnnotation) => {
|
|
53
|
+
return `${entityName}: ${annotation} requires ${requiredAnnotation}`;
|
|
54
|
+
};
|
|
55
|
+
exports.ERROR_ANNOTATION_REQUIRES_OTHER = ERROR_ANNOTATION_REQUIRES_OTHER;
|
|
56
|
+
const ERROR_ON_REQUIRED = (entityName, annotationPrefix, annotationOn) => {
|
|
57
|
+
return `${entityName}: ${annotationPrefix} requires ${annotationOn} to be defined`;
|
|
58
|
+
};
|
|
59
|
+
exports.ERROR_ON_REQUIRED = ERROR_ON_REQUIRED;
|
|
60
|
+
const ERROR_BUSINESS_KEY_REQUIRED = (entityName, annotationPrefix) => `Entity "${entityName}" must have a business key defined when using the "${annotationPrefix}" annotation.`;
|
|
61
|
+
exports.ERROR_BUSINESS_KEY_REQUIRED = ERROR_BUSINESS_KEY_REQUIRED;
|
|
62
|
+
const ERROR_CASCADE_MUST_BE_BOOLEAN = (entityName, annotationCascade) => {
|
|
63
|
+
return `${entityName}: ${annotationCascade} must be a boolean`;
|
|
64
|
+
};
|
|
65
|
+
exports.ERROR_CASCADE_MUST_BE_BOOLEAN = ERROR_CASCADE_MUST_BE_BOOLEAN;
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// Input Validation Messages
|
|
68
|
+
// =============================================================================
|
|
69
|
+
const WARNING_ATTRIBUTE_NOT_IN_PROCESS_DEF = (entityName, attributeKey, processDefId) => {
|
|
70
|
+
return `${entityName}: Entity attribute '${attributeKey}' is not defined in process definition '${processDefId}'`;
|
|
71
|
+
};
|
|
72
|
+
exports.WARNING_ATTRIBUTE_NOT_IN_PROCESS_DEF = WARNING_ATTRIBUTE_NOT_IN_PROCESS_DEF;
|
|
73
|
+
const WARNING_TYPE_MISMATCH = (entityName, key, entityType, processType) => {
|
|
74
|
+
return `${entityName}: Type mismatch for '${key}': entity has '${entityType}' but process definition expects '${processType}'`;
|
|
75
|
+
};
|
|
76
|
+
exports.WARNING_TYPE_MISMATCH = WARNING_TYPE_MISMATCH;
|
|
77
|
+
const WARNING_ARRAY_MISMATCH = (entityName, key, entityIsArray, processIsArray) => {
|
|
78
|
+
const entityText = entityIsArray ? 'an array' : 'not an array';
|
|
79
|
+
const processText = processIsArray ? 'an array' : 'a single value';
|
|
80
|
+
return `${entityName}: Array mismatch for '${key}': entity is ${entityText} but process definition expects ${processText}`;
|
|
81
|
+
};
|
|
82
|
+
exports.WARNING_ARRAY_MISMATCH = WARNING_ARRAY_MISMATCH;
|
|
83
|
+
const ERROR_MISSING_PROCESS_INPUT = (entityName, processDefId, inputKey) => {
|
|
84
|
+
return `${entityName}: Process definition '${processDefId}' expects input '${inputKey}' but it is not provided by the entity`;
|
|
85
|
+
};
|
|
86
|
+
exports.ERROR_MISSING_PROCESS_INPUT = ERROR_MISSING_PROCESS_INPUT;
|
|
87
|
+
const WARNING_MANDATORY_MISMATCH = (entityName, key, processDefId) => {
|
|
88
|
+
return `${entityName}: Input '${key}' is mandatory in process definition '${processDefId}' but not marked as @mandatory in the entity`;
|
|
89
|
+
};
|
|
90
|
+
exports.WARNING_MANDATORY_MISMATCH = WARNING_MANDATORY_MISMATCH;
|
|
91
|
+
const ERROR_MISSING_MANDATORY_PROCESS_INPUT = (entityName, processDefId, inputKey) => {
|
|
92
|
+
return `${entityName}: Mandatory input '${inputKey}' from process definition '${processDefId}' is missing in the entity`;
|
|
93
|
+
};
|
|
94
|
+
exports.ERROR_MISSING_MANDATORY_PROCESS_INPUT = ERROR_MISSING_MANDATORY_PROCESS_INPUT;
|
|
95
|
+
const WARNING_INPUT_PATH_NOT_IN_ENTITY = (entityName, inputPath) => {
|
|
96
|
+
return `${entityName}: Input path '${inputPath}' does not exist on the entity. If this is a virtual field added at runtime, you can ignore this warning.`;
|
|
97
|
+
};
|
|
98
|
+
exports.WARNING_INPUT_PATH_NOT_IN_ENTITY = WARNING_INPUT_PATH_NOT_IN_ENTITY;
|
|
99
|
+
// =============================================================================
|
|
100
|
+
// Misc Build Warnings
|
|
101
|
+
// =============================================================================
|
|
102
|
+
const WARNING_INPUTS_NOT_VALIDATED = (entityName, processDefId) => {
|
|
103
|
+
return `Inputs for ${entityName} are not validated against process definition ${processDefId}`;
|
|
104
|
+
};
|
|
105
|
+
exports.WARNING_INPUTS_NOT_VALIDATED = WARNING_INPUTS_NOT_VALIDATED;
|
|
106
|
+
//# sourceMappingURL=constants.js.map
|