aboutsummaryrefslogtreecommitdiff
path: root/server/src/logic/userdata.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-27 19:25:11 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-27 19:25:11 +0200
commit11a585b3dbe620dcc8772e713b22f1d9ba80d598 (patch)
tree44f8d97137412aefc79a2425a489c34fa3e5f6c5 /server/src/logic/userdata.rs
parentd871aa7c5bba49ff55170b5d2dac9cd440ae7170 (diff)
downloadjellything-11a585b3dbe620dcc8772e713b22f1d9ba80d598.tar
jellything-11a585b3dbe620dcc8772e713b22f1d9ba80d598.tar.bz2
jellything-11a585b3dbe620dcc8772e713b22f1d9ba80d598.tar.zst
move files around
Diffstat (limited to 'server/src/logic/userdata.rs')
-rw-r--r--server/src/logic/userdata.rs96
1 files changed, 96 insertions, 0 deletions
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 <metamuffin.org>
+*/
+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/<id>/userdata")]
+pub fn r_node_userdata(
+ session: Session,
+ db: &State<Database>,
+ id: NodeID,
+) -> MyResult<Json<NodeUserData>> {
+ let u = db
+ .get_node_udata(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<Database>,
+ id: NodeID,
+ state: UrlWatchedState,
+) -> MyResult<Redirect> {
+ // 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/<id>/update_rating", data = "<form>")]
+pub async fn r_node_userdata_rating(
+ session: Session,
+ db: &State<Database>,
+ id: NodeID,
+ form: Form<UpdateRating>,
+) -> MyResult<Redirect> {
+ // 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/<id>/progress?<t>")]
+pub async fn r_node_userdata_progress(
+ session: Session,
+ db: &State<Database>,
+ 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(())
+}