Skip to content

Simple Approval

A typed durable approval with one service task and one user task.

dart
import 'package:vyuh_workflow_engine/vyuh_workflow_runtime.dart';
import 'package:vyuh_workflow_testkit/vyuh_workflow_testkit.dart';

final loadRequest = Workflow.activity<String, Request>(
  name: 'requests.load',
  input: stringCodec,
  output: requestCodec,
);

final decide = Workflow.userTask<Request, Approval>(
  name: 'requests.decide',
  input: requestCodec,
  response: approvalCodec,
);

final requestApproval = Workflow.define<String, Result>(
  code: 'requests.approval',
  version: 1,
  fingerprint: 'requests.approval:v1',
  input: stringCodec,
  output: resultCodec,
  execute: (flow, requestId) async {
    final request = await flow.serviceTask(
      loadRequest,
      requestId,
      id: 'load',
    );
    final decision = await flow.userTask(
      decide,
      request,
      id: 'decide',
      title: 'Approve request',
      assignment: Assignment(roleIds: ['managers']),
    );
    return decision.approved ? Result.approved() : Result.rejected();
  },
);

Drive It in Tests

dart
final test = WorkflowTestHarness()
  ..workflow(requestApproval)
  ..activity(loadRequest, (context, id) async => Request(id: id));

final run = await test.start(requestApproval, 'REQ-001');
await run.drain();
await run.completeUserTask(decide, Approval.approved());

expect((await run.run).status, WorkflowRunStatus.completed);

See Also