aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/userdata.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-29 18:03:06 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-29 18:03:06 +0100
commitdb511d3fe50f05329615f718515fab1b80d9e06a (patch)
tree7969fea01be100cbe4385ad13a14940a987ac513 /server/src/routes/userdata.rs
parent82e8a55a1496ae9132e13e7286fe1c0d57d586d3 (diff)
downloadjellything-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.rs113
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(())
}