diff options
author | Vincent Ambo <tazjin@gmail.com> | 2018-04-08T16·02+0200 |
---|---|---|
committer | Vincent Ambo <tazjin@gmail.com> | 2018-04-08T16·02+0200 |
commit | 6e56f8e729551ff14b7a72ca889b8dd38999fb2d (patch) | |
tree | 1533d6379077741191f57149a776297f8168bcdf | |
parent | 7dca9183c581f803f7b456712dfed655722986e8 (diff) |
feat(main/templates): Add barebones single-thread view
-rw-r--r-- | src/main.rs | 28 | ||||
-rw-r--r-- | src/models.rs | 2 | ||||
-rw-r--r-- | templates/index.html | 2 | ||||
-rw-r--r-- | templates/thread.html | 14 |
4 files changed, 43 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index 419829b3e188..b26954d4285c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,7 +30,7 @@ use diesel::r2d2::{ConnectionManager, Pool}; use std::env; use db::*; use futures::Future; -use models::Thread; +use models::*; /// Represents the state carried by the web server actors. struct AppState { @@ -63,6 +63,31 @@ fn forum_index(req: HttpRequest<AppState>) -> FutureResponse<HttpResponse> { .responder() } +fn render_thread(tpl: &tera::Tera, thread: Thread, posts: Vec<Post>) -> HttpResponse { + let mut ctx = tera::Context::new(); + ctx.add("thread", &thread); + ctx.add("posts", &posts); + + let body = tpl.render("thread.html", &ctx).expect("Oh no"); + HttpResponse::Ok() + .content_type("text/html") + .body(body) +} + +fn forum_thread(req: HttpRequest<AppState>) -> FutureResponse<HttpResponse> { + let thread_id = req.match_info().query("id").unwrap(); + req.state().db.send(GetThread(thread_id)) + .from_err() + .and_then(move |res| match res { + Ok((thread, posts)) => Ok(render_thread(&req.state().tera, thread, posts)), + Err(err) => { + error!("Error loading thread {}: {}", thread_id, err); + Ok(HttpResponse::InternalServerError().into()) + } + }) + .responder() +} + fn main() { env_logger::init(); @@ -86,6 +111,7 @@ fn main() { App::with_state(AppState { db: db_addr.clone(), tera }) .middleware(middleware::Logger::default()) .route("/", http::Method::GET, &forum_index) + .route("/thread/{id}", http::Method::GET, &forum_thread) }).bind("127.0.0.1:4567").unwrap().start(); let _ = sys.run(); diff --git a/src/models.rs b/src/models.rs index 929bd0507e94..74b386a19cf9 100644 --- a/src/models.rs +++ b/src/models.rs @@ -8,7 +8,7 @@ pub struct Thread { pub posted: DateTime<Utc>, } -#[derive(Queryable)] +#[derive(Queryable, Serialize)] pub struct Post { pub id: i32, pub thread: i32, diff --git a/templates/index.html b/templates/index.html index 566715248a80..9faee49ca1f0 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,7 +7,7 @@ <h1>Welcome to Converse</h1> <ul> {% for thread in threads -%} - <li>{{ thread.title }} (posted at {{ thread.posted }})</li> + <li><a href="/thread/{{ thread.id }}">{{ thread.title }}</a> (posted at {{ thread.posted }})</li> {%- endfor %} </ul> </body> diff --git a/templates/thread.html b/templates/thread.html new file mode 100644 index 000000000000..e841668bfe41 --- /dev/null +++ b/templates/thread.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html> + <head> + <title>Converse: {{ thread.title }}</title> + </head> + <body> + <h1>{{ thread.title }}</h1> + + <p>{{ thread.body }}<br><i>Posted at {{ thread.posted }}</i></p> + {% for post in posts -%} + <li>{{ post.body }}<br><i>Posted at {{ post.posted }}</i></p> + {%- endfor %} + </body> +</html> |