#![cfg_attr(feature = "cargo-clippy", allow(needless_pass_by_value))] use comrak::{markdown_to_html, ComrakOptions}; use models::{NewPost, Post}; use rocket::{ request::Form, response::{Flash, Redirect}, Route, }; use utils::{DbConn, Page}; #[derive(BartDisplay)] #[template = "templates/new_post.html"] pub struct NewPostTemplate { post: NewPost, } implement_responder_for!(NewPostTemplate); #[get("/new", format = "text/html")] fn new(_conn: DbConn) -> Page { Page { title: String::from("New post"), flash: None, content: NewPostTemplate { post: Default::default(), }, } } #[post("/create", data = "")] fn create(post: Form, conn: DbConn) -> Flash { Post::create(post.get(), &conn); Flash::success(Redirect::to("/"), "Post successfully created!") } #[derive(BartDisplay)] #[template = "templates/show_post.html"] pub struct ShowPostTemplate { pub post: Post, } implement_responder_for!(ShowPostTemplate); impl ShowPostTemplate { pub fn rendered_body(&self) -> String { markdown_to_html(&self.post.body, &ComrakOptions::default()) } } #[get("/", format = "text/html")] fn show(id: i32, conn: DbConn) -> Page { let p = Post::get(id, &conn); Page { title: p.title.clone(), flash: None, content: ShowPostTemplate { post: p }, } } #[derive(BartDisplay)] #[template = "templates/edit_post.html"] pub struct EditPostTemplate { post: Post, } implement_responder_for!(EditPostTemplate); #[get("//edit", format = "text/html")] fn edit(id: i32, conn: DbConn) -> Page { let p = Post::get(id, &conn); Page { title: String::from("Edit post"), flash: None, content: EditPostTemplate { post: p }, } } #[post("/update", data = "")] fn update(post: Form, conn: DbConn) -> Flash { Post::update(post.get(), &conn); Flash::success(Redirect::to("/"), "Post updated successfully!") } #[get("//delete", format = "text/html")] fn delete(id: i32, conn: DbConn) -> Flash { Post::delete(id, &conn); Flash::success(Redirect::to("/"), "Post deleted!") } pub fn routes() -> Vec { routes![new, create, show, edit, update, delete] }