about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@gmail.com>2018-04-08T16·02+0200
committerVincent Ambo <tazjin@gmail.com>2018-04-08T16·02+0200
commit6e56f8e729551ff14b7a72ca889b8dd38999fb2d (patch)
tree1533d6379077741191f57149a776297f8168bcdf /src
parent7dca9183c581f803f7b456712dfed655722986e8 (diff)
feat(main/templates): Add barebones single-thread view
Diffstat (limited to 'src')
-rw-r--r--src/main.rs28
-rw-r--r--src/models.rs2
2 files changed, 28 insertions, 2 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,