diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-11 12:43:16 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-11 12:43:16 +0200 |
commit | 29eb56f03ac122bda1b12909592e76d34d79b542 (patch) | |
tree | 1c7d5b87182942e3dc272c207bb976e779d4b7c3 /server | |
parent | bb6ef9611b51c716635297da913008f787293856 (diff) | |
download | jellything-29eb56f03ac122bda1b12909592e76d34d79b542.tar jellything-29eb56f03ac122bda1b12909592e76d34d79b542.tar.bz2 jellything-29eb56f03ac122bda1b12909592e76d34d79b542.tar.zst |
node user ratingings
Diffstat (limited to 'server')
-rw-r--r-- | server/src/routes/mod.rs | 9 | ||||
-rw-r--r-- | server/src/routes/ui/node.rs | 17 | ||||
-rw-r--r-- | server/src/routes/ui/sort.rs | 3 | ||||
-rw-r--r-- | server/src/routes/userdata.rs | 42 |
4 files changed, 60 insertions, 11 deletions
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs index 2f8946f..33f1c69 100644 --- a/server/src/routes/mod.rs +++ b/server/src/routes/mod.rs @@ -43,7 +43,9 @@ use ui::{ search::r_search, style::{r_assets_font, r_assets_js, r_assets_js_map, r_assets_style}, }; -use userdata::{r_node_userdata, r_player_progress, r_player_watched}; +use userdata::{ + r_node_userdata, r_node_userdata_progress, r_node_userdata_rating, r_node_userdata_watched, +}; pub mod api; pub mod playersync; @@ -112,8 +114,9 @@ pub fn build_rocket(database: DataAcid, federation: Federation) -> Rocket<Build> r_node_userdata, r_node_thumbnail, r_player, - r_player_progress, - r_player_watched, + r_node_userdata_progress, + r_node_userdata_watched, + r_node_userdata_rating, r_account_login, r_account_login_post, r_account_register, diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs index d99ddb7..40faf5a 100644 --- a/server/src/routes/ui/node.rs +++ b/server/src/routes/ui/node.rs @@ -18,7 +18,10 @@ use crate::{ layout::{DynLayoutPage, LayoutPage}, player::{rocket_uri_macro_r_player, PlayerConfig}, }, - userdata::{rocket_uri_macro_r_player_watched, UrlWatchedState}, + userdata::{ + rocket_uri_macro_r_node_userdata_rating, rocket_uri_macro_r_node_userdata_watched, + UrlWatchedState, + }, }, uri, }; @@ -163,25 +166,29 @@ markup::define! { @if node.media.is_some() { a.play[href=&uri!(r_player(id, PlayerConfig::default()))] { "Watch now" }} @if !matches!(node.kind.unwrap_or_default(), NodeKind::Collection | NodeKind::Channel) { @if matches!(udata.watched, WatchedState::None | WatchedState::Pending | WatchedState::Progress(_)) { - form.mark_watched[method="POST", action=uri!(r_player_watched(id, UrlWatchedState::Watched))] { + form.mark_watched[method="POST", action=uri!(r_node_userdata_watched(id, UrlWatchedState::Watched))] { input[type="submit", value="Mark Watched"]; } } @if matches!(udata.watched, WatchedState::Watched) { - form.mark_unwatched[method="POST", action=uri!(r_player_watched(id, UrlWatchedState::None))] { + form.mark_unwatched[method="POST", action=uri!(r_node_userdata_watched(id, UrlWatchedState::None))] { input[type="submit", value="Mark Unwatched"]; } } @if matches!(udata.watched, WatchedState::None) { - form.mark_unwatched[method="POST", action=uri!(r_player_watched(id, UrlWatchedState::Pending))] { + form.mark_unwatched[method="POST", action=uri!(r_node_userdata_watched(id, UrlWatchedState::Pending))] { input[type="submit", value="Add to Watchlist"]; } } @if matches!(udata.watched, WatchedState::Pending) { - form.mark_unwatched[method="POST", action=uri!(r_player_watched(id, UrlWatchedState::None))] { + form.mark_unwatched[method="POST", action=uri!(r_node_userdata_watched(id, UrlWatchedState::None))] { input[type="submit", value="Remove from Watchlist"]; } } + form.rating[method="POST", action=uri!(r_node_userdata_rating(id))] { + input[type="range", name="rating", min=-10, max=10, step=1, value=udata.rating]; + input[type="submit", value="Update Rating"]; + } } } .details { diff --git a/server/src/routes/ui/sort.rs b/server/src/routes/ui/sort.rs index 88f262b..bcd9fe3 100644 --- a/server/src/routes/ui/sort.rs +++ b/server/src/routes/ui/sort.rs @@ -55,6 +55,7 @@ form_enum!( RatingYoutubeViews = "rating_yt_views", RatingYoutubeLikes = "rating_yt_likes", RatingYoutubeFollowers = "rating_yt_followers", + RatingUser = "rating_user", } ); @@ -77,6 +78,7 @@ impl SortProperty { (RatingYoutubeFollowers, "Youtube Subscribers"), (RatingYoutubeLikes, "Youtube Likes"), (RatingYoutubeViews, "Youtube Views"), + (RatingUser, "Your Rating"), ], ), ] @@ -200,6 +202,7 @@ pub fn filter_and_sort_nodes( SortProperty::RatingYoutubeFollowers => nodes.sort_by_cached_key(|(_, n, _)| { SortAnyway(*n.ratings.get(&Rating::YoutubeFollowers).unwrap_or(&0.)) }), + SortProperty::RatingUser => nodes.sort_by_cached_key(|(_, _, u)| u.rating), } match f.sort_order.unwrap_or(default_sort.1) { diff --git a/server/src/routes/userdata.rs b/server/src/routes/userdata.rs index 68fa384..22e20b7 100644 --- a/server/src/routes/userdata.rs +++ b/server/src/routes/userdata.rs @@ -12,7 +12,8 @@ use jellybase::{ }; use jellycommon::user::{NodeUserData, WatchedState}; use rocket::{ - get, post, response::Redirect, serde::json::Json, FromFormField, State, UriDisplayQuery, + form::Form, get, post, response::Redirect, serde::json::Json, FromForm, FromFormField, State, + UriDisplayQuery, }; #[derive(Debug, FromFormField, UriDisplayQuery)] @@ -33,7 +34,7 @@ pub fn r_node_userdata( } #[post("/n/<id>/watched?<state>")] -pub async fn r_player_watched( +pub async fn r_node_userdata_watched( session: Session, db: &State<DataAcid>, id: &str, @@ -65,8 +66,43 @@ pub async fn r_player_watched( 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<DataAcid>, + 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()?; + + Ok(Redirect::found(rocket::uri!(r_library_node(id)))) +} + #[post("/n/<id>/progress?<t>")] -pub async fn r_player_progress( +pub async fn r_node_userdata_progress( session: Session, db: &State<DataAcid>, id: &str, |