diff --git a/backend/windmill-api/src/folders.rs b/backend/windmill-api/src/folders.rs index 463e016326..7d8d14269a 100644 --- a/backend/windmill-api/src/folders.rs +++ b/backend/windmill-api/src/folders.rs @@ -169,38 +169,39 @@ async fn create_folder( check_name_conflict(&mut tx, &w_id, &ng.name).await?; cache.invalidate(&w_id, token).await; let owner = username_to_permissioned_as(&authed.username); - let owners = &ng.owners.unwrap_or_else(|| vec![owner.clone()]); + let owners = ng.owners.unwrap_or_else(|| vec![owner.clone()]); + let owners = if owners.contains(&owner) { + owners.clone() + } else { + owners + .iter() + .cloned() + .chain(std::iter::once(owner)) + .collect() + }; - if let Some(extra_perms) = ng.extra_perms.clone() { - for o in owners { - if !extra_perms - .get(&o) - .and_then(|x| x.as_bool()) - .unwrap_or(false) - { - return Err(windmill_common::error::Error::BadRequest(format!( - "Owner {} would not have permission to write to folder and that is an inconsistent state", - o - ))); - } + let mut extra_perms = ng + .extra_perms + .unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::new())); + + if extra_perms.is_object() { + let extra_mut = extra_perms.as_object_mut().unwrap(); + for o in &owners { + extra_mut.insert(o.clone(), serde_json::json!(true)); } + } else { + return Err(windmill_common::error::Error::BadRequest(format!( + "extra_perms must be an object" + ))); } - let extra_perms = ng.extra_perms.unwrap_or_else(|| { - let mut map = serde_json::Map::new(); - for o in owners { - map.insert(o.clone(), serde_json::json!(true)); - } - serde_json::Value::Object(map) - }); - sqlx::query_as!( Folder, "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, $2, $3, $4, $5)", w_id, ng.name, ng.display_name.unwrap_or(ng.name.clone()), - owners, + &owners, extra_perms, ) .execute(&mut *tx)