biz-a-cli 2.3.73 → 2.3.75
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/bin/app.js +23 -0
- package/bin/hub.js +42 -2
- package/bin/hubEvent.js +100 -35
- package/bin/migrate.js +169 -0
- package/callbackController.js +58 -36
- package/db/db.js +37 -0
- package/db/ds.js +189 -0
- package/engine/bpm/routes.js +61 -0
- package/engine/bpm/workflow-runtime.js +1136 -0
- package/engine/bpm/workflow.js +235 -0
- package/envs/env.dev.js +1 -1
- package/migrations/1777727873750__apps.sql +16 -0
- package/migrations/1777727892577__bpm.sql +274 -0
- package/package.json +17 -2
- package/scheduler/datalib.js +266 -182
- package/worker/cliScriptWorker.js +55 -22
- package/worker/cliWorkerPool.js +70 -10
- package/.editorconfig +0 -16
- package/log/debug.log +0 -0
- package/log/error.log +0 -0
- package/log/exception.log +0 -0
- package/log/info.log +0 -0
- package/tests/app.test.js +0 -1208
- package/tests/callback.test.js +0 -42
- package/tests/config.test.js +0 -39
- package/tests/converter.test.js +0 -106
- package/tests/data.test.js +0 -487
- package/tests/deployment.test.js +0 -339
- package/tests/hub.test.js +0 -998
- package/tests/hubPublish.test.js +0 -231
- package/tests/mailCtl.test.js +0 -44
- package/tests/timer.test.js +0 -187
- package/tests/watcher.test.js +0 -352
- package/tests/watcherCtl.test.js +0 -124
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { save as dbSave, queryData, deleteMD } from "../../db/db.js";
|
|
2
|
+
|
|
3
|
+
export async function save(payload) {
|
|
4
|
+
const { id, rawJsonString, apiConfig, userId } = payload;
|
|
5
|
+
const workflowJson =
|
|
6
|
+
typeof rawJsonString === "string"
|
|
7
|
+
? JSON.parse(rawJsonString)
|
|
8
|
+
: rawJsonString;
|
|
9
|
+
|
|
10
|
+
if (
|
|
11
|
+
!workflowJson.workflowKey ||
|
|
12
|
+
!workflowJson.name ||
|
|
13
|
+
!workflowJson.entityType ||
|
|
14
|
+
!workflowJson.initialStateCode
|
|
15
|
+
) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
"Mandatory value must exist: 'workflowKey', 'name', 'entityType', 'initialStateCode'.",
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (
|
|
22
|
+
!workflowJson.status ||
|
|
23
|
+
String(workflowJson.status).toUpperCase() !== "DRAFT"
|
|
24
|
+
) {
|
|
25
|
+
throw new Error(
|
|
26
|
+
"Workflow status must be 'DRAFT' to save. Published or Retired workflows cannot be edited here.",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const minifiedJsonString = JSON.stringify(workflowJson);
|
|
31
|
+
|
|
32
|
+
const dbModel = {
|
|
33
|
+
id: id || null,
|
|
34
|
+
workflow_key: workflowJson.workflowKey,
|
|
35
|
+
version: workflowJson.version || 0,
|
|
36
|
+
name: workflowJson.name,
|
|
37
|
+
entity_type: workflowJson.entityType,
|
|
38
|
+
description: workflowJson.description || "",
|
|
39
|
+
initial_state_code: workflowJson.initialStateCode || "",
|
|
40
|
+
status: "DRAFT",
|
|
41
|
+
definition_json: minifiedJsonString,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
if (!id && userId) {
|
|
45
|
+
dbModel.created_by = parseInt(userId, 10) || null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const result = await dbSave(
|
|
49
|
+
{
|
|
50
|
+
SYS$BPM_WORKFLOW_DEF: dbModel,
|
|
51
|
+
},
|
|
52
|
+
apiConfig,
|
|
53
|
+
);
|
|
54
|
+
return result.data;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function publish(payload) {
|
|
58
|
+
const { id, rawJsonString, apiConfig, userId } = payload;
|
|
59
|
+
const workflowJson =
|
|
60
|
+
typeof rawJsonString === "string"
|
|
61
|
+
? JSON.parse(rawJsonString)
|
|
62
|
+
: rawJsonString;
|
|
63
|
+
|
|
64
|
+
if (
|
|
65
|
+
!workflowJson.workflowKey ||
|
|
66
|
+
!workflowJson.name ||
|
|
67
|
+
!workflowJson.entityType ||
|
|
68
|
+
!workflowJson.initialStateCode
|
|
69
|
+
) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
"Mandatory fields missing: 'workflowKey', 'name', 'entityType', 'initialStateCode'.",
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (
|
|
76
|
+
!workflowJson.status ||
|
|
77
|
+
String(workflowJson.status).toUpperCase() !== "DRAFT"
|
|
78
|
+
) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
"Action Denied: Only 'DRAFT' workflows can be published.",
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const versionQueryParam = {
|
|
85
|
+
length: 1,
|
|
86
|
+
columns: [{ data: "SYS$BPM_WORKFLOW_DEF.VERSION", key: "version" }],
|
|
87
|
+
filter: [
|
|
88
|
+
{
|
|
89
|
+
junction: "",
|
|
90
|
+
column: "SYS$BPM_WORKFLOW_DEF.WORKFLOW_KEY",
|
|
91
|
+
operator: "=",
|
|
92
|
+
value1: `'${workflowJson.workflowKey}'`,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
junction: "AND",
|
|
96
|
+
column: "SYS$BPM_WORKFLOW_DEF.STATUS",
|
|
97
|
+
operator: "=",
|
|
98
|
+
value1: `'PUBLISHED'`,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
order: [{ column: "SYS$BPM_WORKFLOW_DEF.VERSION", dir: "desc" }],
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const versionRes = await queryData(versionQueryParam, apiConfig);
|
|
105
|
+
|
|
106
|
+
let nextVersion = 1;
|
|
107
|
+
if (versionRes && versionRes.length > 0 && versionRes[0].version) {
|
|
108
|
+
nextVersion = parseInt(versionRes[0].version, 10) + 1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
workflowJson.version = nextVersion;
|
|
112
|
+
workflowJson.status = "PUBLISHED";
|
|
113
|
+
|
|
114
|
+
const workflowModel = {
|
|
115
|
+
id: id || null,
|
|
116
|
+
workflow_key: workflowJson.workflowKey,
|
|
117
|
+
version: nextVersion,
|
|
118
|
+
name: workflowJson.name,
|
|
119
|
+
entity_type: workflowJson.entityType,
|
|
120
|
+
description: workflowJson.description || "",
|
|
121
|
+
initial_state_code: workflowJson.initialStateCode,
|
|
122
|
+
status: "PUBLISHED",
|
|
123
|
+
published_by: parseInt(userId, 10) || null,
|
|
124
|
+
definition_json: JSON.stringify(workflowJson),
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
workflowModel["SYS$BPM_STATE_DEF"] = (workflowJson.states || []).map(
|
|
128
|
+
(state, index) => ({
|
|
129
|
+
state_code: state.stateCode,
|
|
130
|
+
label: state.label || state.stateCode,
|
|
131
|
+
task_enabled: state.taskEnabled ? 1 : 0,
|
|
132
|
+
task_name: state.taskName || null,
|
|
133
|
+
assignment_type: state.assignmentType || null,
|
|
134
|
+
assignment_value: state.assignmentValue || null,
|
|
135
|
+
sla_duration_minutes: state.slaDurationMinutes || null,
|
|
136
|
+
timeout_action_type: state.timeoutActionType || null,
|
|
137
|
+
timeout_event_name: state.timeoutEventName || null,
|
|
138
|
+
sort_no: index,
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
workflowModel["SYS$BPM_TRANS_DEF"] = (workflowJson.transitions || []).map(
|
|
143
|
+
(trans, index) => {
|
|
144
|
+
const transObj = {
|
|
145
|
+
transition_code:
|
|
146
|
+
trans.transitionCode ||
|
|
147
|
+
`${trans.fromStateCode}_TO_${trans.toStateCode}_${index}`,
|
|
148
|
+
from_state_code: trans.fromStateCode,
|
|
149
|
+
to_state_code: trans.toStateCode,
|
|
150
|
+
trigger_type: trans.triggerType || "MANUAL",
|
|
151
|
+
label: trans.label,
|
|
152
|
+
guard_type: trans.guardType || null,
|
|
153
|
+
guard_rule_key: trans.guardRuleKey || null,
|
|
154
|
+
sort_no: index,
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
if (trans.roles && trans.roles.length > 0) {
|
|
158
|
+
transObj["SYS$BPM_TRANS_ROLE"] = trans.roles.map((role) => ({
|
|
159
|
+
role_code: role.roleCode,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (trans.effects && trans.effects.length > 0) {
|
|
164
|
+
transObj["SYS$BPM_TRANS_EFFECT_DEF"] = trans.effects.map(
|
|
165
|
+
(effect, effIndex) => ({
|
|
166
|
+
effect_type: effect.effectType,
|
|
167
|
+
event_name: effect.eventName,
|
|
168
|
+
payload_template: effect.payloadTemplate || null,
|
|
169
|
+
sort_no: effIndex,
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
return transObj;
|
|
174
|
+
},
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
const result = await dbSave(
|
|
178
|
+
{ SYS$BPM_WORKFLOW_DEF: workflowModel },
|
|
179
|
+
apiConfig,
|
|
180
|
+
);
|
|
181
|
+
return result.data;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export async function remove(payload) {
|
|
185
|
+
const { id, apiConfig } = payload;
|
|
186
|
+
|
|
187
|
+
if (!id) {
|
|
188
|
+
throw new Error("Action Denied: Workflow ID is required for deletion.");
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const records = await queryData(
|
|
192
|
+
{
|
|
193
|
+
length: 1,
|
|
194
|
+
columns: [{ data: "SYS$BPM_WORKFLOW_DEF.STATUS", key: "status" }],
|
|
195
|
+
filter: [
|
|
196
|
+
{
|
|
197
|
+
junction: "",
|
|
198
|
+
column: "SYS$BPM_WORKFLOW_DEF.ID",
|
|
199
|
+
operator: "=",
|
|
200
|
+
value1: id,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
apiConfig,
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
if (!records || records.length === 0) {
|
|
208
|
+
throw new Error("Action Denied: Workflow definition not found.");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (String(records[0].status).toUpperCase() !== "DRAFT") {
|
|
212
|
+
throw new Error(
|
|
213
|
+
"Action Denied: Only 'DRAFT' workflows can be deleted.",
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const detailTables = [
|
|
218
|
+
"SYS$BPM_STATE_DEF",
|
|
219
|
+
{
|
|
220
|
+
SYS$BPM_TRANS_DEF: [
|
|
221
|
+
"SYS$BPM_TRANS_ROLE",
|
|
222
|
+
"SYS$BPM_TRANS_EFFECT_DEF",
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
|
|
227
|
+
const result = await deleteMD(
|
|
228
|
+
Number(id),
|
|
229
|
+
"SYS$BPM_WORKFLOW_DEF",
|
|
230
|
+
detailTables,
|
|
231
|
+
apiConfig,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
return result.data;
|
|
235
|
+
}
|
package/envs/env.dev.js
CHANGED
|
@@ -6,5 +6,5 @@ export const envDev = {
|
|
|
6
6
|
encodeURIComponent('imm@2019') + '@imm-cdm-dev.rf6wr.mongodb.net/?retryWrites=true&w=majority',
|
|
7
7
|
COMPANY_REGISTER: 'companyregister-dev',
|
|
8
8
|
BIZA_SERVER_LINK: 'https://biz-a-dev-41e7c93a25e5.herokuapp.com',
|
|
9
|
-
BIZA_HUB_SERVER_LINK: 'https://
|
|
9
|
+
BIZA_HUB_SERVER_LINK: 'https://devHub.biz-a.id' // https://biz-a-hub-ed77b066db87.herokuapp.com/
|
|
10
10
|
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- @RunOnlyIfMissing: SYS$APPS
|
|
2
|
+
|
|
3
|
+
EXECUTE BLOCK AS BEGIN
|
|
4
|
+
execute statement 'CREATE SEQUENCE SYS$APPS_GEN;';
|
|
5
|
+
execute statement 'CREATE TABLE SYS$APPS(
|
|
6
|
+
ID integer NOT NULL,
|
|
7
|
+
APPNAME VARCHAR(256) NOT NULL,
|
|
8
|
+
TEMPLATES BLOB SUB_TYPE 0,
|
|
9
|
+
METADATA BLOB SUB_TYPE 0,
|
|
10
|
+
UPDATEAT TIMESTAMP NOT NULL,
|
|
11
|
+
CONSTRAINT PK_SYS$APPS PRIMARY KEY (ID),
|
|
12
|
+
CONSTRAINT UNQ_SYS$APPS UNIQUE (APPNAME)
|
|
13
|
+
);';
|
|
14
|
+
execute statement 'CREATE TRIGGER SYS$APPS_BI FOR SYS$APPS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.id IS NULL) THEN NEW.id = GEN_ID(SYS$APPS_GEN, 1); NEW.UPDATEAT = CURRENT_TIMESTAMP; END';
|
|
15
|
+
execute statement 'CREATE TRIGGER SYS$APPS_BU FOR SYS$APPS ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN NEW.UPDATEAT = CURRENT_TIMESTAMP; END';
|
|
16
|
+
END
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
-- @RunOnlyIfMissing: SYS$BPM_WORKFLOW_DEF
|
|
2
|
+
|
|
3
|
+
EXECUTE BLOCK AS
|
|
4
|
+
BEGIN
|
|
5
|
+
|
|
6
|
+
-- =====================================================================
|
|
7
|
+
-- PART 2: CREATE GENERATORS AND EXCEPTIONS
|
|
8
|
+
-- =====================================================================
|
|
9
|
+
execute statement 'CREATE GENERATOR SYS$BPM_WORKFLOW_DEF_GEN;';
|
|
10
|
+
execute statement 'CREATE GENERATOR SYS$BPM_STATE_DEF_GEN;';
|
|
11
|
+
execute statement 'CREATE GENERATOR SYS$BPM_TRANS_DEF_GEN;';
|
|
12
|
+
execute statement 'CREATE GENERATOR SYS$BPM_TRANS_ROLE_GEN;';
|
|
13
|
+
execute statement 'CREATE GENERATOR SYS$BPM_TRANS_EFFECT_DEF_GEN;';
|
|
14
|
+
execute statement 'CREATE GENERATOR SYS$BPM_WF_INSTANCE_GEN;';
|
|
15
|
+
execute statement 'CREATE GENERATOR SYS$BPM_STATE_HISTORY_GEN;';
|
|
16
|
+
execute statement 'CREATE GENERATOR SYS$BPM_TASK_GEN;';
|
|
17
|
+
execute statement 'CREATE GENERATOR SYS$BPM_TIMER_JOB_GEN;';
|
|
18
|
+
execute statement 'CREATE GENERATOR SYS$BPM_EFFECT_LOG_GEN;';
|
|
19
|
+
|
|
20
|
+
-- Notice the doubled single quotes for the exception message
|
|
21
|
+
execute statement 'CREATE EXCEPTION EXC_ACTIVE_INSTANCE_EXISTS ''Active workflow instance already exists for this entity.'';';
|
|
22
|
+
|
|
23
|
+
-- =====================================================================
|
|
24
|
+
-- PART 3: CREATE TABLES & FOREIGN KEYS
|
|
25
|
+
-- =====================================================================
|
|
26
|
+
execute statement 'CREATE TABLE SYS$BPM_WORKFLOW_DEF (
|
|
27
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
28
|
+
WORKFLOW_KEY VARCHAR(100) NOT NULL,
|
|
29
|
+
NAME VARCHAR(200) NOT NULL,
|
|
30
|
+
ENTITY_TYPE VARCHAR(100) NOT NULL,
|
|
31
|
+
VERSION INTEGER DEFAULT 1 NOT NULL,
|
|
32
|
+
STATUS VARCHAR(20) DEFAULT ''DRAFT'' NOT NULL,
|
|
33
|
+
INITIAL_STATE_CODE VARCHAR(100) NOT NULL,
|
|
34
|
+
DEFINITION_JSON BLOB SUB_TYPE TEXT,
|
|
35
|
+
CREATED_AT TIMESTAMP NOT NULL,
|
|
36
|
+
CREATED_BY INTEGER NOT NULL,
|
|
37
|
+
PUBLISHED_AT TIMESTAMP,
|
|
38
|
+
PUBLISHED_BY INTEGER,
|
|
39
|
+
DESCRIPTION VARCHAR(500)
|
|
40
|
+
);';
|
|
41
|
+
|
|
42
|
+
execute statement 'CREATE TABLE SYS$BPM_STATE_DEF (
|
|
43
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
44
|
+
SYS$BPM_WORKFLOW_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_WORKFLOW_DEF(ID) ON DELETE CASCADE,
|
|
45
|
+
STATE_CODE VARCHAR(100) NOT NULL,
|
|
46
|
+
LABEL VARCHAR(200) NOT NULL,
|
|
47
|
+
IS_TERMINAL SMALLINT DEFAULT 0 NOT NULL,
|
|
48
|
+
TASK_ENABLED SMALLINT DEFAULT 0 NOT NULL,
|
|
49
|
+
TASK_NAME VARCHAR(200),
|
|
50
|
+
ASSIGNMENT_TYPE VARCHAR(20),
|
|
51
|
+
ASSIGNMENT_VALUE VARCHAR(200),
|
|
52
|
+
SLA_DURATION_MINUTES INTEGER,
|
|
53
|
+
TIMEOUT_ACTION_TYPE VARCHAR(30),
|
|
54
|
+
TIMEOUT_EVENT_NAME VARCHAR(100),
|
|
55
|
+
SORT_NO INTEGER DEFAULT 0 NOT NULL
|
|
56
|
+
);';
|
|
57
|
+
|
|
58
|
+
execute statement 'CREATE TABLE SYS$BPM_TRANS_DEF (
|
|
59
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
60
|
+
SYS$BPM_WORKFLOW_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_WORKFLOW_DEF(ID) ON DELETE CASCADE,
|
|
61
|
+
TRANSITION_CODE VARCHAR(100) NOT NULL,
|
|
62
|
+
FROM_STATE_CODE VARCHAR(100) NOT NULL,
|
|
63
|
+
TO_STATE_CODE VARCHAR(100) NOT NULL,
|
|
64
|
+
TRIGGER_TYPE VARCHAR(30) DEFAULT ''MANUAL'' NOT NULL,
|
|
65
|
+
LABEL VARCHAR(100),
|
|
66
|
+
GUARD_TYPE VARCHAR(30),
|
|
67
|
+
GUARD_RULE_KEY VARCHAR(100),
|
|
68
|
+
SORT_NO INTEGER DEFAULT 0 NOT NULL
|
|
69
|
+
);';
|
|
70
|
+
|
|
71
|
+
execute statement 'CREATE TABLE SYS$BPM_TRANS_ROLE (
|
|
72
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
73
|
+
SYS$BPM_TRANS_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_TRANS_DEF(ID) ON DELETE CASCADE,
|
|
74
|
+
ROLE_CODE VARCHAR(100) NOT NULL
|
|
75
|
+
);';
|
|
76
|
+
|
|
77
|
+
execute statement 'CREATE TABLE SYS$BPM_TRANS_EFFECT_DEF (
|
|
78
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
79
|
+
SYS$BPM_TRANS_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_TRANS_DEF(ID) ON DELETE CASCADE,
|
|
80
|
+
EFFECT_TYPE VARCHAR(30) NOT NULL,
|
|
81
|
+
EVENT_NAME VARCHAR(100) NOT NULL,
|
|
82
|
+
PAYLOAD_TEMPLATE BLOB SUB_TYPE TEXT,
|
|
83
|
+
SORT_NO INTEGER DEFAULT 0 NOT NULL
|
|
84
|
+
);';
|
|
85
|
+
|
|
86
|
+
execute statement 'CREATE TABLE SYS$BPM_WF_INSTANCE (
|
|
87
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
88
|
+
SYS$BPM_WORKFLOW_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_WORKFLOW_DEF(ID),
|
|
89
|
+
ENTITY_TYPE VARCHAR(100) NOT NULL,
|
|
90
|
+
ENTITY_ID VARCHAR(100) NOT NULL,
|
|
91
|
+
CURRENT_STATE_CODE VARCHAR(100) NOT NULL,
|
|
92
|
+
STATUS VARCHAR(20) DEFAULT ''ACTIVE'' NOT NULL,
|
|
93
|
+
VERSION_NO INTEGER NOT NULL,
|
|
94
|
+
STARTED_AT TIMESTAMP,
|
|
95
|
+
ENDED_AT TIMESTAMP,
|
|
96
|
+
CREATED_BY INTEGER,
|
|
97
|
+
UPDATED_AT TIMESTAMP
|
|
98
|
+
);';
|
|
99
|
+
|
|
100
|
+
execute statement 'CREATE TABLE SYS$BPM_STATE_HISTORY (
|
|
101
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
102
|
+
SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
|
|
103
|
+
SYS$BPM_TRANS_DEF_ID INTEGER REFERENCES SYS$BPM_TRANS_DEF(ID),
|
|
104
|
+
FROM_STATE_CODE VARCHAR(100),
|
|
105
|
+
TO_STATE_CODE VARCHAR(100) NOT NULL,
|
|
106
|
+
TRIGGER_TYPE VARCHAR(30) NOT NULL,
|
|
107
|
+
ACTOR_TYPE VARCHAR(20) NOT NULL,
|
|
108
|
+
ACTOR_ID INTEGER,
|
|
109
|
+
REQUEST_ID VARCHAR(100),
|
|
110
|
+
CREATED_AT TIMESTAMP
|
|
111
|
+
);';
|
|
112
|
+
|
|
113
|
+
execute statement 'CREATE TABLE SYS$BPM_TASK (
|
|
114
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
115
|
+
SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
|
|
116
|
+
STATE_CODE VARCHAR(100) NOT NULL,
|
|
117
|
+
NAME VARCHAR(200) NOT NULL,
|
|
118
|
+
STATUS VARCHAR(20) DEFAULT ''OPEN'' NOT NULL,
|
|
119
|
+
ASSIGNMENT_TYPE VARCHAR(20),
|
|
120
|
+
ASSIGNMENT_VALUE VARCHAR(200),
|
|
121
|
+
ASSIGNED_USER_ID INTEGER,
|
|
122
|
+
CREATED_AT TIMESTAMP,
|
|
123
|
+
DUE_AT TIMESTAMP,
|
|
124
|
+
SLA_MINUTES INTEGER,
|
|
125
|
+
COMPLETED_AT TIMESTAMP,
|
|
126
|
+
COMPLETED_BY INTEGER,
|
|
127
|
+
CLOSED_REASON VARCHAR(30)
|
|
128
|
+
);';
|
|
129
|
+
|
|
130
|
+
execute statement 'CREATE TABLE SYS$BPM_TIMER_JOB (
|
|
131
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
132
|
+
SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
|
|
133
|
+
SYS$BPM_TASK_ID INTEGER REFERENCES SYS$BPM_TASK(ID) ON DELETE CASCADE,
|
|
134
|
+
STATE_CODE VARCHAR(100) NOT NULL,
|
|
135
|
+
TIMER_TYPE VARCHAR(30) NOT NULL,
|
|
136
|
+
DUE_AT TIMESTAMP,
|
|
137
|
+
SLA_MINUTES INTEGER,
|
|
138
|
+
STATUS VARCHAR(20) DEFAULT ''OPEN'' NOT NULL,
|
|
139
|
+
FIRED_AT TIMESTAMP
|
|
140
|
+
);';
|
|
141
|
+
|
|
142
|
+
execute statement 'CREATE TABLE SYS$BPM_EFFECT_LOG (
|
|
143
|
+
ID INTEGER NOT NULL PRIMARY KEY,
|
|
144
|
+
SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
|
|
145
|
+
SYS$BPM_TRANS_DEF_ID INTEGER REFERENCES SYS$BPM_TRANS_DEF(ID),
|
|
146
|
+
EFFECT_TYPE VARCHAR(30) NOT NULL,
|
|
147
|
+
EVENT_NAME VARCHAR(100) NOT NULL,
|
|
148
|
+
PAYLOAD_EVALUATED BLOB SUB_TYPE TEXT,
|
|
149
|
+
STATUS VARCHAR(20) DEFAULT ''PENDING'' NOT NULL,
|
|
150
|
+
RETRY_COUNT INTEGER DEFAULT 0 NOT NULL,
|
|
151
|
+
CREATED_AT TIMESTAMP,
|
|
152
|
+
EXECUTED_AT TIMESTAMP,
|
|
153
|
+
ERROR_MESSAGE BLOB SUB_TYPE TEXT
|
|
154
|
+
);';
|
|
155
|
+
|
|
156
|
+
-- =====================================================================
|
|
157
|
+
-- PART 4: TRIGGERS
|
|
158
|
+
-- =====================================================================
|
|
159
|
+
-- ALL single quotes inside the trigger body MUST be doubled
|
|
160
|
+
|
|
161
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_WF_DEF_BIU FOR SYS$BPM_WORKFLOW_DEF
|
|
162
|
+
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
|
|
163
|
+
AS BEGIN
|
|
164
|
+
IF (INSERTING) THEN BEGIN
|
|
165
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_WORKFLOW_DEF_GEN, 1);
|
|
166
|
+
IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
|
|
167
|
+
END
|
|
168
|
+
IF (UPDATING) THEN BEGIN
|
|
169
|
+
IF (NEW.STATUS = ''PUBLISHED'' AND OLD.STATUS <> ''PUBLISHED'') THEN BEGIN
|
|
170
|
+
NEW.PUBLISHED_AT = CURRENT_TIMESTAMP;
|
|
171
|
+
END
|
|
172
|
+
END
|
|
173
|
+
END';
|
|
174
|
+
|
|
175
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_STATE_DEF_BI FOR SYS$BPM_STATE_DEF
|
|
176
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
177
|
+
AS BEGIN
|
|
178
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_STATE_DEF_GEN, 1);
|
|
179
|
+
END';
|
|
180
|
+
|
|
181
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_TRANS_DEF_BI FOR SYS$BPM_TRANS_DEF
|
|
182
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
183
|
+
AS BEGIN
|
|
184
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TRANS_DEF_GEN, 1);
|
|
185
|
+
END';
|
|
186
|
+
|
|
187
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_TRANS_ROLE_BI FOR SYS$BPM_TRANS_ROLE
|
|
188
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
189
|
+
AS BEGIN
|
|
190
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TRANS_ROLE_GEN, 1);
|
|
191
|
+
END';
|
|
192
|
+
|
|
193
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_TRANS_EFF_BI FOR SYS$BPM_TRANS_EFFECT_DEF
|
|
194
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
195
|
+
AS BEGIN
|
|
196
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TRANS_EFFECT_DEF_GEN, 1);
|
|
197
|
+
END';
|
|
198
|
+
|
|
199
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_WF_INST_BIU FOR SYS$BPM_WF_INSTANCE
|
|
200
|
+
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
|
|
201
|
+
AS
|
|
202
|
+
DECLARE VARIABLE active_count INTEGER;
|
|
203
|
+
BEGIN
|
|
204
|
+
IF (INSERTING AND NEW.ID IS NULL) THEN
|
|
205
|
+
NEW.ID = GEN_ID(SYS$BPM_WF_INSTANCE_GEN, 1);
|
|
206
|
+
IF (INSERTING AND NEW.STARTED_AT IS NULL) THEN
|
|
207
|
+
NEW.STARTED_AT = CURRENT_TIMESTAMP;
|
|
208
|
+
NEW.UPDATED_AT = CURRENT_TIMESTAMP;
|
|
209
|
+
|
|
210
|
+
IF (NEW.STATUS = ''ACTIVE'') THEN BEGIN
|
|
211
|
+
SELECT COUNT(*) FROM SYS$BPM_WF_INSTANCE
|
|
212
|
+
WHERE ENTITY_TYPE = NEW.ENTITY_TYPE
|
|
213
|
+
AND ENTITY_ID = NEW.ENTITY_ID
|
|
214
|
+
AND STATUS = ''ACTIVE''
|
|
215
|
+
AND ID <> COALESCE(NEW.ID, 0)
|
|
216
|
+
INTO :active_count;
|
|
217
|
+
IF (active_count > 0) THEN EXCEPTION EXC_ACTIVE_INSTANCE_EXISTS;
|
|
218
|
+
END
|
|
219
|
+
|
|
220
|
+
IF (UPDATING AND NEW.STATUS IN (''COMPLETED'', ''TERMINATED'') AND OLD.STATUS NOT IN (''COMPLETED'', ''TERMINATED'')) THEN BEGIN
|
|
221
|
+
NEW.ENDED_AT = CURRENT_TIMESTAMP;
|
|
222
|
+
END
|
|
223
|
+
END';
|
|
224
|
+
|
|
225
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_ST_HIST_BI FOR SYS$BPM_STATE_HISTORY
|
|
226
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
227
|
+
AS BEGIN
|
|
228
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_STATE_HISTORY_GEN, 1);
|
|
229
|
+
IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
|
|
230
|
+
END';
|
|
231
|
+
|
|
232
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_TASK_BIU FOR SYS$BPM_TASK
|
|
233
|
+
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
|
|
234
|
+
AS BEGIN
|
|
235
|
+
IF (INSERTING) THEN BEGIN
|
|
236
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TASK_GEN, 1);
|
|
237
|
+
IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
|
|
238
|
+
|
|
239
|
+
IF (NEW.DUE_AT IS NULL AND NEW.SLA_MINUTES IS NOT NULL AND NEW.SLA_MINUTES > 0) THEN
|
|
240
|
+
BEGIN
|
|
241
|
+
NEW.DUE_AT = DATEADD(minute, NEW.SLA_MINUTES, CURRENT_TIMESTAMP);
|
|
242
|
+
END
|
|
243
|
+
END
|
|
244
|
+
IF (UPDATING) THEN BEGIN
|
|
245
|
+
IF (NEW.STATUS = ''DONE'' AND OLD.STATUS <> ''DONE'') THEN BEGIN
|
|
246
|
+
NEW.COMPLETED_AT = CURRENT_TIMESTAMP;
|
|
247
|
+
END
|
|
248
|
+
END
|
|
249
|
+
END';
|
|
250
|
+
|
|
251
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_TIMER_JOB_BI FOR SYS$BPM_TIMER_JOB
|
|
252
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
253
|
+
AS BEGIN
|
|
254
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TIMER_JOB_GEN, 1);
|
|
255
|
+
|
|
256
|
+
IF (NEW.SYS$BPM_WF_INSTANCE_ID IS NULL AND NEW.SYS$BPM_TASK_ID IS NOT NULL) THEN
|
|
257
|
+
BEGIN
|
|
258
|
+
NEW.SYS$BPM_WF_INSTANCE_ID = (SELECT SYS$BPM_WF_INSTANCE_ID FROM SYS$BPM_TASK WHERE ID = NEW.SYS$BPM_TASK_ID);
|
|
259
|
+
END
|
|
260
|
+
|
|
261
|
+
IF (NEW.DUE_AT IS NULL AND NEW.SLA_MINUTES IS NOT NULL AND NEW.SLA_MINUTES > 0) THEN
|
|
262
|
+
BEGIN
|
|
263
|
+
NEW.DUE_AT = DATEADD(minute, NEW.SLA_MINUTES, CURRENT_TIMESTAMP);
|
|
264
|
+
END
|
|
265
|
+
END';
|
|
266
|
+
|
|
267
|
+
execute statement 'CREATE TRIGGER TRG_SYS$BPM_EFF_LOG_BI FOR SYS$BPM_EFFECT_LOG
|
|
268
|
+
ACTIVE BEFORE INSERT POSITION 0
|
|
269
|
+
AS BEGIN
|
|
270
|
+
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_EFFECT_LOG_GEN, 1);
|
|
271
|
+
IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
|
|
272
|
+
END';
|
|
273
|
+
|
|
274
|
+
END
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "biz-a-cli",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.75",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "bin/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -8,6 +8,20 @@
|
|
|
8
8
|
"node": ">=20.16.0",
|
|
9
9
|
"npm": ">=10.8.1"
|
|
10
10
|
},
|
|
11
|
+
"files": [
|
|
12
|
+
"bin/**/*",
|
|
13
|
+
"db/**/*",
|
|
14
|
+
"engine/**/*",
|
|
15
|
+
"envs/**/*",
|
|
16
|
+
"key/**/*",
|
|
17
|
+
"migrations/**/*",
|
|
18
|
+
"scheduler/**/*",
|
|
19
|
+
"worker/**/*",
|
|
20
|
+
"callbackController.js",
|
|
21
|
+
"mailController.js",
|
|
22
|
+
"proxyController.js",
|
|
23
|
+
"readme.md"
|
|
24
|
+
],
|
|
11
25
|
"scripts": {
|
|
12
26
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch a",
|
|
13
27
|
"testOnce": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
@@ -47,7 +61,8 @@
|
|
|
47
61
|
},
|
|
48
62
|
"devDependencies": {
|
|
49
63
|
"jest": "^29.7.0",
|
|
50
|
-
"prettier": "^3.0.0"
|
|
64
|
+
"prettier": "^3.0.0",
|
|
65
|
+
"supertest": "^7.2.2"
|
|
51
66
|
},
|
|
52
67
|
"jest": {
|
|
53
68
|
"transform": {},
|