feat: Implement search result view & enable search
Implements a very simple and currently kinda broken-looking search result view.
This commit is contained in:
parent
dae97fdaf5
commit
4132869277
6 changed files with 90 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)?)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue