diff options
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r-- | server/src/routes/ui/node.rs | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs index 75893a8..365182c 100644 --- a/server/src/routes/ui/node.rs +++ b/server/src/routes/ui/node.rs @@ -31,6 +31,7 @@ use crate::{ use anyhow::{anyhow, Result}; use chrono::DateTime; use jellycommon::{ + api::ApiNodeResponse, user::{NodeUserData, WatchedState}, Chapter, MediaInfo, Node, NodeID, NodeKind, PeopleGroup, Rating, SourceTrackKind, Visibility, }; @@ -43,34 +44,39 @@ pub fn r_library_node(id: String) { drop(id) } -#[get("/n/<slug>?<filter..>")] +#[get("/n/<slug>?<parents>&<children>&<filter..>")] pub async fn r_library_node_filter<'a>( session: Session, slug: &'a str, db: &'a State<Database>, aj: AcceptJson, filter: NodeFilterSort, -) -> MyResult<Either<DynLayoutPage<'a>, Json<Node>>> { + parents: bool, + children: bool, +) -> MyResult<Either<DynLayoutPage<'a>, Json<ApiNodeResponse>>> { let id = NodeID::from_slug(slug); let (node, udata) = db.get_node_with_userdata(id, &session)?; - if *aj { - return Ok(Either::Right(Json((*node).clone()))); - } + let mut children = if !*aj || children { + db.get_node_children(id)? + .into_iter() + .map(|c| db.get_node_with_userdata(c, &session)) + .collect::<anyhow::Result<Vec<_>>>()? + } else { + Vec::new() + }; - let mut children = db - .get_node_children(id)? - .into_iter() - .map(|c| db.get_node_with_userdata(c, &session)) - .collect::<anyhow::Result<Vec<_>>>()?; - children.retain(|(n, _)| n.visibility >= Visibility::Reduced); + let mut parents = if !*aj || parents { + node.parents + .iter() + .map(|pid| db.get_node_with_userdata(*pid, &session)) + .collect::<anyhow::Result<Vec<_>>>()? + } else { + Vec::new() + }; - let mut parents = node - .parents - .iter() - .flat_map(|pid| db.get_node(*pid).transpose()) - .collect::<Result<Vec<_>, _>>()?; - parents.retain(|n| n.visibility >= Visibility::Reduced); + children.retain(|(n, _)| n.visibility >= Visibility::Reduced); + parents.retain(|(n, _)| n.visibility >= Visibility::Reduced); filter_and_sort_nodes( &filter, @@ -82,13 +88,22 @@ pub async fn r_library_node_filter<'a>( &mut children, ); - Ok(Either::Left(LayoutPage { - title: node.title.clone().unwrap_or_default(), - content: markup::new! { - @NodePage { node: &node, id: slug, udata: &udata, children: &children, parents: &parents, filter: &filter } - }, - ..Default::default() - })) + Ok(if *aj { + Either::Right(Json(ApiNodeResponse { + children, + parents, + node, + userdata: udata, + })) + } else { + Either::Left(LayoutPage { + title: node.title.clone().unwrap_or_default(), + content: markup::new! { + @NodePage { node: &node, id: slug, udata: &udata, children: &children, parents: &parents, filter: &filter } + }, + ..Default::default() + }) + }) } markup::define! { @@ -137,7 +152,7 @@ markup::define! { } } } - NodePage<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData, children: &'a [(Arc<Node>, NodeUserData)], parents: &'a [Arc<Node>], filter: &'a NodeFilterSort) { + NodePage<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData, children: &'a [(Arc<Node>, NodeUserData)], parents: &'a [(Arc<Node>, NodeUserData)], filter: &'a NodeFilterSort) { @if !matches!(node.kind, NodeKind::Collection) { img.backdrop[src=uri!(r_item_backdrop(id, Some(2048))), loading="lazy"]; } @@ -148,7 +163,7 @@ markup::define! { } .title { h1 { @node.title } - ul.parents { @for node in *parents { li { + ul.parents { @for (node, _) in *parents { li { a.component[href=uri!(r_library_node(&node.slug))] { @node.title } }}} @if node.media.is_some() { a.play[href=&uri!(r_player(id, PlayerConfig::default()))] { "Watch now" }} |