diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-17 00:17:48 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-17 00:17:48 +0100 |
| commit | ee59ba81602a209c2262846032d7e936cb2e8d1f (patch) | |
| tree | 054fdb7614f17fd658aca6655e49d315b57d1e19 /server/src | |
| parent | f8b6afd57efc1a9e7e12fe1316bc45dcc6f32470 (diff) | |
| download | jellything-ee59ba81602a209c2262846032d7e936cb2e8d1f.tar jellything-ee59ba81602a209c2262846032d7e936cb2e8d1f.tar.bz2 jellything-ee59ba81602a209c2262846032d7e936cb2e8d1f.tar.zst | |
node page
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/request_info.rs | 8 | ||||
| -rw-r--r-- | server/src/ui/node.rs | 53 | ||||
| -rw-r--r-- | server/src/ui_responder.rs | 6 |
3 files changed, 61 insertions, 6 deletions
diff --git a/server/src/request_info.rs b/server/src/request_info.rs index 6ed311e..49b416a 100644 --- a/server/src/request_info.rs +++ b/server/src/request_info.rs @@ -25,7 +25,7 @@ use std::sync::Arc; pub struct RequestInfo<'a> { pub lang: &'a str, pub accept: Accept, - pub debug: bool, + pub debug: &'a str, pub user: Option<ObjectBuffer>, pub state: Arc<State>, } @@ -49,7 +49,11 @@ impl<'a> RequestInfo<'a> { accept: Accept::from_request_ut(request), user: user_from_request(state, request)?, state: state.clone(), - debug: request.query_value::<&str>("debug").is_some(), + debug: request + .query_value::<&str>("debug") + .transpose() + .unwrap() + .unwrap_or("none"), }) } pub fn require_user(&'a self) -> MyResult<Object<'a>> { diff --git a/server/src/ui/node.rs b/server/src/ui/node.rs index 0473a94..d510c71 100644 --- a/server/src/ui/node.rs +++ b/server/src/ui/node.rs @@ -5,11 +5,60 @@ */ use super::error::MyResult; use crate::{request_info::RequestInfo, ui_responder::UiResponse}; -use jellycommon::jellyobject::ObjectBuffer; +use anyhow::{Result, anyhow}; +use jellycommon::{ + jellyobject::{Object, Path}, + *, +}; +use jellydb::{Filter, Query, Sort}; use rocket::get; #[get("/n/<slug>")] pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<UiResponse> { ri.require_user()?; - Ok(ri.respond_ui(ObjectBuffer::empty())) + + let mut node = None; + let mut children = None; + ri.state.database.transaction(&mut |txn| { + if let Some(row) = txn.query_single(Query { + filter: Filter::Match(Path(vec![NO_SLUG.0]), slug.as_bytes().to_vec()), + sort: Sort::None, + })? { + node = Some(Object::EMPTY.insert(NKU_NODE, txn.get(row)?.unwrap().as_object())); + + let rows = txn + .query(Query { + sort: Sort::None, + filter: Filter::Match(Path(vec![NO_PARENT.0]), row.to_be_bytes().to_vec()), + })? + .collect::<Result<Vec<_>>>()?; + + children = Some( + rows.into_iter() + .map(|(row, _)| { + Ok(Object::EMPTY.insert(NKU_NODE, txn.get(row)?.unwrap().as_object())) + }) + .collect::<Result<Vec<_>>>()?, + ); + } + Ok(()) + })?; + + let (Some(node), Some(children)) = (node, children) else { + Err(anyhow!("not found"))? + }; + + let children = children.iter().map(|c| c.as_object()).collect::<Vec<_>>(); + + let mut children_list = Object::EMPTY.insert(NODELIST_DISPLAYSTYLE, NLSTYLE_GRID); + children_list = children_list + .as_object() + .insert_multi(NODELIST_ITEM, &children); + + Ok(ri.respond_ui( + Object::EMPTY + .insert(VIEW_NODE_PAGE, node.as_object()) + .as_object() + .insert(VIEW_NODE_LIST, children_list.as_object()), + )) } diff --git a/server/src/ui_responder.rs b/server/src/ui_responder.rs index 2df6208..aed91a2 100644 --- a/server/src/ui_responder.rs +++ b/server/src/ui_responder.rs @@ -23,9 +23,11 @@ pub enum UiResponse { impl RequestInfo<'_> { pub fn respond_ui(&self, view: ObjectBuffer) -> UiResponse { - if self.debug { + if self.debug == "json" { let value = object_to_json(&TAGREG, view.as_object()); UiResponse::Json(serde_json::to_string(&value).unwrap()) + } else if self.debug == "raw" { + UiResponse::Object(view) } else { UiResponse::Html(render_view(self.render_info(), view.as_object())) } @@ -37,7 +39,7 @@ impl<'r, 'o: 'r> Responder<'r, 'o> for UiResponse { match self { UiResponse::Html(x) => RawHtml(x).respond_to(request), UiResponse::Json(x) => RawJson(x).respond_to(request), - UiResponse::Object(_) => todo!(), + UiResponse::Object(x) => x.to_bytes().respond_to(request), } } } |