Merge remote-tracking branch 'origin/main' into dbt-column-lineage-index

This commit is contained in:
Ruben Fiszel
2026-09-05 09:50:53 +02:00
143 changed files with 10701 additions and 2447 deletions
@@ -151,6 +151,8 @@ pub fn workspaced_service() -> Router {
)
.route("/edit_deploy_ui_config", post(edit_deploy_ui_config))
.route("/edit_default_app", post(edit_default_app))
.route("/edit_guest_access", post(edit_guest_access))
.route("/guest_usage", get(get_guest_usage))
.route("/default_app", get(get_default_app))
.route(
"/default_scripts",
@@ -317,6 +319,9 @@ pub struct WorkspaceSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub public_app_execution_limit_per_minute: Option<i32>,
pub error_handler_fallback_to_instance_alerts: bool,
/// Whether this workspace admits guest sessions (`ExecutionMode::Guest`). An app's
/// own `execution_mode: guest` is inert while this is off.
pub guest_access_enabled: bool,
}
/// Subset of `WorkspaceSettings` that is safe to return to any workspace
@@ -339,6 +344,9 @@ pub struct WorkspacePublicSettings {
pub teams_team_guid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mute_critical_alerts: Option<bool>,
/// Not sensitive, and the app editor needs it to say whether the guest rung is
/// live -- an app can be set to `guest` while the workspace has guests off.
pub guest_access_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub deploy_ui: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -1073,7 +1081,8 @@ async fn get_settings(
error_handler,
success_handler,
public_app_execution_limit_per_minute,
error_handler_fallback_to_instance_alerts
error_handler_fallback_to_instance_alerts,
guest_access_enabled
FROM
workspace_settings
WHERE
@@ -1112,6 +1121,7 @@ async fn get_public_settings(
teams_team_name,
teams_team_guid,
mute_critical_alerts,
guest_access_enabled,
deploy_ui,
large_file_storage,
datatable
@@ -1132,6 +1142,18 @@ async fn get_public_settings(
Ok(Json(settings))
}
/// The instance's standing against the guest allowance: counts only, no emails, so any
/// member may read it. Instance-wide, since a licence is per instance and one email is
/// one guest however many workspaces it opens; the settings card and the editor's
/// Guests rung show it so nobody discovers the cap from a visitor's complaint.
async fn get_guest_usage(
_authed: ApiAuthed,
Extension(db): Extension<DB>,
Path(_w_id): Path<String>,
) -> JsonResult<windmill_common::workspaces::GuestUsage> {
Ok(Json(windmill_common::workspaces::guest_usage(&db).await?))
}
#[derive(Deserialize)]
pub struct GitSyncDeployModeQuery {
/// The branch the caller would push.
@@ -4595,6 +4617,50 @@ async fn edit_default_app(
));
}
#[derive(Deserialize)]
struct EditGuestAccess {
guest_access_enabled: bool,
}
/// Turn guest sessions on or off for this workspace. Off by default, and off is
/// authoritative and immediate: the switch is re-read where a guest session is
/// minted (`guest_app_admits`) and at the auth door on every guest request, so an app
/// whose policy already says `guest` — pushed by git-sync, say — closes to guests on
/// the next request, sessions already issued included.
async fn edit_guest_access(
authed: ApiAuthed,
Extension(db): Extension<DB>,
Path(w_id): Path<String>,
Json(EditGuestAccess { guest_access_enabled }): Json<EditGuestAccess>,
) -> Result<String> {
require_admin(authed.is_admin, &authed.username)?;
let mut tx = db.begin().await?;
sqlx::query!(
"UPDATE workspace_settings SET guest_access_enabled = $1 WHERE workspace_id = $2",
guest_access_enabled,
&w_id
)
.execute(&mut *tx)
.await?;
audit_log(
&mut *tx,
&authed,
"workspaces.edit_guest_access",
ActionKind::Update,
&w_id,
Some(&guest_access_enabled.to_string()),
None,
)
.await?;
tx.commit().await?;
Ok(format!(
"Guest access set to {guest_access_enabled} for workspace {w_id}"
))
}
async fn edit_default_scripts(
authed: ApiAuthed,
Extension(db): Extension<DB>,