[campaign]
name = "JSONPlaceholder — Transform Demo"
description = "Fetch a user, reshape the data with transform steps, then use the results downstream."
[env]
BASE_URL = "https://jsonplaceholder.typicode.com"
USER_ID = "1"
[[steps]]
name = "Fetch user"
method = "GET"
url = "{{BASE_URL}}/users/{{USER_ID}}"
assert = [
{ on = "status", eq = 200 },
{ on = "body.email", exists = true },
{ on = "body.name", exists = true },
]
[steps.extract]
USER_EMAIL = "email"
USER_NAME = "name"
USER_SITE = "website"
[[steps]]
name = "Reshape user data"
kind = "transform"
transforms = [
{ type = "regex", input = "{{USER_EMAIL}}", pattern = "^([^@]+)@", group = 1, output = "EMAIL_USER" },
{ type = "regex", input = "{{USER_EMAIL}}", pattern = "@(.+)$", group = 1, output = "EMAIL_DOMAIN" },
{ type = "upper", input = "{{USER_NAME}}", output = "NAME_UPPER" },
{ type = "template", input = "{{NAME_UPPER}} ({{EMAIL_USER}})", output = "DISPLAY" },
{ type = "trim", input = "{{USER_SITE}}", output = "SITE_CLEAN" },
]
[[steps]]
name = "Fetch posts by user"
method = "GET"
url = "{{BASE_URL}}/posts?userId={{USER_ID}}"
assert = [
{ on = "status", eq = 200 },
{ on = "body.0.userId", eq = 1 },
{ on = "body.0.title", exists = true },
]
[steps.extract]
FIRST_POST_TITLE = "0.title"
[[steps]]
name = "Build post summary"
kind = "transform"
transforms = [
{ type = "lower", input = "{{FIRST_POST_TITLE}}", output = "TITLE_LOWER" },
{ type = "template", input = "Author: {{DISPLAY}} — Post: {{TITLE_LOWER}}", output = "SUMMARY" },
]