diff options
Diffstat (limited to 'server/src/ui/node.rs')
| -rw-r--r-- | server/src/ui/node.rs | 53 |
1 files changed, 51 insertions, 2 deletions
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()), + )) } |