diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-29 18:03:06 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-29 18:03:06 +0100 |
commit | db511d3fe50f05329615f718515fab1b80d9e06a (patch) | |
tree | 7969fea01be100cbe4385ad13a14940a987ac513 /server/src/routes/userdata.rs | |
parent | 82e8a55a1496ae9132e13e7286fe1c0d57d586d3 (diff) | |
download | jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar.bz2 jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar.zst |
no direct redb access
Diffstat (limited to 'server/src/routes/userdata.rs')
-rw-r--r-- | server/src/routes/userdata.rs | 113 |
1 files changed, 36 insertions, 77 deletions
diff --git a/server/src/routes/userdata.rs b/server/src/routes/userdata.rs index cf6b0af..6fcd7a0 100644 --- a/server/src/routes/userdata.rs +++ b/server/src/routes/userdata.rs @@ -3,14 +3,13 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin <metamuffin.org> */ -use super::ui::{account::session::Session, error::MyResult, node::DatabaseNodeUserDataExt}; +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::{redb::ReadableTable, DataAcid, Ser, TableExt, T_NODE, T_USER_NODE}, - permission::NodePermissionExt, +use jellybase::database::Database; +use jellycommon::{ + user::{NodeUserData, WatchedState}, + NodeID, }; -use jellycommon::user::{NodeUserData, WatchedState}; use rocket::{ form::Form, get, post, response::Redirect, serde::json::Json, FromForm, FromFormField, State, UriDisplayQuery, @@ -26,43 +25,31 @@ pub enum UrlWatchedState { #[get("/n/<id>/userdata")] pub fn r_node_userdata( session: Session, - db: &State<DataAcid>, + db: &State<Database>, id: &str, ) -> MyResult<Json<NodeUserData>> { - let (_, _, u) = db.get_node_with_userdata(id, &session)?; + let u = db + .get_node_udata(NodeID::from_slug(id), &session.user.name)? + .unwrap_or_default(); Ok(Json(u)) } #[post("/n/<id>/watched?<state>")] pub async fn r_node_userdata_watched( session: Session, - db: &State<DataAcid>, + db: &State<Database>, id: &str, state: UrlWatchedState, ) -> MyResult<Redirect> { - T_NODE - .get(db, id)? - .only_if_permitted(&session.user.permissions) - .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 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()?; - + // TODO perm + db.update_node_udata(NodeID::from_slug(id), &session.user.name, |udata| { + udata.watched = match state { + UrlWatchedState::None => WatchedState::None, + UrlWatchedState::Watched => WatchedState::Watched, + UrlWatchedState::Pending => WatchedState::Pending, + }; + Ok(()) + })?; Ok(Redirect::found(rocket::uri!(r_library_node(id)))) } @@ -75,62 +62,34 @@ pub struct UpdateRating { #[post("/n/<id>/update_rating", data = "<form>")] pub async fn r_node_userdata_rating( session: Session, - db: &State<DataAcid>, + db: &State<Database>, id: &str, form: Form<UpdateRating>, ) -> MyResult<Redirect> { - T_NODE - .get(db, id)? - .only_if_permitted(&session.user.permissions) - .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.rating = form.rating; - - user_nodes.insert((session.user.name.as_str(), id), Ser(udata))?; - drop(user_nodes); - txn.commit()?; - + // TODO perm + db.update_node_udata(NodeID::from_slug(id), &session.user.name, |udata| { + udata.rating = form.rating; + Ok(()) + })?; Ok(Redirect::found(rocket::uri!(r_library_node(id)))) } #[post("/n/<id>/progress?<t>")] pub async fn r_node_userdata_progress( session: Session, - db: &State<DataAcid>, + db: &State<Database>, id: &str, t: f64, ) -> MyResult<()> { - T_NODE - .get(db, id)? - .only_if_permitted(&session.user.permissions) - .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()?; - + // TODO perm + db.update_node_udata(NodeID::from_slug(id), &session.user.name, |udata| { + udata.watched = match udata.watched { + WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => { + WatchedState::Progress(t) + } + WatchedState::Watched => WatchedState::Watched, + }; + Ok(()) + })?; Ok(()) } |