From c508f80e6f4f33b7889884efe37eb30fa75c2d08 Mon Sep 17 00:00:00 2001 From: structix Date: Fri, 18 Apr 2025 10:13:41 +0200 Subject: [PATCH] Add card support --- src/database.rs | 21 ++++++++++++++++++++- src/http_server.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/database.rs b/src/database.rs index 2c0d542..31e51b3 100644 --- a/src/database.rs +++ b/src/database.rs @@ -21,7 +21,8 @@ impl Database { r#" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, - name TEXT NOT NULL + name TEXT NOT NULL, + card TEXT ); CREATE TABLE IF NOT EXISTS interprets ( id INTEGER PRIMARY KEY, @@ -121,6 +122,24 @@ impl Database { Ok(id) } + pub async fn user_get_id(&self, user_card: &str) -> Result { + let mut conn = self.pool.acquire().await?; + + let record = sqlx::query( + r#" + SELECT id FROM users + WHERE card = ? + "#, + ) + .bind(user_card) + .fetch_one(&mut *conn) + .await?; + + let id = record.try_get("id")?; + + Ok(id) + } + pub async fn user_add_rating( &self, user_id: i64, diff --git a/src/http_server.rs b/src/http_server.rs index f6266a7..b00f7c8 100644 --- a/src/http_server.rs +++ b/src/http_server.rs @@ -34,6 +34,7 @@ pub async fn http_serve(database: &Database, mpris_producer: Sender<(String, Str .route("/", get(root)) .route("/rating/{rating}", get(cache_rating_only)) .route("/userid/{user_id}", get(add_userid)) + .route("/usercard/{user_card}", get(add_userid_by_card)) .route("/{user_id}/{rating}", get(add_rating)) .with_state(shared_state); @@ -92,3 +93,34 @@ async fn add_userid(Path(user_id): Path, State(shared): State) } } } + +async fn add_userid_by_card( + Path(user_card): Path, + State(shared): State, +) -> Response { + let mut mpris_rx = shared.mpris_sender.subscribe(); + + // Get the current interpret and track from the watch channel + let (interpret, track) = (*mpris_rx.borrow_and_update()).clone(); + + let rating = shared.rating.load(Ordering::Relaxed); + + let user_id = match shared.database.user_get_id(&user_card).await { + Ok(id) => id, + Err(e) => { + return (StatusCode::BAD_REQUEST, e.to_string()).into_response(); + } + }; + + match shared + .database + .user_add_rating(user_id, &interpret, &track, rating) + .await + { + Ok(_) => (StatusCode::OK, "Done.").into_response(), + Err(e) => { + eprintln!("HTTP error: {e}"); + (StatusCode::BAD_REQUEST, e.to_string()).into_response() + } + } +}