simple-web-app

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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 }