fix(cli): use relay workflow id on create (#872)

Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
This commit is contained in:
tlongwell-block
2026-06-18 10:46:44 -04:00
committed by GitHub
co-authored by npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d
parent 6335447887
commit 762ca43d26
2 changed files with 57 additions and 5 deletions
+50 -3
View File
@@ -567,14 +567,31 @@ pub fn extract_p_tags(event: &serde_json::Value) -> Vec<serde_json::Value> {
.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<String> {
serde_json::from_str::<serde_json::Value>(resp)
.ok()?
.get("message")?
.as_str()?
.strip_prefix("response:")
.and_then(|json| serde_json::from_str::<serde_json::Value>(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));
}
}
+7 -2
View File
@@ -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(())
}