feat: Implement search result view & enable search

Implements a very simple and currently kinda broken-looking search
result view.
This commit is contained in:
Vincent Ambo 2018-04-14 22:06:30 +02:00 committed by Vincent Ambo
parent dae97fdaf5
commit 4132869277
6 changed files with 90 additions and 4 deletions

View file

@ -176,6 +176,22 @@ pub fn reply_thread(state: State<AppState>,
.responder()
}
/// This handler executes a full-text search on the forum database and
/// displays the results to the user.
pub fn search_forum(state: State<AppState>,
query: Form<SearchPosts>) -> ConverseResponse {
let query_string = query.0.query.clone();
state.db.send(query.0)
.flatten()
.and_then(move |results| state.renderer.send(SearchResultPage {
results,
query: query_string,
}).from_err())
.flatten()
.map(|res| HttpResponse::Ok().content_type(HTML).body(res))
.responder()
}
/// This handler initiates an OIDC login.
pub fn login(state: State<AppState>) -> ConverseResponse {
state.oidc.send(GetLoginUrl)

View file

@ -153,6 +153,7 @@ fn main() {
.resource("/thread/submit", |r| r.method(Method::POST).with3(submit_thread))
.resource("/thread/reply", |r| r.method(Method::POST).with3(reply_thread))
.resource("/thread/{id}", |r| r.method(Method::GET).with2(forum_thread))
.resource("/search", |r| r.method(Method::POST).with2(search_forum))
.resource("/oidc/login", |r| r.method(Method::GET).with(login))
.resource("/oidc/callback", |r| r.method(Method::POST).with3(callback));

View file

@ -74,7 +74,7 @@ pub struct NewPost {
/// This struct models the response of a full-text search query. It
/// does not use a table/schema definition struct like the other
/// tables, as no table of this type actually exists.
#[derive(QueryableByName, Debug)]
#[derive(QueryableByName, Debug, Serialize)]
pub struct SearchResult {
#[sql_type = "Integer"]
pub post_id: i32,

View file

@ -175,3 +175,24 @@ impl Handler<NewThreadPage> for Renderer {
Ok(self.tera.render("new-thread.html", &ctx)?)
}
}
/// Message used to render search results
pub struct SearchResultPage {
pub query: String,
pub results: Vec<SearchResult>,
}
impl Message for SearchResultPage {
type Result = Result<String>;
}
impl Handler<SearchResultPage> for Renderer {
type Result = Result<String>;
fn handle(&mut self, msg: SearchResultPage, _: &mut Self::Context) -> Self::Result {
let mut ctx = Context::new();
ctx.add("query", &msg.query);
ctx.add("results", &msg.results);
Ok(self.tera.render("search.html", &ctx)?)
}
}