aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/ui/node.rs')
-rw-r--r--server/src/ui/node.rs106
1 files changed, 38 insertions, 68 deletions
diff --git a/server/src/ui/node.rs b/server/src/ui/node.rs
index 5d0f1ff..1a0ff16 100644
--- a/server/src/ui/node.rs
+++ b/server/src/ui/node.rs
@@ -3,25 +3,23 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
-use super::{error::MyResult, sort::filter_and_sort_nodes};
-use crate::{api::AcceptJson, database::Database, locale::AcceptLanguage, logic::session::Session};
-use anyhow::{anyhow, Result};
+use super::error::MyResult;
+use crate::{api::AcceptJson, database::Database, locale::AcceptLanguage};
use jellycommon::{
- api::{ApiNodeResponse, NodeFilterSort, SortOrder, SortProperty},
- user::NodeUserData,
- Node, NodeID, NodeKind, Visibility,
+ api::{ApiNodeResponse, NodeFilterSort},
+ NodeID,
};
-use rocket::{get, serde::json::Json, Either, State};
-use std::{cmp::Reverse, collections::BTreeMap, sync::Arc};
-
-/// This function is a stub and only useful for use in the uri! macro.
-#[get("/n/<id>")]
-pub fn r_library_node(id: NodeID) {
- let _ = id;
-}
+use jellyimport::is_importing;
+use jellylogic::{node::get_node, session::Session};
+use jellyui::{
+ node_page::NodePage,
+ render_page,
+ scaffold::{RenderInfo, SessionInfo},
+};
+use rocket::{get, response::content::RawHtml, serde::json::Json, Either, State};
#[get("/n/<id>?<parents>&<children>&<filter..>")]
-pub async fn r_library_node_filter<'a>(
+pub async fn r_node<'a>(
session: Session,
id: NodeID,
db: &'a State<Database>,
@@ -30,65 +28,37 @@ pub async fn r_library_node_filter<'a>(
lang: AcceptLanguage,
parents: bool,
children: bool,
-) -> MyResult<Either<DynLayoutPage<'a>, Json<ApiNodeResponse>>> {
+) -> MyResult<Either<RawHtml<String>, Json<ApiNodeResponse>>> {
let AcceptLanguage(lang) = lang;
- let (node, udata) = db.get_node_with_userdata(id, &session)?;
- 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 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 similar = get_similar_media(&node, db, &session)?;
-
- similar.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,
- match node.kind {
- NodeKind::Channel => (SortProperty::ReleaseDate, SortOrder::Descending),
- NodeKind::Season | NodeKind::Show => (SortProperty::Index, SortOrder::Ascending),
- _ => (SortProperty::Title, SortOrder::Ascending),
- },
- &mut children,
- );
+ let r = get_node(
+ &db,
+ id,
+ &session,
+ !*aj || children,
+ !*aj || parents,
+ filter.clone(),
+ )?;
Ok(if *aj {
- Either::Right(Json(ApiNodeResponse {
- children,
- parents,
- node,
- userdata: udata,
- }))
+ Either::Right(Json(r))
} else {
- Either::Left(LayoutPage {
- title: node.title.clone().unwrap_or_default(),
- content: markup::new!(@NodePage {
- node: &node,
- udata: &udata,
- children: &children,
- parents: &parents,
+ Either::Left(RawHtml(render_page(
+ &NodePage {
+ node: &r.node,
+ udata: &r.userdata,
+ children: &r.children,
+ parents: &r.parents,
+ similar: &[],
filter: &filter,
- player: false,
- similar: &similar,
lang: &lang,
- }),
- ..Default::default()
- })
+ player: false,
+ },
+ RenderInfo {
+ importing: is_importing(),
+ session: Some(SessionInfo { user: session.user }),
+ },
+ lang,
+ )))
})
}