@contractspec/example.workflow-system 3.8.8 → 3.8.10
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/dist/approval/approval.enum.js +1 -22
- package/dist/approval/approval.event.js +1 -112
- package/dist/approval/approval.operations.js +1 -369
- package/dist/approval/approval.schema.js +1 -73
- package/dist/approval/index.js +1 -484
- package/dist/browser/approval/approval.enum.js +1 -22
- package/dist/browser/approval/approval.event.js +1 -112
- package/dist/browser/approval/approval.operations.js +1 -369
- package/dist/browser/approval/approval.schema.js +1 -73
- package/dist/browser/approval/index.js +1 -484
- package/dist/browser/docs/index.js +5 -49
- package/dist/browser/docs/workflow-system.docblock.js +5 -49
- package/dist/browser/entities/approval.js +1 -119
- package/dist/browser/entities/index.js +1 -508
- package/dist/browser/entities/instance.js +1 -161
- package/dist/browser/entities/step.js +1 -124
- package/dist/browser/entities/workflow.js +1 -82
- package/dist/browser/example.js +1 -42
- package/dist/browser/handlers/index.js +8 -253
- package/dist/browser/handlers/workflow.handlers.js +8 -253
- package/dist/browser/index.js +13 -3524
- package/dist/browser/instance/index.js +1 -677
- package/dist/browser/instance/instance.enum.js +1 -15
- package/dist/browser/instance/instance.event.js +1 -164
- package/dist/browser/instance/instance.handler.js +1 -356
- package/dist/browser/instance/instance.operations.js +1 -9
- package/dist/browser/instance/instance.schema.js +1 -101
- package/dist/browser/presentations/index.js +1 -109
- package/dist/browser/seeders/index.js +1 -3
- package/dist/browser/shared/demo-scenario.js +1 -213
- package/dist/browser/shared/index.js +1 -3
- package/dist/browser/shared/mock-data.js +1 -11
- package/dist/browser/state-machine/index.js +1 -6
- package/dist/browser/tests/operations.test-spec.js +1 -6
- package/dist/browser/ui/WorkflowDashboard.js +1 -3
- package/dist/browser/ui/WorkflowDashboard.visualizations.js +1 -239
- package/dist/browser/ui/hooks/index.js +1 -3
- package/dist/browser/ui/hooks/useWorkflowList.js +1 -52
- package/dist/browser/ui/index.js +1 -56
- package/dist/browser/ui/renderers/index.js +5 -562
- package/dist/browser/ui/renderers/workflow.markdown.js +5 -562
- package/dist/browser/visualizations/catalog.js +1 -132
- package/dist/browser/visualizations/index.js +1 -133
- package/dist/browser/visualizations/selectors.js +1 -195
- package/dist/browser/workflow/index.js +1 -21
- package/dist/browser/workflow/workflow.enum.js +1 -36
- package/dist/browser/workflow/workflow.event.js +1 -6
- package/dist/browser/workflow/workflow.handler.js +1 -5
- package/dist/browser/workflow/workflow.operations.js +1 -8
- package/dist/browser/workflow/workflow.schema.js +1 -151
- package/dist/browser/workflow-system.capability.js +1 -5
- package/dist/browser/workflow-system.feature.js +1 -3
- package/dist/docs/index.js +5 -49
- package/dist/docs/workflow-system.docblock.js +5 -49
- package/dist/entities/approval.js +1 -119
- package/dist/entities/index.js +1 -508
- package/dist/entities/instance.js +1 -161
- package/dist/entities/step.js +1 -124
- package/dist/entities/workflow.js +1 -82
- package/dist/example.js +1 -42
- package/dist/handlers/index.js +8 -253
- package/dist/handlers/workflow.handlers.js +8 -253
- package/dist/index.js +13 -3524
- package/dist/instance/index.js +1 -677
- package/dist/instance/instance.enum.js +1 -15
- package/dist/instance/instance.event.js +1 -164
- package/dist/instance/instance.handler.js +1 -356
- package/dist/instance/instance.operations.js +1 -9
- package/dist/instance/instance.schema.js +1 -101
- package/dist/presentations/index.js +1 -109
- package/dist/seeders/index.js +1 -3
- package/dist/shared/demo-scenario.js +1 -213
- package/dist/shared/index.js +1 -3
- package/dist/shared/mock-data.js +1 -11
- package/dist/state-machine/index.js +1 -6
- package/dist/tests/operations.test-spec.js +1 -6
- package/dist/ui/WorkflowDashboard.js +1 -3
- package/dist/ui/WorkflowDashboard.visualizations.js +1 -239
- package/dist/ui/hooks/index.js +1 -3
- package/dist/ui/hooks/useWorkflowList.js +1 -52
- package/dist/ui/index.js +1 -56
- package/dist/ui/renderers/index.js +5 -562
- package/dist/ui/renderers/workflow.markdown.js +5 -562
- package/dist/visualizations/catalog.js +1 -132
- package/dist/visualizations/index.js +1 -133
- package/dist/visualizations/selectors.js +1 -195
- package/dist/workflow/index.js +1 -21
- package/dist/workflow/workflow.enum.js +1 -36
- package/dist/workflow/workflow.event.js +1 -6
- package/dist/workflow/workflow.handler.js +1 -5
- package/dist/workflow/workflow.operations.js +1 -8
- package/dist/workflow/workflow.schema.js +1 -151
- package/dist/workflow-system.capability.js +1 -5
- package/dist/workflow-system.feature.js +1 -3
- package/package.json +11 -11
|
@@ -1,253 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
name: row.name,
|
|
10
|
-
description: row.description ?? undefined,
|
|
11
|
-
type: row.type,
|
|
12
|
-
status: row.status,
|
|
13
|
-
createdAt: new Date(row.createdAt),
|
|
14
|
-
updatedAt: new Date(row.updatedAt)
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function rowToStep(row) {
|
|
18
|
-
return {
|
|
19
|
-
id: row.id,
|
|
20
|
-
definitionId: row.definitionId,
|
|
21
|
-
name: row.name,
|
|
22
|
-
description: row.description ?? undefined,
|
|
23
|
-
stepOrder: row.stepOrder,
|
|
24
|
-
type: row.type,
|
|
25
|
-
requiredRoles: row.requiredRoles ? JSON.parse(row.requiredRoles) : [],
|
|
26
|
-
autoApproveCondition: row.autoApproveCondition ?? undefined,
|
|
27
|
-
timeoutHours: row.timeoutHours ?? undefined,
|
|
28
|
-
createdAt: new Date(row.createdAt)
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function rowToInstance(row) {
|
|
32
|
-
return {
|
|
33
|
-
id: row.id,
|
|
34
|
-
projectId: row.projectId,
|
|
35
|
-
definitionId: row.definitionId,
|
|
36
|
-
status: row.status,
|
|
37
|
-
currentStepId: row.currentStepId ?? undefined,
|
|
38
|
-
data: row.data ? JSON.parse(row.data) : undefined,
|
|
39
|
-
requestedBy: row.requestedBy,
|
|
40
|
-
startedAt: new Date(row.startedAt),
|
|
41
|
-
completedAt: row.completedAt ? new Date(row.completedAt) : undefined
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
function rowToApproval(row) {
|
|
45
|
-
return {
|
|
46
|
-
id: row.id,
|
|
47
|
-
instanceId: row.instanceId,
|
|
48
|
-
stepId: row.stepId,
|
|
49
|
-
status: row.status,
|
|
50
|
-
actorId: row.actorId ?? undefined,
|
|
51
|
-
comment: row.comment ?? undefined,
|
|
52
|
-
decidedAt: row.decidedAt ? new Date(row.decidedAt) : undefined,
|
|
53
|
-
createdAt: new Date(row.createdAt)
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
function createWorkflowHandlers(db) {
|
|
57
|
-
function normalizeSql(sql) {
|
|
58
|
-
let placeholderIndex = 0;
|
|
59
|
-
return sql.replace(/\?/g, () => `$${++placeholderIndex}`);
|
|
60
|
-
}
|
|
61
|
-
async function queryRows(sql, params = []) {
|
|
62
|
-
return (await db.query(normalizeSql(sql), params)).rows;
|
|
63
|
-
}
|
|
64
|
-
async function execute(sql, params = []) {
|
|
65
|
-
await db.execute(normalizeSql(sql), params);
|
|
66
|
-
}
|
|
67
|
-
async function listDefinitions(input) {
|
|
68
|
-
const { projectId, status, search, limit = 20, offset = 0 } = input;
|
|
69
|
-
let whereClause = 'WHERE "projectId" = ?';
|
|
70
|
-
const params = [projectId];
|
|
71
|
-
if (status && status !== "all") {
|
|
72
|
-
whereClause += " AND status = ?";
|
|
73
|
-
params.push(status);
|
|
74
|
-
}
|
|
75
|
-
if (search) {
|
|
76
|
-
whereClause += " AND name LIKE ?";
|
|
77
|
-
params.push(`%${search}%`);
|
|
78
|
-
}
|
|
79
|
-
const countResult = await queryRows(`SELECT COUNT(*) as count FROM workflow_definition ${whereClause}`, params);
|
|
80
|
-
const total = countResult[0]?.count ?? 0;
|
|
81
|
-
const rows = await queryRows(`SELECT * FROM workflow_definition ${whereClause} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`, [...params, limit, offset]);
|
|
82
|
-
return {
|
|
83
|
-
definitions: rows.map(rowToDefinition),
|
|
84
|
-
total
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
async function createDefinition(input, context) {
|
|
88
|
-
const id = generateId("wfdef");
|
|
89
|
-
const now = new Date().toISOString();
|
|
90
|
-
await execute(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
91
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
92
|
-
id,
|
|
93
|
-
context.projectId,
|
|
94
|
-
context.organizationId,
|
|
95
|
-
input.name,
|
|
96
|
-
input.description ?? null,
|
|
97
|
-
input.type ?? "APPROVAL",
|
|
98
|
-
"DRAFT",
|
|
99
|
-
now,
|
|
100
|
-
now
|
|
101
|
-
]);
|
|
102
|
-
const rows = await queryRows(`SELECT * FROM workflow_definition WHERE id = ?`, [id]);
|
|
103
|
-
return rowToDefinition(rows[0]);
|
|
104
|
-
}
|
|
105
|
-
async function addStep(input) {
|
|
106
|
-
const id = generateId("wfstep");
|
|
107
|
-
const now = new Date().toISOString();
|
|
108
|
-
const maxOrderResult = await queryRows(`SELECT MAX("stepOrder") as maxOrder FROM workflow_step WHERE "definitionId" = ?`, [input.definitionId]);
|
|
109
|
-
const nextOrder = (maxOrderResult[0]?.maxOrder ?? 0) + 1;
|
|
110
|
-
await execute(`INSERT INTO workflow_step (id, "definitionId", name, description, "stepOrder", type, "requiredRoles", "autoApproveCondition", "timeoutHours", "createdAt")
|
|
111
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
112
|
-
id,
|
|
113
|
-
input.definitionId,
|
|
114
|
-
input.name,
|
|
115
|
-
input.description ?? null,
|
|
116
|
-
nextOrder,
|
|
117
|
-
input.type ?? "APPROVAL",
|
|
118
|
-
JSON.stringify(input.requiredRoles),
|
|
119
|
-
input.autoApproveCondition ?? null,
|
|
120
|
-
input.timeoutHours ?? null,
|
|
121
|
-
now
|
|
122
|
-
]);
|
|
123
|
-
const rows = await queryRows(`SELECT * FROM workflow_step WHERE id = ?`, [id]);
|
|
124
|
-
return rowToStep(rows[0]);
|
|
125
|
-
}
|
|
126
|
-
async function getSteps(definitionId) {
|
|
127
|
-
const rows = await queryRows(`SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder"`, [definitionId]);
|
|
128
|
-
return rows.map(rowToStep);
|
|
129
|
-
}
|
|
130
|
-
async function listInstances(input) {
|
|
131
|
-
const {
|
|
132
|
-
projectId,
|
|
133
|
-
definitionId,
|
|
134
|
-
status,
|
|
135
|
-
requestedBy,
|
|
136
|
-
limit = 20,
|
|
137
|
-
offset = 0
|
|
138
|
-
} = input;
|
|
139
|
-
let whereClause = 'WHERE "projectId" = ?';
|
|
140
|
-
const params = [projectId];
|
|
141
|
-
if (definitionId) {
|
|
142
|
-
whereClause += ' AND "definitionId" = ?';
|
|
143
|
-
params.push(definitionId);
|
|
144
|
-
}
|
|
145
|
-
if (status && status !== "all") {
|
|
146
|
-
whereClause += " AND status = ?";
|
|
147
|
-
params.push(status);
|
|
148
|
-
}
|
|
149
|
-
if (requestedBy) {
|
|
150
|
-
whereClause += ' AND "requestedBy" = ?';
|
|
151
|
-
params.push(requestedBy);
|
|
152
|
-
}
|
|
153
|
-
const countResult = await queryRows(`SELECT COUNT(*) as count FROM workflow_instance ${whereClause}`, params);
|
|
154
|
-
const total = countResult[0]?.count ?? 0;
|
|
155
|
-
const rows = await queryRows(`SELECT * FROM workflow_instance ${whereClause} ORDER BY "startedAt" DESC LIMIT ? OFFSET ?`, [...params, limit, offset]);
|
|
156
|
-
return {
|
|
157
|
-
instances: rows.map(rowToInstance),
|
|
158
|
-
total
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
async function startInstance(input, context) {
|
|
162
|
-
const id = generateId("wfinst");
|
|
163
|
-
const now = new Date().toISOString();
|
|
164
|
-
const steps = await queryRows(`SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder" LIMIT 1`, [input.definitionId]);
|
|
165
|
-
const firstStepId = steps[0]?.id ?? null;
|
|
166
|
-
await execute(`INSERT INTO workflow_instance (id, "projectId", "definitionId", status, "currentStepId", data, "requestedBy", "startedAt")
|
|
167
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
168
|
-
id,
|
|
169
|
-
context.projectId,
|
|
170
|
-
input.definitionId,
|
|
171
|
-
firstStepId ? "IN_PROGRESS" : "PENDING",
|
|
172
|
-
firstStepId,
|
|
173
|
-
input.data ? JSON.stringify(input.data) : null,
|
|
174
|
-
context.requestedBy,
|
|
175
|
-
now
|
|
176
|
-
]);
|
|
177
|
-
if (firstStepId) {
|
|
178
|
-
await execute(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
179
|
-
VALUES (?, ?, ?, ?, ?)`, [generateId("wfappr"), id, firstStepId, "PENDING", now]);
|
|
180
|
-
}
|
|
181
|
-
const rows = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [id]);
|
|
182
|
-
return rowToInstance(rows[0]);
|
|
183
|
-
}
|
|
184
|
-
async function approveStep(input, context) {
|
|
185
|
-
const now = new Date().toISOString();
|
|
186
|
-
const instances = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
187
|
-
if (!instances[0]) {
|
|
188
|
-
throw new Error("NOT_FOUND");
|
|
189
|
-
}
|
|
190
|
-
const instance = instances[0];
|
|
191
|
-
await execute(`UPDATE workflow_approval SET status = 'APPROVED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
192
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`, [
|
|
193
|
-
context.actorId,
|
|
194
|
-
input.comment ?? null,
|
|
195
|
-
now,
|
|
196
|
-
input.instanceId,
|
|
197
|
-
instance.currentStepId
|
|
198
|
-
]);
|
|
199
|
-
const currentStep = await queryRows(`SELECT * FROM workflow_step WHERE id = ?`, [instance.currentStepId]);
|
|
200
|
-
const nextSteps = await queryRows(`SELECT * FROM workflow_step WHERE "definitionId" = ? AND "stepOrder" > ? ORDER BY "stepOrder" LIMIT 1`, [instance.definitionId, currentStep[0]?.stepOrder ?? 0]);
|
|
201
|
-
if (nextSteps[0]) {
|
|
202
|
-
await execute(`UPDATE workflow_instance SET "currentStepId" = ? WHERE id = ?`, [nextSteps[0].id, input.instanceId]);
|
|
203
|
-
await execute(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
204
|
-
VALUES (?, ?, ?, ?, ?)`, [
|
|
205
|
-
generateId("wfappr"),
|
|
206
|
-
input.instanceId,
|
|
207
|
-
nextSteps[0].id,
|
|
208
|
-
"PENDING",
|
|
209
|
-
now
|
|
210
|
-
]);
|
|
211
|
-
} else {
|
|
212
|
-
await execute(`UPDATE workflow_instance SET status = 'COMPLETED', "currentStepId" = NULL, "completedAt" = ? WHERE id = ?`, [now, input.instanceId]);
|
|
213
|
-
}
|
|
214
|
-
const updated = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
215
|
-
return rowToInstance(updated[0]);
|
|
216
|
-
}
|
|
217
|
-
async function rejectStep(input, context) {
|
|
218
|
-
const now = new Date().toISOString();
|
|
219
|
-
const instances = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
220
|
-
if (!instances[0]) {
|
|
221
|
-
throw new Error("NOT_FOUND");
|
|
222
|
-
}
|
|
223
|
-
await execute(`UPDATE workflow_approval SET status = 'REJECTED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
224
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`, [
|
|
225
|
-
context.actorId,
|
|
226
|
-
input.reason,
|
|
227
|
-
now,
|
|
228
|
-
input.instanceId,
|
|
229
|
-
instances[0].currentStepId
|
|
230
|
-
]);
|
|
231
|
-
await execute(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`, [now, input.instanceId]);
|
|
232
|
-
const updated = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
233
|
-
return rowToInstance(updated[0]);
|
|
234
|
-
}
|
|
235
|
-
async function getApprovals(instanceId) {
|
|
236
|
-
const rows = await queryRows(`SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"`, [instanceId]);
|
|
237
|
-
return rows.map(rowToApproval);
|
|
238
|
-
}
|
|
239
|
-
return {
|
|
240
|
-
listDefinitions,
|
|
241
|
-
createDefinition,
|
|
242
|
-
addStep,
|
|
243
|
-
getSteps,
|
|
244
|
-
listInstances,
|
|
245
|
-
startInstance,
|
|
246
|
-
approveStep,
|
|
247
|
-
rejectStep,
|
|
248
|
-
getApprovals
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
export {
|
|
252
|
-
createWorkflowHandlers
|
|
253
|
-
};
|
|
1
|
+
import{web as g}from"@contractspec/lib.runtime-sandbox";var{generateId:U}=g;function Z(k){return{id:k.id,projectId:k.projectId,organizationId:k.organizationId,name:k.name,description:k.description??void 0,type:k.type,status:k.status,createdAt:new Date(k.createdAt),updatedAt:new Date(k.updatedAt)}}function _(k){return{id:k.id,definitionId:k.definitionId,name:k.name,description:k.description??void 0,stepOrder:k.stepOrder,type:k.type,requiredRoles:k.requiredRoles?JSON.parse(k.requiredRoles):[],autoApproveCondition:k.autoApproveCondition??void 0,timeoutHours:k.timeoutHours??void 0,createdAt:new Date(k.createdAt)}}function V(k){return{id:k.id,projectId:k.projectId,definitionId:k.definitionId,status:k.status,currentStepId:k.currentStepId??void 0,data:k.data?JSON.parse(k.data):void 0,requestedBy:k.requestedBy,startedAt:new Date(k.startedAt),completedAt:k.completedAt?new Date(k.completedAt):void 0}}function C(k){return{id:k.id,instanceId:k.instanceId,stepId:k.stepId,status:k.status,actorId:k.actorId??void 0,comment:k.comment??void 0,decidedAt:k.decidedAt?new Date(k.decidedAt):void 0,createdAt:new Date(k.createdAt)}}function f(k){function W(E){let F=0;return E.replace(/\?/g,()=>`$${++F}`)}async function J(E,F=[]){return(await k.query(W(E),F)).rows}async function P(E,F=[]){await k.execute(W(E),F)}async function $(E){let{projectId:F,status:G,search:H,limit:K=20,offset:L=0}=E,M='WHERE "projectId" = ?',N=[F];if(G&&G!=="all")M+=" AND status = ?",N.push(G);if(H)M+=" AND name LIKE ?",N.push(`%${H}%`);let X=(await J(`SELECT COUNT(*) as count FROM workflow_definition ${M}`,N))[0]?.count??0;return{definitions:(await J(`SELECT * FROM workflow_definition ${M} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`,[...N,K,L])).map(Z),total:X}}async function O(E,F){let G=U("wfdef"),H=new Date().toISOString();await P(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[G,F.projectId,F.organizationId,E.name,E.description??null,E.type??"APPROVAL","DRAFT",H,H]);let K=await J("SELECT * FROM workflow_definition WHERE id = ?",[G]);return Z(K[0])}async function z(E){let F=U("wfstep"),G=new Date().toISOString(),K=((await J('SELECT MAX("stepOrder") as maxOrder FROM workflow_step WHERE "definitionId" = ?',[E.definitionId]))[0]?.maxOrder??0)+1;await P(`INSERT INTO workflow_step (id, "definitionId", name, description, "stepOrder", type, "requiredRoles", "autoApproveCondition", "timeoutHours", "createdAt")
|
|
3
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[F,E.definitionId,E.name,E.description??null,K,E.type??"APPROVAL",JSON.stringify(E.requiredRoles),E.autoApproveCondition??null,E.timeoutHours??null,G]);let L=await J("SELECT * FROM workflow_step WHERE id = ?",[F]);return _(L[0])}async function A(E){return(await J('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder"',[E])).map(_)}async function B(E){let{projectId:F,definitionId:G,status:H,requestedBy:K,limit:L=20,offset:M=0}=E,N='WHERE "projectId" = ?',Q=[F];if(G)N+=' AND "definitionId" = ?',Q.push(G);if(H&&H!=="all")N+=" AND status = ?",Q.push(H);if(K)N+=' AND "requestedBy" = ?',Q.push(K);let Y=(await J(`SELECT COUNT(*) as count FROM workflow_instance ${N}`,Q))[0]?.count??0;return{instances:(await J(`SELECT * FROM workflow_instance ${N} ORDER BY "startedAt" DESC LIMIT ? OFFSET ?`,[...Q,L,M])).map(V),total:Y}}async function j(E,F){let G=U("wfinst"),H=new Date().toISOString(),L=(await J('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder" LIMIT 1',[E.definitionId]))[0]?.id??null;if(await P(`INSERT INTO workflow_instance (id, "projectId", "definitionId", status, "currentStepId", data, "requestedBy", "startedAt")
|
|
4
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[G,F.projectId,E.definitionId,L?"IN_PROGRESS":"PENDING",L,E.data?JSON.stringify(E.data):null,F.requestedBy,H]),L)await P(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
5
|
+
VALUES (?, ?, ?, ?, ?)`,[U("wfappr"),G,L,"PENDING",H]);let M=await J("SELECT * FROM workflow_instance WHERE id = ?",[G]);return V(M[0])}async function v(E,F){let G=new Date().toISOString(),H=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);if(!H[0])throw Error("NOT_FOUND");let K=H[0];await P(`UPDATE workflow_approval SET status = 'APPROVED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
6
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,E.comment??null,G,E.instanceId,K.currentStepId]);let L=await J("SELECT * FROM workflow_step WHERE id = ?",[K.currentStepId]),M=await J('SELECT * FROM workflow_step WHERE "definitionId" = ? AND "stepOrder" > ? ORDER BY "stepOrder" LIMIT 1',[K.definitionId,L[0]?.stepOrder??0]);if(M[0])await P('UPDATE workflow_instance SET "currentStepId" = ? WHERE id = ?',[M[0].id,E.instanceId]),await P(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
7
|
+
VALUES (?, ?, ?, ?, ?)`,[U("wfappr"),E.instanceId,M[0].id,"PENDING",G]);else await P(`UPDATE workflow_instance SET status = 'COMPLETED', "currentStepId" = NULL, "completedAt" = ? WHERE id = ?`,[G,E.instanceId]);let N=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);return V(N[0])}async function D(E,F){let G=new Date().toISOString(),H=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);if(!H[0])throw Error("NOT_FOUND");await P(`UPDATE workflow_approval SET status = 'REJECTED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
8
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,E.reason,G,E.instanceId,H[0].currentStepId]),await P(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`,[G,E.instanceId]);let K=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);return V(K[0])}async function b(E){return(await J('SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"',[E])).map(C)}return{listDefinitions:$,createDefinition:O,addStep:z,getSteps:A,listInstances:B,startInstance:j,approveStep:v,rejectStep:D,getApprovals:b}}export{f as createWorkflowHandlers};
|
|
@@ -1,253 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
name: row.name,
|
|
10
|
-
description: row.description ?? undefined,
|
|
11
|
-
type: row.type,
|
|
12
|
-
status: row.status,
|
|
13
|
-
createdAt: new Date(row.createdAt),
|
|
14
|
-
updatedAt: new Date(row.updatedAt)
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function rowToStep(row) {
|
|
18
|
-
return {
|
|
19
|
-
id: row.id,
|
|
20
|
-
definitionId: row.definitionId,
|
|
21
|
-
name: row.name,
|
|
22
|
-
description: row.description ?? undefined,
|
|
23
|
-
stepOrder: row.stepOrder,
|
|
24
|
-
type: row.type,
|
|
25
|
-
requiredRoles: row.requiredRoles ? JSON.parse(row.requiredRoles) : [],
|
|
26
|
-
autoApproveCondition: row.autoApproveCondition ?? undefined,
|
|
27
|
-
timeoutHours: row.timeoutHours ?? undefined,
|
|
28
|
-
createdAt: new Date(row.createdAt)
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function rowToInstance(row) {
|
|
32
|
-
return {
|
|
33
|
-
id: row.id,
|
|
34
|
-
projectId: row.projectId,
|
|
35
|
-
definitionId: row.definitionId,
|
|
36
|
-
status: row.status,
|
|
37
|
-
currentStepId: row.currentStepId ?? undefined,
|
|
38
|
-
data: row.data ? JSON.parse(row.data) : undefined,
|
|
39
|
-
requestedBy: row.requestedBy,
|
|
40
|
-
startedAt: new Date(row.startedAt),
|
|
41
|
-
completedAt: row.completedAt ? new Date(row.completedAt) : undefined
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
function rowToApproval(row) {
|
|
45
|
-
return {
|
|
46
|
-
id: row.id,
|
|
47
|
-
instanceId: row.instanceId,
|
|
48
|
-
stepId: row.stepId,
|
|
49
|
-
status: row.status,
|
|
50
|
-
actorId: row.actorId ?? undefined,
|
|
51
|
-
comment: row.comment ?? undefined,
|
|
52
|
-
decidedAt: row.decidedAt ? new Date(row.decidedAt) : undefined,
|
|
53
|
-
createdAt: new Date(row.createdAt)
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
function createWorkflowHandlers(db) {
|
|
57
|
-
function normalizeSql(sql) {
|
|
58
|
-
let placeholderIndex = 0;
|
|
59
|
-
return sql.replace(/\?/g, () => `$${++placeholderIndex}`);
|
|
60
|
-
}
|
|
61
|
-
async function queryRows(sql, params = []) {
|
|
62
|
-
return (await db.query(normalizeSql(sql), params)).rows;
|
|
63
|
-
}
|
|
64
|
-
async function execute(sql, params = []) {
|
|
65
|
-
await db.execute(normalizeSql(sql), params);
|
|
66
|
-
}
|
|
67
|
-
async function listDefinitions(input) {
|
|
68
|
-
const { projectId, status, search, limit = 20, offset = 0 } = input;
|
|
69
|
-
let whereClause = 'WHERE "projectId" = ?';
|
|
70
|
-
const params = [projectId];
|
|
71
|
-
if (status && status !== "all") {
|
|
72
|
-
whereClause += " AND status = ?";
|
|
73
|
-
params.push(status);
|
|
74
|
-
}
|
|
75
|
-
if (search) {
|
|
76
|
-
whereClause += " AND name LIKE ?";
|
|
77
|
-
params.push(`%${search}%`);
|
|
78
|
-
}
|
|
79
|
-
const countResult = await queryRows(`SELECT COUNT(*) as count FROM workflow_definition ${whereClause}`, params);
|
|
80
|
-
const total = countResult[0]?.count ?? 0;
|
|
81
|
-
const rows = await queryRows(`SELECT * FROM workflow_definition ${whereClause} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`, [...params, limit, offset]);
|
|
82
|
-
return {
|
|
83
|
-
definitions: rows.map(rowToDefinition),
|
|
84
|
-
total
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
async function createDefinition(input, context) {
|
|
88
|
-
const id = generateId("wfdef");
|
|
89
|
-
const now = new Date().toISOString();
|
|
90
|
-
await execute(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
91
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
92
|
-
id,
|
|
93
|
-
context.projectId,
|
|
94
|
-
context.organizationId,
|
|
95
|
-
input.name,
|
|
96
|
-
input.description ?? null,
|
|
97
|
-
input.type ?? "APPROVAL",
|
|
98
|
-
"DRAFT",
|
|
99
|
-
now,
|
|
100
|
-
now
|
|
101
|
-
]);
|
|
102
|
-
const rows = await queryRows(`SELECT * FROM workflow_definition WHERE id = ?`, [id]);
|
|
103
|
-
return rowToDefinition(rows[0]);
|
|
104
|
-
}
|
|
105
|
-
async function addStep(input) {
|
|
106
|
-
const id = generateId("wfstep");
|
|
107
|
-
const now = new Date().toISOString();
|
|
108
|
-
const maxOrderResult = await queryRows(`SELECT MAX("stepOrder") as maxOrder FROM workflow_step WHERE "definitionId" = ?`, [input.definitionId]);
|
|
109
|
-
const nextOrder = (maxOrderResult[0]?.maxOrder ?? 0) + 1;
|
|
110
|
-
await execute(`INSERT INTO workflow_step (id, "definitionId", name, description, "stepOrder", type, "requiredRoles", "autoApproveCondition", "timeoutHours", "createdAt")
|
|
111
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
112
|
-
id,
|
|
113
|
-
input.definitionId,
|
|
114
|
-
input.name,
|
|
115
|
-
input.description ?? null,
|
|
116
|
-
nextOrder,
|
|
117
|
-
input.type ?? "APPROVAL",
|
|
118
|
-
JSON.stringify(input.requiredRoles),
|
|
119
|
-
input.autoApproveCondition ?? null,
|
|
120
|
-
input.timeoutHours ?? null,
|
|
121
|
-
now
|
|
122
|
-
]);
|
|
123
|
-
const rows = await queryRows(`SELECT * FROM workflow_step WHERE id = ?`, [id]);
|
|
124
|
-
return rowToStep(rows[0]);
|
|
125
|
-
}
|
|
126
|
-
async function getSteps(definitionId) {
|
|
127
|
-
const rows = await queryRows(`SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder"`, [definitionId]);
|
|
128
|
-
return rows.map(rowToStep);
|
|
129
|
-
}
|
|
130
|
-
async function listInstances(input) {
|
|
131
|
-
const {
|
|
132
|
-
projectId,
|
|
133
|
-
definitionId,
|
|
134
|
-
status,
|
|
135
|
-
requestedBy,
|
|
136
|
-
limit = 20,
|
|
137
|
-
offset = 0
|
|
138
|
-
} = input;
|
|
139
|
-
let whereClause = 'WHERE "projectId" = ?';
|
|
140
|
-
const params = [projectId];
|
|
141
|
-
if (definitionId) {
|
|
142
|
-
whereClause += ' AND "definitionId" = ?';
|
|
143
|
-
params.push(definitionId);
|
|
144
|
-
}
|
|
145
|
-
if (status && status !== "all") {
|
|
146
|
-
whereClause += " AND status = ?";
|
|
147
|
-
params.push(status);
|
|
148
|
-
}
|
|
149
|
-
if (requestedBy) {
|
|
150
|
-
whereClause += ' AND "requestedBy" = ?';
|
|
151
|
-
params.push(requestedBy);
|
|
152
|
-
}
|
|
153
|
-
const countResult = await queryRows(`SELECT COUNT(*) as count FROM workflow_instance ${whereClause}`, params);
|
|
154
|
-
const total = countResult[0]?.count ?? 0;
|
|
155
|
-
const rows = await queryRows(`SELECT * FROM workflow_instance ${whereClause} ORDER BY "startedAt" DESC LIMIT ? OFFSET ?`, [...params, limit, offset]);
|
|
156
|
-
return {
|
|
157
|
-
instances: rows.map(rowToInstance),
|
|
158
|
-
total
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
async function startInstance(input, context) {
|
|
162
|
-
const id = generateId("wfinst");
|
|
163
|
-
const now = new Date().toISOString();
|
|
164
|
-
const steps = await queryRows(`SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder" LIMIT 1`, [input.definitionId]);
|
|
165
|
-
const firstStepId = steps[0]?.id ?? null;
|
|
166
|
-
await execute(`INSERT INTO workflow_instance (id, "projectId", "definitionId", status, "currentStepId", data, "requestedBy", "startedAt")
|
|
167
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
168
|
-
id,
|
|
169
|
-
context.projectId,
|
|
170
|
-
input.definitionId,
|
|
171
|
-
firstStepId ? "IN_PROGRESS" : "PENDING",
|
|
172
|
-
firstStepId,
|
|
173
|
-
input.data ? JSON.stringify(input.data) : null,
|
|
174
|
-
context.requestedBy,
|
|
175
|
-
now
|
|
176
|
-
]);
|
|
177
|
-
if (firstStepId) {
|
|
178
|
-
await execute(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
179
|
-
VALUES (?, ?, ?, ?, ?)`, [generateId("wfappr"), id, firstStepId, "PENDING", now]);
|
|
180
|
-
}
|
|
181
|
-
const rows = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [id]);
|
|
182
|
-
return rowToInstance(rows[0]);
|
|
183
|
-
}
|
|
184
|
-
async function approveStep(input, context) {
|
|
185
|
-
const now = new Date().toISOString();
|
|
186
|
-
const instances = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
187
|
-
if (!instances[0]) {
|
|
188
|
-
throw new Error("NOT_FOUND");
|
|
189
|
-
}
|
|
190
|
-
const instance = instances[0];
|
|
191
|
-
await execute(`UPDATE workflow_approval SET status = 'APPROVED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
192
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`, [
|
|
193
|
-
context.actorId,
|
|
194
|
-
input.comment ?? null,
|
|
195
|
-
now,
|
|
196
|
-
input.instanceId,
|
|
197
|
-
instance.currentStepId
|
|
198
|
-
]);
|
|
199
|
-
const currentStep = await queryRows(`SELECT * FROM workflow_step WHERE id = ?`, [instance.currentStepId]);
|
|
200
|
-
const nextSteps = await queryRows(`SELECT * FROM workflow_step WHERE "definitionId" = ? AND "stepOrder" > ? ORDER BY "stepOrder" LIMIT 1`, [instance.definitionId, currentStep[0]?.stepOrder ?? 0]);
|
|
201
|
-
if (nextSteps[0]) {
|
|
202
|
-
await execute(`UPDATE workflow_instance SET "currentStepId" = ? WHERE id = ?`, [nextSteps[0].id, input.instanceId]);
|
|
203
|
-
await execute(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
204
|
-
VALUES (?, ?, ?, ?, ?)`, [
|
|
205
|
-
generateId("wfappr"),
|
|
206
|
-
input.instanceId,
|
|
207
|
-
nextSteps[0].id,
|
|
208
|
-
"PENDING",
|
|
209
|
-
now
|
|
210
|
-
]);
|
|
211
|
-
} else {
|
|
212
|
-
await execute(`UPDATE workflow_instance SET status = 'COMPLETED', "currentStepId" = NULL, "completedAt" = ? WHERE id = ?`, [now, input.instanceId]);
|
|
213
|
-
}
|
|
214
|
-
const updated = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
215
|
-
return rowToInstance(updated[0]);
|
|
216
|
-
}
|
|
217
|
-
async function rejectStep(input, context) {
|
|
218
|
-
const now = new Date().toISOString();
|
|
219
|
-
const instances = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
220
|
-
if (!instances[0]) {
|
|
221
|
-
throw new Error("NOT_FOUND");
|
|
222
|
-
}
|
|
223
|
-
await execute(`UPDATE workflow_approval SET status = 'REJECTED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
224
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`, [
|
|
225
|
-
context.actorId,
|
|
226
|
-
input.reason,
|
|
227
|
-
now,
|
|
228
|
-
input.instanceId,
|
|
229
|
-
instances[0].currentStepId
|
|
230
|
-
]);
|
|
231
|
-
await execute(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`, [now, input.instanceId]);
|
|
232
|
-
const updated = await queryRows(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId]);
|
|
233
|
-
return rowToInstance(updated[0]);
|
|
234
|
-
}
|
|
235
|
-
async function getApprovals(instanceId) {
|
|
236
|
-
const rows = await queryRows(`SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"`, [instanceId]);
|
|
237
|
-
return rows.map(rowToApproval);
|
|
238
|
-
}
|
|
239
|
-
return {
|
|
240
|
-
listDefinitions,
|
|
241
|
-
createDefinition,
|
|
242
|
-
addStep,
|
|
243
|
-
getSteps,
|
|
244
|
-
listInstances,
|
|
245
|
-
startInstance,
|
|
246
|
-
approveStep,
|
|
247
|
-
rejectStep,
|
|
248
|
-
getApprovals
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
export {
|
|
252
|
-
createWorkflowHandlers
|
|
253
|
-
};
|
|
1
|
+
import{web as g}from"@contractspec/lib.runtime-sandbox";var{generateId:U}=g;function Z(k){return{id:k.id,projectId:k.projectId,organizationId:k.organizationId,name:k.name,description:k.description??void 0,type:k.type,status:k.status,createdAt:new Date(k.createdAt),updatedAt:new Date(k.updatedAt)}}function _(k){return{id:k.id,definitionId:k.definitionId,name:k.name,description:k.description??void 0,stepOrder:k.stepOrder,type:k.type,requiredRoles:k.requiredRoles?JSON.parse(k.requiredRoles):[],autoApproveCondition:k.autoApproveCondition??void 0,timeoutHours:k.timeoutHours??void 0,createdAt:new Date(k.createdAt)}}function V(k){return{id:k.id,projectId:k.projectId,definitionId:k.definitionId,status:k.status,currentStepId:k.currentStepId??void 0,data:k.data?JSON.parse(k.data):void 0,requestedBy:k.requestedBy,startedAt:new Date(k.startedAt),completedAt:k.completedAt?new Date(k.completedAt):void 0}}function C(k){return{id:k.id,instanceId:k.instanceId,stepId:k.stepId,status:k.status,actorId:k.actorId??void 0,comment:k.comment??void 0,decidedAt:k.decidedAt?new Date(k.decidedAt):void 0,createdAt:new Date(k.createdAt)}}function f(k){function W(E){let F=0;return E.replace(/\?/g,()=>`$${++F}`)}async function J(E,F=[]){return(await k.query(W(E),F)).rows}async function P(E,F=[]){await k.execute(W(E),F)}async function $(E){let{projectId:F,status:G,search:H,limit:K=20,offset:L=0}=E,M='WHERE "projectId" = ?',N=[F];if(G&&G!=="all")M+=" AND status = ?",N.push(G);if(H)M+=" AND name LIKE ?",N.push(`%${H}%`);let X=(await J(`SELECT COUNT(*) as count FROM workflow_definition ${M}`,N))[0]?.count??0;return{definitions:(await J(`SELECT * FROM workflow_definition ${M} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`,[...N,K,L])).map(Z),total:X}}async function O(E,F){let G=U("wfdef"),H=new Date().toISOString();await P(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[G,F.projectId,F.organizationId,E.name,E.description??null,E.type??"APPROVAL","DRAFT",H,H]);let K=await J("SELECT * FROM workflow_definition WHERE id = ?",[G]);return Z(K[0])}async function z(E){let F=U("wfstep"),G=new Date().toISOString(),K=((await J('SELECT MAX("stepOrder") as maxOrder FROM workflow_step WHERE "definitionId" = ?',[E.definitionId]))[0]?.maxOrder??0)+1;await P(`INSERT INTO workflow_step (id, "definitionId", name, description, "stepOrder", type, "requiredRoles", "autoApproveCondition", "timeoutHours", "createdAt")
|
|
3
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[F,E.definitionId,E.name,E.description??null,K,E.type??"APPROVAL",JSON.stringify(E.requiredRoles),E.autoApproveCondition??null,E.timeoutHours??null,G]);let L=await J("SELECT * FROM workflow_step WHERE id = ?",[F]);return _(L[0])}async function A(E){return(await J('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder"',[E])).map(_)}async function B(E){let{projectId:F,definitionId:G,status:H,requestedBy:K,limit:L=20,offset:M=0}=E,N='WHERE "projectId" = ?',Q=[F];if(G)N+=' AND "definitionId" = ?',Q.push(G);if(H&&H!=="all")N+=" AND status = ?",Q.push(H);if(K)N+=' AND "requestedBy" = ?',Q.push(K);let Y=(await J(`SELECT COUNT(*) as count FROM workflow_instance ${N}`,Q))[0]?.count??0;return{instances:(await J(`SELECT * FROM workflow_instance ${N} ORDER BY "startedAt" DESC LIMIT ? OFFSET ?`,[...Q,L,M])).map(V),total:Y}}async function j(E,F){let G=U("wfinst"),H=new Date().toISOString(),L=(await J('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder" LIMIT 1',[E.definitionId]))[0]?.id??null;if(await P(`INSERT INTO workflow_instance (id, "projectId", "definitionId", status, "currentStepId", data, "requestedBy", "startedAt")
|
|
4
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[G,F.projectId,E.definitionId,L?"IN_PROGRESS":"PENDING",L,E.data?JSON.stringify(E.data):null,F.requestedBy,H]),L)await P(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
5
|
+
VALUES (?, ?, ?, ?, ?)`,[U("wfappr"),G,L,"PENDING",H]);let M=await J("SELECT * FROM workflow_instance WHERE id = ?",[G]);return V(M[0])}async function v(E,F){let G=new Date().toISOString(),H=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);if(!H[0])throw Error("NOT_FOUND");let K=H[0];await P(`UPDATE workflow_approval SET status = 'APPROVED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
6
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,E.comment??null,G,E.instanceId,K.currentStepId]);let L=await J("SELECT * FROM workflow_step WHERE id = ?",[K.currentStepId]),M=await J('SELECT * FROM workflow_step WHERE "definitionId" = ? AND "stepOrder" > ? ORDER BY "stepOrder" LIMIT 1',[K.definitionId,L[0]?.stepOrder??0]);if(M[0])await P('UPDATE workflow_instance SET "currentStepId" = ? WHERE id = ?',[M[0].id,E.instanceId]),await P(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
7
|
+
VALUES (?, ?, ?, ?, ?)`,[U("wfappr"),E.instanceId,M[0].id,"PENDING",G]);else await P(`UPDATE workflow_instance SET status = 'COMPLETED', "currentStepId" = NULL, "completedAt" = ? WHERE id = ?`,[G,E.instanceId]);let N=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);return V(N[0])}async function D(E,F){let G=new Date().toISOString(),H=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);if(!H[0])throw Error("NOT_FOUND");await P(`UPDATE workflow_approval SET status = 'REJECTED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
8
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,E.reason,G,E.instanceId,H[0].currentStepId]),await P(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`,[G,E.instanceId]);let K=await J("SELECT * FROM workflow_instance WHERE id = ?",[E.instanceId]);return V(K[0])}async function b(E){return(await J('SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"',[E])).map(C)}return{listDefinitions:$,createDefinition:O,addStep:z,getSteps:A,listInstances:B,startInstance:j,approveStep:v,rejectStep:D,getApprovals:b}}export{f as createWorkflowHandlers};
|