aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/node.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-02 15:53:12 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-02 15:53:12 +0100
commit516f87ac2c7dcd48d457912ebec1d5b5e6bf7e3a (patch)
tree09535e2562c26a24acd43387fc2888e97c0d9694 /server/src/routes/node.rs
parentf9d5bfc7ba1f9dba714e71c39c63a5f4622ebd85 (diff)
downloadjellything-516f87ac2c7dcd48d457912ebec1d5b5e6bf7e3a.tar
jellything-516f87ac2c7dcd48d457912ebec1d5b5e6bf7e3a.tar.bz2
jellything-516f87ac2c7dcd48d457912ebec1d5b5e6bf7e3a.tar.zst
move files around
Diffstat (limited to 'server/src/routes/node.rs')
-rw-r--r--server/src/routes/node.rs187
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(())
+// }