/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin */ use super::error::MyResult; use crate::{request_info::RequestInfo, routes::node::create_nku}; use jellycommon::{jellyobject::Path, *}; use jellydb::{Filter, Query, Sort}; use jellyui::components::search::Search; use log::info; use rocket::{get, response::content::RawHtml}; use std::time::Instant; #[get("/search?")] pub async fn r_search(ri: RequestInfo<'_>, q: Option<&str>) -> MyResult> { ri.require_user()?; let mut items = Vec::new(); if let Some(q) = q { let t = Instant::now(); ri.state.database.transaction(&mut |txn| { let rows = txn .query(Query { filter: Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), sort: Sort::TextSearch( vec![ Path(vec![NO_TITLE.0]), Path(vec![NO_DESCRIPTION.0]), Path(vec![NO_TAGLINE.0]), Path(vec![NO_SUBTITLE.0]), ], q.to_owned(), ), ..Default::default() })? .take(64) .collect::, _>>()?; items.clear(); for (row, _is) in rows { items.push(create_nku(txn, row)?); } Ok(()) })?; info!("search {q:?} took {:?}", t.elapsed()); } Ok(ri.respond_ui(&Search { query: q.unwrap_or_default(), items: &items, ri: &ri.render_info(), cont: None, })) }