diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-29 18:03:06 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-29 18:03:06 +0100 |
commit | db511d3fe50f05329615f718515fab1b80d9e06a (patch) | |
tree | 7969fea01be100cbe4385ad13a14940a987ac513 /server/src/routes/ui/search.rs | |
parent | 82e8a55a1496ae9132e13e7286fe1c0d57d586d3 (diff) | |
download | jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar.bz2 jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar.zst |
no direct redb access
Diffstat (limited to 'server/src/routes/ui/search.rs')
-rw-r--r-- | server/src/routes/ui/search.rs | 58 |
1 files changed, 11 insertions, 47 deletions
diff --git a/server/src/routes/ui/search.rs b/server/src/routes/ui/search.rs index c1f9865..ac37b80 100644 --- a/server/src/routes/ui/search.rs +++ b/server/src/routes/ui/search.rs @@ -2,63 +2,27 @@ use super::{ account::session::Session, error::MyResult, layout::{DynLayoutPage, LayoutPage}, - node::NodeCard, -}; -use anyhow::{anyhow, Context}; -use jellybase::{ - database::{ - tantivy::{ - collector::{Count, TopDocs}, - query::QueryParser, - schema::Value, - TantivyDocument, - }, - DataAcid, TableExt, T_NODE, T_USER_NODE, - }, - permission::NodePermissionExt, + node::{DatabaseNodeUserDataExt, NodeCard}, }; +use jellybase::database::Database; use rocket::{get, State}; use std::time::Instant; #[get("/search?<query>&<page>")] pub async fn r_search<'a>( session: Session, - db: &State<DataAcid>, + db: &State<Database>, query: Option<&str>, page: Option<usize>, ) -> MyResult<DynLayoutPage<'a>> { let timing = Instant::now(); let results = if let Some(query) = query { - let query = QueryParser::for_index( - &db.node_index.index, - vec![db.node_index.title, db.node_index.description], - ) - .parse_query(query) - .context("parsing query")?; - - let searcher = db.node_index.reader.searcher(); - let sres = searcher.search( - &query, - &TopDocs::with_limit(32).and_offset(page.unwrap_or_default() * 32), - )?; - let scount = searcher.search(&query, &Count)?; - - let mut results = Vec::new(); - for (_, daddr) in sres { - let doc: TantivyDocument = searcher.doc(daddr)?; - let id = doc.get_first(db.node_index.id).unwrap().as_str().unwrap(); - - let node = T_NODE - .get(db, id)? - .only_if_permitted(&session.user.permissions) - .ok_or(anyhow!("node does not exist"))?; - let udata = T_USER_NODE - .get(db, &(session.user.name.as_str(), id))? - .unwrap_or_default(); - - results.push((id.to_owned(), node, udata)); - } - Some((scount, results)) + 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::<Result<Vec<_>, anyhow::Error>>()?; + Some((count, nodes)) } else { None }; @@ -77,8 +41,8 @@ pub async fn r_search<'a>( @if let Some((count, results)) = &results { h2 { "Results" } p.stats { @format!("Found {count} nodes in {search_dur:?}.") } - ul.children {@for (id, node, udata) in results.iter() { - li { @NodeCard { id, node, udata } } + ul.children {@for (node, udata) in results.iter() { + li { @NodeCard { node, udata } } }} // TODO pagination } |