srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/crates/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/server/src')
-rw-r--r--crates/server/src/auth.rs17
-rw-r--r--crates/server/src/cosmetics.rs8
2 files changed, 19 insertions, 6 deletions
diff --git a/crates/server/src/auth.rs b/crates/server/src/auth.rs
index 382dbfa..caf428b 100644
--- a/crates/server/src/auth.rs
+++ b/crates/server/src/auth.rs
@@ -306,8 +306,17 @@ async fn logout(State(state): State<Arc<AppState>>, jar: CookieJar) -> Result<im
}
async fn me(State(state): State<Arc<AppState>>, jar: CookieJar) -> Result<impl IntoResponse, AppError> {
- match current_user(&state.db, &jar).await {
- Some(user) => Ok(Json(user)),
- None => Err(AppError::Unauthorized),
- }
+ let user = current_user(&state.db, &jar).await.ok_or(AppError::Unauthorized)?;
+ // Whether the ad slots are shown. Fetched here so the client has it with
+ // the identity rather than asking a second time.
+ let is_supporter: bool = sqlx::query_scalar("SELECT is_supporter FROM users WHERE id = $1")
+ .bind(&user.id)
+ .fetch_optional(&state.db)
+ .await?
+ .unwrap_or(false);
+ Ok(Json(serde_json::json!({
+ "id": user.id,
+ "username": user.username,
+ "is_supporter": is_supporter,
+ })))
}
diff --git a/crates/server/src/cosmetics.rs b/crates/server/src/cosmetics.rs
index f128095..460fc66 100644
--- a/crates/server/src/cosmetics.rs
+++ b/crates/server/src/cosmetics.rs
@@ -51,6 +51,7 @@ struct MyCosmetics {
owned: Vec<String>,
equipped_caret: Option<String>,
equipped_flair: Option<String>,
+ equipped_sprite: Option<String>,
}
async fn my_cosmetics(State(state): State<Arc<AppState>>, jar: CookieJar) -> Result<impl IntoResponse, AppError> {
@@ -62,7 +63,7 @@ async fn my_cosmetics(State(state): State<Arc<AppState>>, jar: CookieJar) -> Res
.await?;
let owned: Vec<String> = owned_rows.into_iter().filter_map(|r| r.try_get("cosmetic_id").ok()).collect();
- let equip_row = sqlx::query("SELECT equipped_caret, equipped_flair FROM users WHERE id = $1")
+ let equip_row = sqlx::query("SELECT equipped_caret, equipped_flair, equipped_sprite FROM users WHERE id = $1")
.bind(&user.id)
.fetch_one(&state.db)
.await?;
@@ -76,6 +77,7 @@ async fn my_cosmetics(State(state): State<Arc<AppState>>, jar: CookieJar) -> Res
// into Option<String> correctly does. Found via a real NULL column
// round-tripping as "" instead of JSON null.
equipped_caret: equip_row.try_get::<Option<String>, _>("equipped_caret").unwrap_or(None),
+ equipped_sprite: equip_row.try_get::<Option<String>, _>("equipped_sprite").unwrap_or(None),
equipped_flair: equip_row.try_get::<Option<String>, _>("equipped_flair").unwrap_or(None),
}))
}
@@ -126,6 +128,7 @@ async fn equip(State(state): State<Arc<AppState>>, jar: CookieJar, Path(cosmetic
let column = match category.as_str() {
"caret" => "equipped_caret",
"flair" => "equipped_flair",
+ "sprite" => "equipped_sprite",
_ => return Err(AppError::Internal(anyhow::anyhow!("unknown cosmetic category"))),
};
@@ -147,7 +150,8 @@ async fn unequip(State(state): State<Arc<AppState>>, jar: CookieJar, Json(body):
let column = match body.category.as_str() {
"caret" => "equipped_caret",
"flair" => "equipped_flair",
- _ => return Err(AppError::InvalidInput("category must be 'caret' or 'flair'".into())),
+ "sprite" => "equipped_sprite",
+ _ => return Err(AppError::InvalidInput("category must be 'caret', 'flair' or 'sprite'".into())),
};
let query = format!("UPDATE users SET {column} = NULL WHERE id = $1");
sqlx::query(&query).bind(&user.id).execute(&state.db).await?;