about summary refs log tree commit diff
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
parent7dca9183c581f803f7b456712dfed655722986e8 (diff)
feat(main/templates): Add barebones single-thread view
-rw-r--r--src/main.rs28
-rw-r--r--src/models.rs2
-rw-r--r--templates/index.html2
-rw-r--r--templates/thread.html14
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>