yggdrasil/api/settings/
upload.rs1#![allow(clippy::unused_unit, deprecated, clippy::too_many_arguments)]
4
5use dioxus::prelude::*;
6
7#[cfg(feature = "server")]
8use crate::api::auth::get_current_admin_user;
9#[cfg(feature = "server")]
10use crate::api::error::AppError;
11#[cfg(feature = "server")]
12use crate::db::pool::get_conn;
13use crate::models::settings::UploadSettings;
14
15#[cfg(feature = "server")]
25pub(crate) async fn seed_upload_settings_from_env(
26 client: &tokio_postgres::Client,
27) -> Result<(), AppError> {
28 let Ok(v) = std::env::var("UPLOAD_CONCURRENCY") else {
29 return Ok(());
30 };
31 let value = match v.trim().parse::<i32>() {
32 Ok(n) => UploadSettings::clamp_concurrency(n),
33 Err(_) => {
34 tracing::warn!("UPLOAD_CONCURRENCY={v:?} 非法(期望整数),跳过");
35 return Ok(());
36 }
37 };
38 super::insert_env_seeds(client, vec![("upload_concurrency", value.to_string())]).await
39}
40
41#[server(GetUploadSettings, "/api")]
45pub async fn get_upload_settings() -> Result<UploadSettings, ServerFnError> {
46 let _user = get_current_admin_user().await?;
47
48 #[cfg(feature = "server")]
49 {
50 let client = get_conn().await.map_err(AppError::db_conn)?;
51
52 let values = super::load_setting_values(&client, &["upload_concurrency"]).await?;
53
54 let concurrency = values
55 .get("upload_concurrency")
56 .and_then(|v| v.parse().ok())
57 .map(UploadSettings::clamp_concurrency)
58 .unwrap_or(crate::models::settings::DEFAULT_UPLOAD_CONCURRENCY);
59
60 Ok(UploadSettings { concurrency })
61 }
62
63 #[cfg(not(feature = "server"))]
64 {
65 Ok(UploadSettings::default())
66 }
67}
68
69#[server(UpdateUploadSettings, "/api")]
73pub async fn update_upload_settings(concurrency: i32) -> Result<UploadSettings, ServerFnError> {
74 let _user = get_current_admin_user().await?;
75
76 let concurrency = UploadSettings::clamp_concurrency(concurrency);
77
78 #[cfg(feature = "server")]
79 {
80 let client = get_conn().await.map_err(AppError::db_conn)?;
81
82 client
83 .execute(
84 "INSERT INTO settings (key, value, updated_at) VALUES ('upload_concurrency', $1, NOW())
85 ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = NOW()",
86 &[&concurrency.to_string()],
87 )
88 .await
89 .map_err(AppError::query)?;
90
91 tracing::info!("Upload settings updated: concurrency={}", concurrency);
92 }
93
94 Ok(UploadSettings { concurrency })
95}