Working on user preferences for dashboards
This commit is contained in:
		@@ -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"})
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user