search.rs (1173B)
1 use askama::Template; 2 use axum::{ 3 response::{Html, Response}, 4 Form, 5 extract::State, 6 }; 7 use axum_extra::extract::cookie::CookieJar; 8 use serde::Deserialize; 9 10 use crate::error::AppError; 11 use crate::sse; 12 use crate::state::AppState; 13 use crate::templates::{ApplicationTemplate, SearchResultsTemplate, SearchTemplate}; 14 15 pub async fn open_search( 16 State(state): State<AppState>, 17 jar: CookieJar, 18 ) -> Result<Html<String>, AppError> { 19 let is_logged_in = state.get_user_id(&jar).await.is_some(); 20 let template = SearchTemplate { is_logged_in }; 21 let app = ApplicationTemplate { 22 content: template.render()?, 23 }; 24 Ok(Html(app.render()?)) 25 } 26 27 #[derive(Debug, Deserialize)] 28 pub struct SearchForm { 29 pub search: String, 30 } 31 32 pub async fn search( 33 State(state): State<AppState>, 34 _jar: CookieJar, 35 Form(form): Form<SearchForm>, 36 ) -> Result<Response, AppError> { 37 let results = if form.search.is_empty() { 38 Vec::new() 39 } else { 40 state.db().search_stories(&form.search, 20, 0.5).await? 41 }; 42 43 let template = SearchResultsTemplate { results }; 44 let html = template.render()?; 45 Ok(sse::patch_elements(&html)) 46 }