diff options
Diffstat (limited to 'server/src/routes/userdata.rs')
-rw-r--r-- | server/src/routes/userdata.rs | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/server/src/routes/userdata.rs b/server/src/routes/userdata.rs index 2ded24a..8803bde 100644 --- a/server/src/routes/userdata.rs +++ b/server/src/routes/userdata.rs @@ -3,10 +3,10 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin <metamuffin.org> */ -use super::ui::{account::session::Session, error::MyResult}; +use super::ui::{account::session::Session, error::MyResult, node::DatabaseNodeUserDataExt}; use crate::routes::ui::node::rocket_uri_macro_r_library_node; use anyhow::anyhow; -use jellybase::database::Database; +use jellybase::database::{DataAcid, ReadableTable, Ser, TableExt, T_NODE, T_USER_NODE}; use jellycommon::user::{NodeUserData, WatchedState}; use rocket::{ get, post, response::Redirect, serde::json::Json, FromFormField, State, UriDisplayQuery, @@ -22,38 +22,41 @@ pub enum UrlWatchedState { #[get("/n/<id>/userdata")] pub fn r_node_userdata( session: Session, - db: &State<Database>, + db: &State<DataAcid>, id: &str, ) -> MyResult<Json<NodeUserData>> { - 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())) + let (_, _, u) = db.get_node_with_userdata(id, &session)?; + Ok(Json(u)) } #[post("/n/<id>/watched?<state>")] pub async fn r_player_watched( session: Session, - db: &State<Database>, + db: &State<DataAcid>, id: &str, state: UrlWatchedState, ) -> MyResult<Redirect> { - db.node - .get(&id.to_string())? - .ok_or(anyhow!("node does not exist"))?; + T_NODE.get(db, id)?.ok_or(anyhow!("node does not exist"))?; - let key = (session.user.name.clone(), id.to_owned()); + // 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) - })?; + let txn = db.begin_write()?; + let mut user_nodes = txn.open_table(T_USER_NODE)?; + + let mut udata = user_nodes + .get((session.user.name.as_str(), id))? + .map(|x| x.value().0) + .unwrap_or_default(); + + udata.watched = match state { + UrlWatchedState::None => WatchedState::None, + UrlWatchedState::Watched => WatchedState::Watched, + UrlWatchedState::Pending => WatchedState::Pending, + }; + + user_nodes.insert((session.user.name.as_str(), id), Ser(udata))?; + drop(user_nodes); + txn.commit()?; Ok(Redirect::found(rocket::uri!(r_library_node(id)))) } @@ -61,24 +64,30 @@ pub async fn r_player_watched( #[post("/n/<id>/progress?<t>")] pub async fn r_player_progress( session: Session, - db: &State<Database>, + db: &State<DataAcid>, id: &str, t: f64, ) -> MyResult<()> { - db.node - .get(&id.to_string())? - .ok_or(anyhow!("node does not exist"))?; + T_NODE.get(db, id)?.ok_or(anyhow!("node does not exist"))?; + + let txn = db.begin_write()?; + let mut user_nodes = txn.open_table(T_USER_NODE)?; + + let mut udata = user_nodes + .get((session.user.name.as_str(), id))? + .map(|x| x.value().0) + .unwrap_or_default(); + + udata.watched = match udata.watched { + WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => { + WatchedState::Progress(t) + } + WatchedState::Watched => WatchedState::Watched, + }; + + user_nodes.insert((session.user.name.as_str(), id), Ser(udata))?; + drop(user_nodes); + txn.commit()?; - 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(()) } |