diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-07 13:34:04 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-07 13:34:04 +0100 |
| commit | 3a6205f6077c1555f2f3bcf308f5e9605b8dbf53 (patch) | |
| tree | 0742ed69f9abf8973ee62291ba0984e7caffae18 /server | |
| parent | 4ce6d64648634bd8d22e8ed0676e0e5b22947dc3 (diff) | |
| download | jellything-3a6205f6077c1555f2f3bcf308f5e9605b8dbf53.tar jellything-3a6205f6077c1555f2f3bcf308f5e9605b8dbf53.tar.bz2 jellything-3a6205f6077c1555f2f3bcf308f5e9605b8dbf53.tar.zst | |
reenable node page extras
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/routes/node.rs | 235 |
1 files changed, 97 insertions, 138 deletions
diff --git a/server/src/routes/node.rs b/server/src/routes/node.rs index ca07bac..d7ef0b5 100644 --- a/server/src/routes/node.rs +++ b/server/src/routes/node.rs @@ -6,27 +6,33 @@ use super::error::MyResult; use crate::request_info::RequestInfo; -use anyhow::anyhow; +use anyhow::{Result, anyhow}; use jellycommon::{ - jellyobject::{EMPTY, Path}, + jellyobject::{EMPTY, Object, Path, Tag}, *, }; -use jellydb::{Filter, Query}; +use jellydb::{Filter, MultiBehaviour, Query, Sort, SortOrder, Transaction, ValueSort}; use jellyui::components::node_page::NodePage; use rocket::{get, response::content::RawHtml}; -use std::borrow::Cow; +use std::{borrow::Cow, collections::BTreeMap}; #[get("/n/<slug>")] pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> { ri.require_user()?; let mut nku = None; + let mut children = Vec::new(); + let mut credits = Vec::new(); + let mut credited = Vec::new(); ri.state.database.transaction(&mut |txn| { if let Some(row) = txn.query_single(Query { filter: Filter::Match(Path(vec![NO_SLUG.0]), slug.into()), ..Default::default() })? { let n = txn.get(row)?.unwrap(); + children = c_children(txn, row, &n)?; + credits = c_credits(txn, &n)?; + credited = c_credited(txn, row)?; nku = Some(Nku { node: Cow::Owned(n), userdata: Cow::Borrowed(EMPTY), @@ -42,146 +48,99 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> { Ok(ri.respond_ui(&NodePage { ri: &ri.render_info(), nku, + children: &children, + credited: &credited, + credits: &credits, })) } -// fn c_children( -// page: &mut ObjectBufferBuilder, -// txn: &mut dyn Transaction, -// row: u64, -// nku: &Object, -// ) -> Result<()> { -// let kind = nku -// .get(NKU_NODE) -// .unwrap_or_default() -// .get(NO_KIND) -// .unwrap_or(KIND_COLLECTION); - -// let (order, path) = match kind { -// KIND_CHANNEL => (SortOrder::Descending, Path(vec![NO_RELEASEDATE.0])), -// KIND_SEASON | KIND_SHOW => (SortOrder::Ascending, Path(vec![NO_INDEX.0])), -// _ => (SortOrder::Ascending, Path(vec![NO_TITLE.0])), -// }; - -// let children_rows = txn -// .query(Query { -// sort: Sort::Value(ValueSort { -// multi: MultiBehaviour::First, -// offset: None, -// order, -// path, -// }), -// filter: Filter::All(vec![ -// Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), -// Filter::Match(Path(vec![NO_PARENT.0]), row.into()), -// ]), -// ..Default::default() -// })? -// .collect::<Result<Vec<_>>>()?; - -// if children_rows.is_empty() { -// return Ok(()); -// } - -// let mut list = ObjectBufferBuilder::default(); - -// list.push( -// NODELIST_DISPLAYSTYLE, -// match kind { -// KIND_SEASON | KIND_SHOW => NLSTYLE_LIST, -// _ => NLSTYLE_GRID, -// }, -// ); - -// for (row, _) in children_rows { -// list.push( -// NODELIST_ITEM, -// Object::EMPTY -// .insert(NKU_NODE, txn.get(row)?.unwrap().as_object()) -// .as_object(), -// ); -// } - -// page.push(VIEW_NODE_LIST, list.finish().as_object()); -// Ok(()) -// } - -// fn c_credits( -// page: &mut ObjectBufferBuilder, -// txn: &mut dyn Transaction, -// nku: &Object, -// ) -> Result<()> { -// if !nku.get(NKU_NODE).unwrap_or_default().has(NO_CREDIT.0) { -// return Ok(()); -// } - -// let mut cats = BTreeMap::<_, Vec<_>>::new(); -// for cred in nku.get(NKU_NODE).unwrap_or_default().iter(NO_CREDIT) { -// let mut o = ObjectBuffer::empty(); -// if let Some(row) = cred.get(CR_NODE) { -// let node = txn.get(row)?.unwrap(); -// o = o.as_object().insert(NKU_NODE, node.as_object()); -// } -// if let Some(role) = cred.get(CR_ROLE) { -// o = o.as_object().insert(NKU_ROLE, role) -// } -// cats.entry(cred.get(CR_KIND).unwrap_or(CRCAT_CREW)) -// .or_default() -// .push(o); -// } -// let mut cats = cats.into_iter().collect::<Vec<_>>(); -// cats.sort_by_key(|(c, _)| match *c { -// CRCAT_CAST => 0, -// CRCAT_CREW => 1, -// _ => 100, -// }); -// for (cat, elems) in cats { -// let mut list = ObjectBufferBuilder::default(); -// list.push(NODELIST_DISPLAYSTYLE, NLSTYLE_INLINE); -// list.push(NODELIST_TITLE, &format!("tag.cred.kind.{cat}")); -// for item in elems { -// list.push(NODELIST_ITEM, item.as_object()); -// } -// page.push(VIEW_NODE_LIST, list.finish().as_object()); -// } +fn c_children(txn: &mut dyn Transaction, row: u64, node: &Object) -> Result<Vec<Nku<'static>>> { + let kind = node.get(NO_KIND).unwrap_or(KIND_COLLECTION); + let (order, path) = match kind { + KIND_CHANNEL => (SortOrder::Descending, Path(vec![NO_RELEASEDATE.0])), + KIND_SEASON | KIND_SHOW => (SortOrder::Ascending, Path(vec![NO_INDEX.0])), + _ => (SortOrder::Ascending, Path(vec![NO_TITLE.0])), + }; -// Ok(()) -// } + let children_rows = txn + .query(Query { + sort: Sort::Value(ValueSort { + multi: MultiBehaviour::First, + offset: None, + order, + path, + }), + filter: Filter::All(vec![ + Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), + Filter::Match(Path(vec![NO_PARENT.0]), row.into()), + ]), + ..Default::default() + })? + .collect::<Result<Vec<_>>>()?; -// fn c_credited(page: &mut ObjectBufferBuilder, txn: &mut dyn Transaction, row: u64) -> Result<()> { -// let children_rows = txn -// .query(Query { -// sort: Sort::Value(ValueSort { -// multi: MultiBehaviour::First, -// offset: None, -// order: SortOrder::Ascending, -// path: Path(vec![NO_TITLE.0]), -// }), -// filter: Filter::All(vec![ -// Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), -// Filter::Match(Path(vec![NO_CREDIT.0, CR_NODE.0]), row.into()), -// ]), -// ..Default::default() -// })? -// .collect::<Result<Vec<_>>>()?; + let mut list = Vec::new(); + for (row, _) in children_rows { + list.push(Nku { + node: Cow::Owned(txn.get(row)?.unwrap()), + role: None, + userdata: Cow::Borrowed(EMPTY), + }); + } + Ok(list) +} -// if children_rows.is_empty() { -// return Ok(()); -// } +fn c_credits(txn: &mut dyn Transaction, node: &Object) -> Result<Vec<(Tag, Vec<Nku<'static>>)>> { + if !node.has(NO_CREDIT.0) { + return Ok(Vec::new()); + } -// let mut list = ObjectBufferBuilder::default(); -// list.push(NODELIST_DISPLAYSTYLE, NLSTYLE_GRID); -// list.push(NODELIST_TITLE, "node.credited"); + let mut cats = BTreeMap::<_, Vec<_>>::new(); + for cred in node.iter(NO_CREDIT) { + let Some(row) = cred.get(CR_NODE) else { + continue; + }; + cred.get(CR_ROLE); + cats.entry(cred.get(CR_KIND).unwrap_or(CRCAT_CREW)) + .or_default() + .push(Nku { + node: Cow::Owned(txn.get(row)?.unwrap()), + role: cred.get(CR_ROLE).map(String::from).map(Cow::Owned), + userdata: Cow::Borrowed(EMPTY), + }); + } + let mut cats = cats.into_iter().collect::<Vec<_>>(); + cats.sort_by_key(|(c, _)| match *c { + CRCAT_CAST => 0, + CRCAT_CREW => 1, + _ => 100, + }); + Ok(cats) +} -// for (row, _) in children_rows { -// list.push( -// NODELIST_ITEM, -// Object::EMPTY -// .insert(NKU_NODE, txn.get(row)?.unwrap().as_object()) -// .as_object(), -// ); -// } +fn c_credited(txn: &mut dyn Transaction, row: u64) -> Result<Vec<Nku<'static>>> { + let children_rows = txn + .query(Query { + sort: Sort::Value(ValueSort { + multi: MultiBehaviour::First, + offset: None, + order: SortOrder::Ascending, + path: Path(vec![NO_TITLE.0]), + }), + filter: Filter::All(vec![ + Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), + Filter::Match(Path(vec![NO_CREDIT.0, CR_NODE.0]), row.into()), + ]), + ..Default::default() + })? + .collect::<Result<Vec<_>>>()?; -// page.push(VIEW_NODE_LIST, list.finish().as_object()); -// Ok(()) -// } + let mut list = Vec::new(); + for (row, _) in children_rows { + list.push(Nku { + node: Cow::Owned(txn.get(row)?.unwrap()), + role: None, + userdata: Cow::Borrowed(EMPTY), + }); + } + Ok(list) +} |