use iii_sdk::{register_worker, InitOptions, Logger, TriggerRequest, TriggerAction, RegisterFunctionMessage, RegisterTriggerInput, types::ApiRequest};
use serde_json::json;
let iii = register_worker("ws://localhost:49134", InitOptions::default());
iii.register_function(
RegisterFunctionMessage::with_id("users.update_status".into()).with_description("Update user status in state".into()),
|input| async move {
let logger = Logger::new();
let req: ApiRequest = serde_json::from_value(input)?;
let user_id = req.path_params.get("id").cloned().unwrap_or_default();
if user_id.is_empty() {
return Ok(json!({ "status_code": 400, "body": { "error": "Missing user ID" } }));
}
let new_status = req.body["status"].as_str().unwrap_or("active").to_string();
// Write to state — addressed by scope + key
iii.trigger(TriggerRequest {
function_id: "state::set".into(),
payload: json!({
"scope": "users",
"key": user_id,
"value": {
"status": new_status,
"updatedAt": chrono::Utc::now().to_rfc3339(),
},
}),
action: Some(TriggerAction::Void),
timeout_ms: None,
}).await?;
logger.info(&format!("Updated user {} status to {}", user_id, new_status), None);
Ok(json!({ "status_code": 200, "body": { "userId": user_id, "status": new_status } }))
},
);
iii.register_trigger(RegisterTriggerInput {
trigger_type: "http".into(),
function_id: "users.update_status".into(),
config: json!({ "api_path": "users/:id/status", "http_method": "POST" }),
})?;