aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/src/user.rs3
-rw-r--r--server/src/routes/mod.rs9
-rw-r--r--server/src/routes/ui/node.rs17
-rw-r--r--server/src/routes/ui/sort.rs3
-rw-r--r--server/src/routes/userdata.rs42
5 files changed, 63 insertions, 11 deletions
diff --git a/common/src/user.rs b/common/src/user.rs
index 1a527b9..7ea8f1f 100644
--- a/common/src/user.rs
+++ b/common/src/user.rs
@@ -29,6 +29,8 @@ pub struct User {
#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
pub struct NodeUserData {
pub watched: WatchedState,
+ #[serde(default)]
+ pub rating: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Encode, Decode)]
@@ -153,6 +155,7 @@ impl Default for NodeUserData {
fn default() -> Self {
Self {
watched: WatchedState::None,
+ rating: 0,
}
}
}
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,