diff options
Diffstat (limited to 'server/src/routes/node.rs')
| -rw-r--r-- | server/src/routes/node.rs | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/server/src/routes/node.rs b/server/src/routes/node.rs new file mode 100644 index 0000000..ca07bac --- /dev/null +++ b/server/src/routes/node.rs @@ -0,0 +1,187 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2026 metamuffin <metamuffin.org> +*/ + +use super::error::MyResult; +use crate::request_info::RequestInfo; +use anyhow::anyhow; +use jellycommon::{ + jellyobject::{EMPTY, Path}, + *, +}; +use jellydb::{Filter, Query}; +use jellyui::components::node_page::NodePage; +use rocket::{get, response::content::RawHtml}; +use std::borrow::Cow; + +#[get("/n/<slug>")] +pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> { + ri.require_user()?; + + let mut nku = None; + 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(); + nku = Some(Nku { + node: Cow::Owned(n), + userdata: Cow::Borrowed(EMPTY), + role: None, + }); + } + Ok(()) + })?; + let Some(nku) = nku else { + Err(anyhow!("no such node"))? + }; + + Ok(ri.respond_ui(&NodePage { + ri: &ri.render_info(), + nku, + })) +} + +// 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()); +// } + +// Ok(()) +// } + +// 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<_>>>()?; + +// if children_rows.is_empty() { +// return Ok(()); +// } + +// let mut list = ObjectBufferBuilder::default(); +// list.push(NODELIST_DISPLAYSTYLE, NLSTYLE_GRID); +// list.push(NODELIST_TITLE, "node.credited"); + +// 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(()) +// } |