From 11a585b3dbe620dcc8772e713b22f1d9ba80d598 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 27 Apr 2025 19:25:11 +0200 Subject: move files around --- server/src/logic/userdata.rs | 96 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 server/src/logic/userdata.rs (limited to 'server/src/logic/userdata.rs') diff --git a/server/src/logic/userdata.rs b/server/src/logic/userdata.rs new file mode 100644 index 0000000..64a136f --- /dev/null +++ b/server/src/logic/userdata.rs @@ -0,0 +1,96 @@ +/* + 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) 2025 metamuffin +*/ +use crate::{ui::error::MyResult, ui::node::rocket_uri_macro_r_library_node}; +use jellybase::database::Database; +use jellycommon::{ + user::{NodeUserData, WatchedState}, + NodeID, +}; +use rocket::{ + form::Form, get, post, response::Redirect, serde::json::Json, FromForm, FromFormField, State, + UriDisplayQuery, +}; + +use super::session::Session; + +#[derive(Debug, FromFormField, UriDisplayQuery)] +pub enum UrlWatchedState { + None, + Watched, + Pending, +} + +#[get("/n//userdata")] +pub fn r_node_userdata( + session: Session, + db: &State, + id: NodeID, +) -> MyResult> { + let u = db + .get_node_udata(id, &session.user.name)? + .unwrap_or_default(); + Ok(Json(u)) +} + +#[post("/n//watched?")] +pub async fn r_node_userdata_watched( + session: Session, + db: &State, + id: NodeID, + state: UrlWatchedState, +) -> MyResult { + // TODO perm + db.update_node_udata(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)))) +} + +#[derive(FromForm)] +pub struct UpdateRating { + #[field(validate = range(-10..=10))] + rating: i32, +} + +#[post("/n//update_rating", data = "
")] +pub async fn r_node_userdata_rating( + session: Session, + db: &State, + id: NodeID, + form: Form, +) -> MyResult { + // TODO perm + db.update_node_udata(id, &session.user.name, |udata| { + udata.rating = form.rating; + Ok(()) + })?; + Ok(Redirect::found(rocket::uri!(r_library_node(id)))) +} + +#[post("/n//progress?")] +pub async fn r_node_userdata_progress( + session: Session, + db: &State, + id: NodeID, + t: f64, +) -> MyResult<()> { + // TODO perm + db.update_node_udata(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(()) +} -- cgit v1.2.3-70-g09d2