feat(handlers): Extract & add author to thread and post information

This commit is contained in:
Vincent Ambo 2018-04-09 09:20:27 +02:00
parent 64453ec683
commit 7c73949066
3 changed files with 46 additions and 6 deletions

View file

@ -81,10 +81,28 @@ pub fn forum_thread(state: State<AppState>, thread_id: Path<i32>) -> ConverseRes
.responder() .responder()
} }
#[derive(Deserialize)]
pub struct NewThreadForm {
pub title: String,
pub body: String,
}
/// This handler receives a "New thread"-form and redirects the user /// This handler receives a "New thread"-form and redirects the user
/// to the new thread after creation. /// to the new thread after creation.
pub fn submit_thread(state: State<AppState>, input: Form<NewThread>) -> ConverseResponse { pub fn submit_thread(state: State<AppState>,
state.db.send(CreateThread(input.0)) input: Form<NewThreadForm>,
mut req: HttpRequest<AppState>) -> ConverseResponse {
// Author is "unwrapped" because the RequireLogin middleware
// guarantees it to be present.
let author: Author = req.session().get(AUTHOR).unwrap().unwrap();
let new_thread = NewThread {
title: input.0.title,
body: input.0.body,
author_name: author.name,
author_email: author.email,
};
state.db.send(CreateThread(new_thread))
.from_err() .from_err()
.and_then(move |res| { .and_then(move |res| {
let thread = res?; let thread = res?;
@ -96,10 +114,28 @@ pub fn submit_thread(state: State<AppState>, input: Form<NewThread>) -> Converse
.responder() .responder()
} }
#[derive(Deserialize)]
pub struct NewPostForm {
pub thread_id: i32,
pub body: String,
}
/// This handler receives a "Reply"-form and redirects the user to the /// This handler receives a "Reply"-form and redirects the user to the
/// new post after creation. /// new post after creation.
pub fn reply_thread(state: State<AppState>, input: Form<NewPost>) -> ConverseResponse { pub fn reply_thread(state: State<AppState>,
state.db.send(CreatePost(input.0)) input: Form<NewPostForm>,
mut req: HttpRequest<AppState>) -> ConverseResponse {
// Author is "unwrapped" because the RequireLogin middleware
// guarantees it to be present.
let author: Author = req.session().get(AUTHOR).unwrap().unwrap();
let new_post = NewPost {
thread_id: input.thread_id,
body: input.0.body,
author_name: author.name,
author_email: author.email,
};
state.db.send(CreatePost(new_post))
.from_err() .from_err()
.and_then(move |res| { .and_then(move |res| {
let post = res?; let post = res?;

View file

@ -113,8 +113,8 @@ fn main() {
.middleware(sessions) .middleware(sessions)
.middleware(RequireLogin) .middleware(RequireLogin)
.resource("/", |r| r.method(Method::GET).with(forum_index)) .resource("/", |r| r.method(Method::GET).with(forum_index))
.resource("/thread/submit", |r| r.method(Method::POST).with2(submit_thread)) .resource("/thread/submit", |r| r.method(Method::POST).with3(submit_thread))
.resource("/thread/reply", |r| r.method(Method::POST).with2(reply_thread)) .resource("/thread/reply", |r| r.method(Method::POST).with3(reply_thread))
.resource("/thread/{id}", |r| r.method(Method::GET).with2(forum_thread)) .resource("/thread/{id}", |r| r.method(Method::GET).with2(forum_thread))
.resource("/oidc/login", |r| r.method(Method::GET).with(login)) .resource("/oidc/login", |r| r.method(Method::GET).with(login))
.resource("/oidc/callback", |r| r.method(Method::POST).with3(callback))}) .resource("/oidc/callback", |r| r.method(Method::POST).with3(callback))})

View file

@ -27,6 +27,8 @@ pub struct Post {
pub struct NewThread { pub struct NewThread {
pub title: String, pub title: String,
pub body: String, pub body: String,
pub author_name: String,
pub author_email: String,
} }
#[derive(Deserialize, Insertable)] #[derive(Deserialize, Insertable)]
@ -34,4 +36,6 @@ pub struct NewThread {
pub struct NewPost { pub struct NewPost {
pub thread_id: i32, pub thread_id: i32,
pub body: String, pub body: String,
pub author_name: String,
pub author_email: String,
} }