Build your first workflow

Create a small HTTP workflow with validation, a transformation, and a response.

Using WorkflowBuilder (SDK)#

import { flosync, v } from 'cliodot';

const w = flosync
 .workflow('my-workflow')
 .http('POST', '/process')
 .step('validate', s =>
   s.validator({ email: v.body('email'), amount: v.body('amount') })
     .then('process')
     .else('error')
 )
 .step('process', s =>
   s.connector('paystack', 'Initialize Transaction', {
     body: {
       email: v.body('email'),
       amount: v.body('amount'),
       reference: v.body('reference')
     }
   })
 )
 .step('respond', s =>
   s.responder('json', {
     statusCode: 200,
     body: v.stepResult('process')
   })
 )
 .step('error', s =>
   s.responder('json', { statusCode: 400, body: { error: 'Validation failed' } })
 )
 .build();

flosync.register(w);

Triggers#

Method Description
.http(method, path) HTTP trigger (e.g. POST /orders)
.webhook(method, path) Alias for .http()
.job(cron?, timezone?) Scheduled job (e.g. '0 * * * *', 'UTC')
.schedule(cron, timezone?) Alias for .job()
Omit trigger Manual – call run() with payload only

Step Types#

Step Builder Description
Connector s.connector(id, action, config) REST/API call
DB s.db(engine, action, config) MongoDB, MySQL
Validator s.validator(fields) Validate input
Condition s.condition(expr) Branch on expression
Transform s.transform(mapping) Map or transform data
Function s.call(slug, args) Invoke a function
Auth s.auth(connectorId, action, config) Authentication
Util s.util(connectorId, action, config) Utility (date, string, math)
Encrypt s.encrypt(connectorId, action, config) Encryption
Responder s.responder(type, config) Return response
Log s.log(message) Log message
Delay s.delay(ms) Delay execution
Call workflow s.callWorkflow(workflowId, payload) Invoke another workflow

Branching: Steps that can succeed or fail support .then(stepId) and .else(stepId):

s.validator({ email: v.body('email') }).then('process').else('error')
s.condition('{{ stepResults.validate.amount > 0 }}').then('create').else('invalid')

Variable References#

Use variable (or v) for template expressions:

Method Example Resolves to
v.body(path) v.body('email') {{ body.email }}
v.trigger(path) v.trigger('data') {{ trigger.data }}
v.stepResult(stepId, path) v.stepResult('charge', 'id') {{ stepResults.charge.id }}
v.header(key) v.header('x-api-key') {{ headers["x-api-key"] }}
v.pathParam(key) v.pathParam('id') {{ pathParams["id"] }}
v.vars(key) v.vars('apiKey') {{ vars["apiKey"] }}
v.expr(expr) v.expr('length(body.items)') {{ length(body.items) }}