From 8b9661f149600460224f7e940ccf2323f48bb28d Mon Sep 17 00:00:00 2001 From: structix Date: Wed, 16 Apr 2025 21:31:42 +0200 Subject: [PATCH] Add http routes for separate rating and userid --- src/http_server.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/http_server.rs b/src/http_server.rs index 9ad72d6..f6266a7 100644 --- a/src/http_server.rs +++ b/src/http_server.rs @@ -1,3 +1,8 @@ +use std::sync::{ + atomic::{AtomicI64, Ordering}, + Arc, +}; + use axum::{ extract::{Path, State}, http::StatusCode, @@ -12,18 +17,23 @@ use crate::database::Database; #[derive(Clone)] struct SharedState { database: Database, + rating: Arc, mpris_sender: Sender<(String, String)>, } pub async fn http_serve(database: &Database, mpris_producer: Sender<(String, String)>) { let database = database.clone(); + let rating = Arc::new(AtomicI64::new(0)); let shared_state = SharedState { database, + rating, mpris_sender: mpris_producer, }; let app = Router::new() .route("/", get(root)) + .route("/rating/{rating}", get(cache_rating_only)) + .route("/userid/{user_id}", get(add_userid)) .route("/{user_id}/{rating}", get(add_rating)) .with_state(shared_state); @@ -56,3 +66,29 @@ async fn add_rating( } } } + +async fn cache_rating_only(Path(rating): Path, State(shared): State) -> Response { + shared.rating.store(rating, Ordering::Relaxed); + (StatusCode::OK, "Done.").into_response() +} + +async fn add_userid(Path(user_id): 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); + + match shared + .database + .user_add_rating(user_id, &interpret, &track, rating) + .await + { + Ok(_) => (StatusCode::OK, "Done.").into_response(), + Err(e) => { + println!("HTTP error: {e}"); + (StatusCode::BAD_REQUEST, e.to_string()).into_response() + } + } +}