aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/request_info.rs8
-rw-r--r--server/src/ui/node.rs53
-rw-r--r--server/src/ui_responder.rs6
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),
}
}
}