aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/node.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-27 20:56:20 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-27 20:56:20 +0100
commit7930d543a2aa68d4ad2958605827d7eb1baa91f8 (patch)
treefe59d1f549e303a96b78d3e925d75abb70b73af0 /server/src/ui/node.rs
parentc05bfcc2775f0e11db6e856bfcf06d0419c35d54 (diff)
downloadjellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar
jellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar.bz2
jellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar.zst
reimplement Object as slice type
Diffstat (limited to 'server/src/ui/node.rs')
-rw-r--r--server/src/ui/node.rs295
1 files changed, 146 insertions, 149 deletions
diff --git a/server/src/ui/node.rs b/server/src/ui/node.rs
index 55a1d09..ca07bac 100644
--- a/server/src/ui/node.rs
+++ b/server/src/ui/node.rs
@@ -5,186 +5,183 @@
*/
use super::error::MyResult;
-use crate::{request_info::RequestInfo, ui_responder::UiResponse};
-use anyhow::Result;
+use crate::request_info::RequestInfo;
+use anyhow::anyhow;
use jellycommon::{
- jellyobject::{OBB, Object, ObjectBuffer, ObjectBufferBuilder, Path},
+ jellyobject::{EMPTY, Path},
*,
};
-use jellydb::{Filter, MultiBehaviour, Query, Sort, SortOrder, Transaction, ValueSort};
-use rocket::get;
-use std::collections::BTreeMap;
+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<UiResponse> {
+pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> {
ri.require_user()?;
- let mut page = OBB::new();
+ 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();
- let nku = Object::EMPTY.insert(NKU_NODE, n.as_object());
- let nku = nku.as_object();
-
- page = OBB::new();
- let title = nku
- .get(NKU_NODE)
- .unwrap_or_default()
- .get(NO_TITLE)
- .unwrap_or_default();
-
- page.push(VIEW_TITLE, title);
- page.push(VIEW_NODE_PAGE, nku);
- c_children(&mut page, txn, row, &nku)?;
- c_credits(&mut page, txn, &nku)?;
- c_credited(&mut page, txn, row)?;
+ 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(page))
+ 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);
+// 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 (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<_>>>()?;
+// 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(());
- }
+// if children_rows.is_empty() {
+// return Ok(());
+// }
- let mut list = ObjectBufferBuilder::default();
+// let mut list = ObjectBufferBuilder::default();
- list.push(
- NODELIST_DISPLAYSTYLE,
- match kind {
- KIND_SEASON | KIND_SHOW => NLSTYLE_LIST,
- _ => NLSTYLE_GRID,
- },
- );
+// 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(),
- );
- }
+// 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(())
-}
+// 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(());
- }
+// 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());
- }
+// 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(())
-}
+// 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<_>>>()?;
+// 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(());
- }
+// if children_rows.is_empty() {
+// return Ok(());
+// }
- let mut list = ObjectBufferBuilder::default();
- list.push(NODELIST_DISPLAYSTYLE, NLSTYLE_GRID);
- list.push(NODELIST_TITLE, "node.credited");
+// 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(),
- );
- }
+// 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(())
-}
+// page.push(VIEW_NODE_LIST, list.finish().as_object());
+// Ok(())
+// }