use super::{ account::session::Session, error::MyResult, layout::{DynLayoutPage, LayoutPage}, node::{DatabaseNodeUserDataExt, NodeCard}, }; use jellybase::database::Database; use rocket::{get, State}; use std::time::Instant; #[get("/search?&")] pub async fn r_search<'a>( session: Session, db: &State, query: Option<&str>, page: Option, ) -> MyResult> { let timing = Instant::now(); let results = if let Some(query) = query { let (count, ids) = db.search(query, page.unwrap_or_default())?; let nodes = ids .into_iter() .map(|id| db.get_node_with_userdata(id, &session)) .collect::, anyhow::Error>>()?; Some((count, nodes)) } else { None }; let search_dur = timing.elapsed(); let query = query.unwrap_or_default().to_string(); Ok(LayoutPage { title: "Search".to_string(), class: Some("search"), content: markup::new! { h1 { "Search" } form[action="", method="GET"] { input[type="text", name="query", placeholder="Search Term", value=&query]; input[type="submit", value="Search"]; } @if let Some((count, results)) = &results { h2 { "Results" } p.stats { @format!("Found {count} nodes in {search_dur:?}.") } ul.children {@for (node, udata) in results.iter() { li { @NodeCard { node, udata } } }} // TODO pagination } }, }) }