aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r--server/src/routes/ui/node.rs67
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" }}