diff --git a/backend/sqlx-data.json b/backend/sqlx-data.json index 8a839ffc02..a3dd13a9a0 100644 --- a/backend/sqlx-data.json +++ b/backend/sqlx-data.json @@ -2984,20 +2984,6 @@ }, "query": "UPDATE group_ SET summary = $1 WHERE name = $2 AND workspace_id = $3" }, - "83fc9bf32b9b40987feff61fea82e20613e74efb7bf8ba52485566667ccf2284": { - "describe": { - "columns": [], - "nullable": [], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text" - ] - } - }, - "query": "UPDATE resource SET path = $1 WHERE path = $2 AND workspace_id = $3" - }, "8543f029d9784234e4c6a6dcd7b03e62d544b98be261334ee210594e0bb839f2": { "describe": { "columns": [ @@ -3168,6 +3154,21 @@ }, "query": "INSERT INTO usage (id, is_workspace, month_, usage) \n VALUES ($1, false, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 0) \n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 \n RETURNING usage.usage" }, + "8c0131a9cc61f2daa258d49767242bcaab6bb34a977ff7fb0c18aa9202d11f47": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Varchar", + "Jsonb", + "Text", + "Text" + ] + } + }, + "query": "UPDATE resource SET path = $1, value = $2 WHERE path = $3 AND workspace_id = $4" + }, "8c11511a74a41a65f448249a00ebe6964a61d00c2f7b4875a55e64741bf1f0ca": { "describe": { "columns": [ @@ -4697,6 +4698,27 @@ }, "query": "SELECT null FROM queue WHERE id = $1 FOR UPDATE" }, + "be1de9116b18a40681cb8c5ec7578fd7c5f7ce77f7af63f766c2899d85fe0bef": { + "describe": { + "columns": [ + { + "name": "value", + "ordinal": 0, + "type_info": "Jsonb" + } + ], + "nullable": [ + true + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + } + }, + "query": "SELECT value FROM resource WHERE path = $1 AND workspace_id = $2" + }, "be7a99a5bb6858323ca61dd51077010f51ba58ae76b9a413339255024dcb524d": { "describe": { "columns": [], diff --git a/backend/windmill-api/src/variables.rs b/backend/windmill-api/src/variables.rs index 65655c8c39..599c7ccfba 100644 --- a/backend/windmill-api/src/variables.rs +++ b/backend/windmill-api/src/variables.rs @@ -26,6 +26,7 @@ use axum::{ Json, Router, }; use hyper::StatusCode; +use serde_json::Value; use windmill_audit::{audit_log, ActionKind}; use windmill_common::{ error::{Error, JsonResult, Result}, @@ -378,9 +379,26 @@ async fn update_variable( if !authed.is_admin { require_owner_of_path(&w_id, &authed.username, &authed.groups, &path, &db).await?; } + let mut v = sqlx::query_scalar!( + "SELECT value FROM resource WHERE path = $1 AND workspace_id = $2", + path, + w_id + ) + .fetch_one(&mut tx) + .await?; + + if let Some(old_v) = v { + v = Some(replace_path( + old_v, + &format!("$var:{path}"), + &format!("$var:{npath}"), + )) + } + sqlx::query!( - "UPDATE resource SET path = $1 WHERE path = $2 AND workspace_id = $3", + "UPDATE resource SET path = $1, value = $2 WHERE path = $3 AND workspace_id = $4", npath, + v, path, w_id ) @@ -419,6 +437,23 @@ async fn update_variable( Ok(format!("variable {} updated (npath: {:?})", path, npath)) } +fn replace_path(v: serde_json::Value, path: &str, npath: &str) -> Value { + match v { + Value::Object(v) => Value::Object( + v.into_iter() + .map(|(k, v)| (k, replace_path(v, path, npath))) + .collect(), + ), + Value::Array(arr) => Value::Array( + arr.into_iter() + .map(|v| replace_path(v, path, npath)) + .collect(), + ), + Value::String(s) if s == path => Value::String(npath.to_owned()), + _ => v, + } +} + pub async fn build_crypt<'c>( db: &mut Transaction<'c, Postgres>, w_id: &str, diff --git a/frontend/src/lib/components/AppConnect.svelte b/frontend/src/lib/components/AppConnect.svelte index 77dd9c0414..28ac13d52f 100644 --- a/frontend/src/lib/components/AppConnect.svelte +++ b/frontend/src/lib/components/AppConnect.svelte @@ -81,7 +81,7 @@ $: key = apiTokenApps[resource_type]?.key ?? (args != undefined - ? Object.keys(args).filter((x) => ['token', 'password', 'api_key'].includes(x))[0] + ? Object.keys(args).filter((x) => ['token', 'password', 'api_key', 'key'].includes(x))[0] : undefined) let scopes: string[] = [] @@ -259,6 +259,7 @@ args['token'] == '' && args['password'] == '' && args['api_key'] == '' && + args['key'] == '' && key != undefined) || (step == 3 && pathError != '') || !isValid @@ -396,7 +397,7 @@ bind:error={pathError} bind:path initialPath="" - namePlaceholder="{resource_type}" + namePlaceholder={resource_type} kind="resource" /> @@ -433,7 +434,7 @@ {:else}