84 lines
2.2 KiB
Rust
84 lines
2.2 KiB
Rust
/*
|
|
* Author: Ruben Fiszel
|
|
* Copyright: Windmill Labs, Inc 2023
|
|
* This file and its contents are licensed under the AGPLv3 License.
|
|
* Please see the included NOTICE for copyright information and
|
|
* LICENSE-AGPL for a copy of the license.
|
|
*/
|
|
|
|
use crate::{
|
|
db::{ApiAuthed, DB},
|
|
utils::require_super_admin,
|
|
};
|
|
|
|
use axum::{
|
|
extract::{Extension, Path},
|
|
routing::{get, post},
|
|
Json, Router,
|
|
};
|
|
|
|
use windmill_common::{
|
|
error::{self, JsonResult},
|
|
global_settings::ENV_SETTINGS,
|
|
};
|
|
|
|
pub fn global_service() -> Router {
|
|
Router::new()
|
|
.route("/local", get(get_local_settings))
|
|
.route(
|
|
"/global/:key",
|
|
post(set_global_setting).get(get_global_setting),
|
|
)
|
|
}
|
|
|
|
pub async fn get_local_settings(
|
|
Extension(db): Extension<DB>,
|
|
authed: ApiAuthed,
|
|
) -> error::JsonResult<serde_json::Value> {
|
|
require_super_admin(&db, &authed.email).await?;
|
|
|
|
let mut settings = serde_json::Map::new();
|
|
for key in ENV_SETTINGS.iter() {
|
|
if let Some(value) = std::env::var(key).ok() {
|
|
settings.insert(key.to_string(), serde_json::Value::String(value));
|
|
}
|
|
}
|
|
Ok(Json(serde_json::Value::Object(settings)))
|
|
}
|
|
|
|
#[derive(serde::Deserialize)]
|
|
pub struct Value {
|
|
pub value: serde_json::Value,
|
|
}
|
|
pub async fn set_global_setting(
|
|
Extension(db): Extension<DB>,
|
|
authed: ApiAuthed,
|
|
Path(key): Path<String>,
|
|
Json(value): Json<Value>,
|
|
) -> error::Result<()> {
|
|
require_super_admin(&db, &authed.email).await?;
|
|
sqlx::query!(
|
|
"INSERT INTO global_settings (name, value) VALUES ($1, $2) ON CONFLICT (name) DO UPDATE SET value = $2, updated_at = now()",
|
|
key,
|
|
value.value
|
|
)
|
|
.execute(&db)
|
|
.await?;
|
|
tracing::info!("Set global setting {} to {}", key, value.value);
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn get_global_setting(
|
|
Extension(db): Extension<DB>,
|
|
authed: ApiAuthed,
|
|
Path(key): Path<String>,
|
|
) -> JsonResult<serde_json::Value> {
|
|
require_super_admin(&db, &authed.email).await?;
|
|
let value = sqlx::query!("SELECT value FROM global_settings WHERE name = $1", key)
|
|
.fetch_optional(&db)
|
|
.await?
|
|
.map(|x| x.value);
|
|
|
|
Ok(Json(value.unwrap_or_else(|| serde_json::Value::Null)))
|
|
}
|