From 762ca43d26be8f5376f96a1376ed7eb6f213e411 Mon Sep 17 00:00:00 2001 From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com> Date: Thu, 18 Jun 2026 10:46:44 -0400 Subject: [PATCH] fix(cli): use relay workflow id on create (#872) Signed-off-by: Tyler Longwell Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co> --- crates/buzz-cli/src/client.rs | 53 +++++++++++++++++++++-- crates/buzz-cli/src/commands/workflows.rs | 9 +++- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/crates/buzz-cli/src/client.rs b/crates/buzz-cli/src/client.rs index 860d345c0..b87753760 100644 --- a/crates/buzz-cli/src/client.rs +++ b/crates/buzz-cli/src/client.rs @@ -567,14 +567,31 @@ pub fn extract_p_tags(event: &serde_json::Value) -> Vec { .unwrap_or_default() } -/// Print a create-command response, injecting the generated entity ID. -pub fn print_create_response(resp: &str, id_key: &str, id_val: &str) { +/// Return a create-command response with an entity ID injected. +pub fn create_response_with_id(resp: &str, id_key: &str, id_val: &str) -> String { let mut v: serde_json::Value = serde_json::from_str(resp).unwrap_or(serde_json::json!({})); v[id_key] = serde_json::json!(id_val); if v.get("accepted").is_none() { v["accepted"] = serde_json::json!(true); } - println!("{v}"); + v.to_string() +} + +/// Print a create-command response, injecting the generated entity ID. +pub fn print_create_response(resp: &str, id_key: &str, id_val: &str) { + println!("{}", create_response_with_id(resp, id_key, id_val)); +} + +/// Extract a JSON field from relay write response messages shaped as +/// `response:{...}`. +pub fn extract_relay_response_field(resp: &str, field: &str) -> Option { + serde_json::from_str::(resp) + .ok()? + .get("message")? + .as_str()? + .strip_prefix("response:") + .and_then(|json| serde_json::from_str::(json).ok()) + .and_then(|v| v.get(field)?.as_str().map(str::to_string)) } /// Normalize a relay write-response into a consistent JSON object. @@ -593,3 +610,33 @@ pub fn normalize_write_response(raw: &str) -> String { } raw.to_string() } + +#[cfg(test)] +mod tests { + use super::{create_response_with_id, extract_relay_response_field}; + + #[test] + fn extract_relay_response_field_reads_response_message_json() { + let raw = r#"{"event_id":"abc","accepted":true,"message":"response:{\"workflow_id\":\"relay-id\",\"created\":true}"}"#; + assert_eq!( + extract_relay_response_field(raw, "workflow_id").as_deref(), + Some("relay-id") + ); + } + + #[test] + fn extract_relay_response_field_returns_none_for_non_response_message() { + let raw = r#"{"event_id":"abc","accepted":true,"message":""}"#; + assert!(extract_relay_response_field(raw, "workflow_id").is_none()); + } + + #[test] + fn create_response_with_id_overrides_local_id_with_relay_id() { + let raw = r#"{"event_id":"abc","accepted":true,"message":"response:{\"workflow_id\":\"relay-id\"}"}"#; + let out = create_response_with_id(raw, "workflow_id", "relay-id"); + let v: serde_json::Value = serde_json::from_str(&out).unwrap(); + assert_eq!(v["workflow_id"].as_str(), Some("relay-id")); + assert_eq!(v["event_id"].as_str(), Some("abc")); + assert_eq!(v["accepted"].as_bool(), Some(true)); + } +} diff --git a/crates/buzz-cli/src/commands/workflows.rs b/crates/buzz-cli/src/commands/workflows.rs index 6175d8bfb..50a302c9e 100644 --- a/crates/buzz-cli/src/commands/workflows.rs +++ b/crates/buzz-cli/src/commands/workflows.rs @@ -1,6 +1,9 @@ use sha2::{Digest, Sha256}; -use crate::client::{extract_d_tag, normalize_write_response, print_create_response, BuzzClient}; +use crate::client::{ + extract_d_tag, extract_relay_response_field, normalize_write_response, print_create_response, + BuzzClient, +}; use crate::error::CliError; use crate::validate::{parse_uuid, read_or_stdin, sdk_err, validate_uuid}; @@ -114,7 +117,9 @@ pub async fn cmd_create_workflow( let event = client.sign_event(builder)?; let resp = client.submit_event(event).await?; - print_create_response(&resp, "workflow_id", &workflow_id.to_string()); + let final_workflow_id = extract_relay_response_field(&resp, "workflow_id") + .unwrap_or_else(|| workflow_id.to_string()); + print_create_response(&resp, "workflow_id", &final_workflow_id); Ok(()) }