Getting started
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) }} |