Working on user preferences for dashboards

This commit is contained in:
jude
2024-07-04 20:52:36 +01:00
parent 218be2f0b1
commit f26682e6de
13 changed files with 132 additions and 780 deletions

View File

@ -21,16 +21,29 @@ use serenity::{
};
use sqlx::{MySql, Pool};
use crate::web::guards::transaction::Transaction;
#[derive(Serialize)]
struct UserPreferences {
timezone: String,
use_browser_timezone: bool,
dashboard_color_scheme: String,
reset_inputs_on_create: bool,
}
#[derive(Serialize)]
struct UserInfo {
name: String,
patreon: bool,
timezone: Option<String>,
preferences: UserPreferences,
}
#[derive(Deserialize)]
pub struct UpdateUser {
timezone: String,
pub struct UpdateUserPreferences {
timezone: Option<String>,
use_browser_timezone: Option<bool>,
dashboard_color_scheme: Option<String>,
reset_inputs_on_create: Option<bool>,
}
#[get("/api/user")]
@ -39,7 +52,16 @@ pub async fn get_user_info(
ctx: &State<Context>,
pool: &State<Pool<MySql>>,
) -> JsonValue {
offline!(json!(UserInfo { name: "Discord".to_string(), patreon: true, timezone: None }));
offline!(json!(UserInfo {
name: "Discord".to_string(),
patreon: true,
preferences: UserPreferences {
timezone: "UTC".to_string(),
use_browser_timezone: false,
dashboard_color_scheme: "system".to_string(),
reset_inputs_on_create: false,
}
}));
if let Some(user_id) =
cookies.get_private("userid").map(|u| u.value().parse::<u64>().ok()).flatten()
@ -48,8 +70,16 @@ pub async fn get_user_info(
.member(&ctx.inner(), user_id)
.await;
let timezone = sqlx::query!(
"SELECT IFNULL(timezone, 'UTC') AS timezone FROM users WHERE user = ?",
let prefs = sqlx::query!(
"
SELECT
IFNULL(timezone, 'UTC') AS timezone,
use_browser_timezone,
dashboard_color_scheme,
reset_inputs_on_create
FROM users
WHERE id = ?
",
user_id
)
.fetch_one(pool.inner())
@ -65,7 +95,12 @@ pub async fn get_user_info(
.roles
.contains(&RoleId::new(env::var("PATREON_ROLE_ID").unwrap().parse().unwrap()))
}),
timezone,
preferences: UserPreferences {
timezone: prefs.timezone,
use_browser_timezone: prefs.use_browser_timezone,
dashboard_color_scheme: prefs.dashboard_color_scheme,
reset_inputs_on_create: prefs.reset_inputs_on_create,
},
};
json!(user_info)
@ -74,28 +109,55 @@ pub async fn get_user_info(
}
}
#[patch("/api/user", data = "<user>")]
#[patch("/api/user", data = "<preferences>")]
pub async fn update_user_info(
cookies: &CookieJar<'_>,
user: Json<UpdateUser>,
pool: &State<Pool<MySql>>,
preferences: Json<UpdateUserPreferences>,
mut transaction: Transaction<'_>,
) -> JsonValue {
if let Some(user_id) =
cookies.get_private("userid").map(|u| u.value().parse::<u64>().ok()).flatten()
{
if user.timezone.parse::<Tz>().is_ok() {
let _ = sqlx::query!(
"UPDATE users SET timezone = ? WHERE user = ?",
user.timezone,
user_id,
)
.execute(pool.inner())
.await;
json!({})
} else {
json!({"error": "Timezone not recognized"})
if let Some(timezone) = &preferences.timezone {
if timezone.parse::<Tz>().is_ok() {
let _ = sqlx::query!(
"
UPDATE users
SET timezone = ?
WHERE id = ?
",
timezone,
user_id,
)
.execute(transaction.executor())
.await;
} else {
return json!({"error": "Timezone not recognised"});
}
}
if let Some(dashboard_color_scheme) = &preferences.dashboard_color_scheme {
if vec!["system", "light", "dark"].contains(dashboard_color_scheme) {
let _ = sqlx::query!(
"
UPDATE users
SET dashboard_color_scheme = ?
WHERE id = ?
",
dashboard_color_scheme,
user_id,
)
.execute(transaction.executor())
.await;
} else {
return json!({"error": "Color scheme not recognised"});
}
}
// todo handle other two options
transaction.commit().await;
json!({})
} else {
json!({"error": "Not authorized"})
}