From 0fa9a389d894e6cbf6a0b30a126d7e57686d0e38 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 16 Jan 2024 15:55:15 +0100 Subject: resume player correctly when progress --- server/src/routes/userdata.rs | 84 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 server/src/routes/userdata.rs (limited to 'server/src/routes/userdata.rs') diff --git a/server/src/routes/userdata.rs b/server/src/routes/userdata.rs new file mode 100644 index 0000000..2ded24a --- /dev/null +++ b/server/src/routes/userdata.rs @@ -0,0 +1,84 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2023 metamuffin +*/ +use super::ui::{account::session::Session, error::MyResult}; +use crate::routes::ui::node::rocket_uri_macro_r_library_node; +use anyhow::anyhow; +use jellybase::database::Database; +use jellycommon::user::{NodeUserData, WatchedState}; +use rocket::{ + get, post, response::Redirect, serde::json::Json, FromFormField, State, UriDisplayQuery, +}; + +#[derive(Debug, FromFormField, UriDisplayQuery)] +pub enum UrlWatchedState { + None, + Watched, + Pending, +} + +#[get("/n//userdata")] +pub fn r_node_userdata( + session: Session, + db: &State, + id: &str, +) -> MyResult> { + db.node + .get(&id.to_string())? + .ok_or(anyhow!("node does not exist"))?; + let key = (session.user.name.clone(), id.to_owned()); + Ok(Json(db.user_node.get(&key)?.unwrap_or_default())) +} + +#[post("/n//watched?")] +pub async fn r_player_watched( + session: Session, + db: &State, + id: &str, + state: UrlWatchedState, +) -> MyResult { + db.node + .get(&id.to_string())? + .ok_or(anyhow!("node does not exist"))?; + + let key = (session.user.name.clone(), id.to_owned()); + + db.user_node.fetch_and_update(&key, |t| { + let mut t = t.unwrap_or_default(); + t.watched = match state { + UrlWatchedState::None => WatchedState::None, + UrlWatchedState::Watched => WatchedState::Watched, + UrlWatchedState::Pending => WatchedState::Pending, + }; + Some(t) + })?; + + Ok(Redirect::found(rocket::uri!(r_library_node(id)))) +} + +#[post("/n//progress?")] +pub async fn r_player_progress( + session: Session, + db: &State, + id: &str, + t: f64, +) -> MyResult<()> { + db.node + .get(&id.to_string())? + .ok_or(anyhow!("node does not exist"))?; + + let key = (session.user.name.clone(), id.to_owned()); + db.user_node.fetch_and_update(&key, |d| { + let mut d = d.unwrap_or_default(); + d.watched = match d.watched { + WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => { + WatchedState::Progress(t) + } + WatchedState::Watched => WatchedState::Watched, + }; + Some(d) + })?; + Ok(()) +} -- cgit v1.2.3-70-g09d2