From 9226d6cbc119f6a1b16936ebb855ff4f50c0e122 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 20 Aug 2024 22:58:09 +0200 Subject: [PATCH] feat: add wrap_body header to webhooks --- backend/windmill-queue/src/jobs.rs | 11 +++++++---- frontend/src/lib/components/FlowBuilder.svelte | 3 +++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index d1cdb8034a..3e8e466e21 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2598,6 +2598,7 @@ impl DecodeQueries { #[derive(Deserialize)] pub struct RequestQuery { pub raw: Option, + pub wrap_body: Option, pub include_header: Option, } @@ -2632,13 +2633,14 @@ impl PushArgsOwned { async fn from_json( mut extra: HashMap>, use_raw: bool, + force_wrap_body: bool, str: String, ) -> Result { if use_raw { extra.insert("raw_string".to_string(), to_raw_value(&str)); } - let wrap_body = str.len() > 0 && str.chars().next().unwrap() != '{'; + let wrap_body = force_wrap_body || str.len() > 0 && str.chars().next().unwrap() != '{'; if wrap_body { let args = serde_json::from_str::>>(&str) @@ -2743,7 +2745,7 @@ where req: Request, _state: &S, ) -> Result { - let (content_type, mut extra, use_raw) = { + let (content_type, mut extra, use_raw, wrap_body) = { let headers_map = req.headers(); let content_type_header = headers_map.get(CONTENT_TYPE); let content_type = content_type_header.and_then(|value| value.to_str().ok()); @@ -2755,7 +2757,8 @@ where extra.extend(queries); } let raw = query.raw.as_ref().is_some_and(|x| *x); - (content_type, extra, raw) + let wrap_body = query.wrap_body.as_ref().is_some_and(|x| *x); + (content_type, extra, raw, wrap_body) }; if content_type.is_none() || content_type.unwrap().starts_with("application/json") { @@ -2765,7 +2768,7 @@ where let str = String::from_utf8(bytes.to_vec()) .map_err(|e| Error::BadRequest(format!("invalid utf8: {}", e)).into_response())?; - PushArgsOwned::from_json(extra, use_raw, str).await + PushArgsOwned::from_json(extra, use_raw, wrap_body, str).await } else if content_type .unwrap() .starts_with("application/cloudevents+json") diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index 65ae5d5068..4e6a703707 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -205,13 +205,16 @@ draft?: Flow } + let savedAtNewPath = false if (newFlow) { dispatch('saveInitial', $pathStore) } else if (savedFlow?.draft_only && $pathStore !== initialPath) { + savedAtNewPath = true initialPath = $pathStore // this is so we can use the flow builder outside of sveltekit dispatch('saveDraftOnlyAtNewPath', { path: $pathStore, selectedId: getSelectedId() }) } + dispatch('saveDraft', { path: $pathStore, savedAtNewPath, newFlow }) sendUserToast('Saved as draft') } catch (error) { sendUserToast(`Error while saving the flow as a draft: ${error.body || error.message}`, true)