From 0ce64a50b763d2b19f5ca254233370418f4b7658 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 6 Feb 2025 16:52:46 +0100 Subject: add json capability to most useful endpoints --- server/src/routes/ui/browser.rs | 57 ++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 24 deletions(-) (limited to 'server/src/routes/ui/browser.rs') diff --git a/server/src/routes/ui/browser.rs b/server/src/routes/ui/browser.rs index 7affbac..13f30c8 100644 --- a/server/src/routes/ui/browser.rs +++ b/server/src/routes/ui/browser.rs @@ -6,13 +6,13 @@ use super::{ account::session::Session, error::MyError, - layout::DynLayoutPage, + layout::{DynLayoutPage, LayoutPage}, node::NodeCard, sort::{filter_and_sort_nodes, NodeFilterSort, NodeFilterSortForm, SortOrder, SortProperty}, }; -use crate::{database::Database, uri}; -use jellycommon::Visibility; -use rocket::{get, State}; +use crate::{database::Database, routes::api::AcceptJson, uri}; +use jellycommon::{api::ApiItemsResponse, Visibility}; +use rocket::{get, serde::json::Json, Either, State}; /// This function is a stub and only useful for use in the uri! macro. #[get("/items")] @@ -22,9 +22,10 @@ pub fn r_all_items() {} pub fn r_all_items_filter( sess: Session, db: &State, + aj: AcceptJson, page: Option, filter: NodeFilterSort, -) -> Result, MyError> { +) -> Result, Json>, MyError> { let mut items = db.list_nodes_with_udata(sess.user.name.as_str())?; items.retain(|(n, _)| matches!(n.visibility, Visibility::Visible)); @@ -42,26 +43,34 @@ pub fn r_all_items_filter( let to = (offset + page_size).min(items.len()); let max_page = items.len().div_ceil(page_size); - Ok(super::layout::LayoutPage { - title: "All Items".to_owned(), - content: markup::new! { - .page.dir { - h1 { "All Items" } - @NodeFilterSortForm { f: &filter } - ul.children { @for (node, udata) in &items[from..to] { - li {@NodeCard { node, udata }} - }} - p.pagecontrols { - span.current { "Page " @{page + 1} " of " @max_page " " } - @if page > 0 { - a.prev[href=uri!(r_all_items_filter(Some(page - 1), filter.clone()))] { "Previous page" } " " - } - @if page + 1 < max_page { - a.next[href=uri!(r_all_items_filter(Some(page + 1), filter.clone()))] { "Next page" } + Ok(if *aj { + Either::Right(Json(ApiItemsResponse { + count: items.len(), + pages: max_page, + items: items[from..to].to_vec(), + })) + } else { + Either::Left(LayoutPage { + title: "All Items".to_owned(), + content: markup::new! { + .page.dir { + h1 { "All Items" } + @NodeFilterSortForm { f: &filter } + ul.children { @for (node, udata) in &items[from..to] { + li {@NodeCard { node, udata }} + }} + p.pagecontrols { + span.current { "Page " @{page + 1} " of " @max_page " " } + @if page > 0 { + a.prev[href=uri!(r_all_items_filter(Some(page - 1), filter.clone()))] { "Previous page" } " " + } + @if page + 1 < max_page { + a.next[href=uri!(r_all_items_filter(Some(page + 1), filter.clone()))] { "Next page" } + } } } - } - }, - ..Default::default() + }, + ..Default::default() + }) }) } -- cgit v1.2.3-70-g09d2