diff --git a/Cargo.toml b/Cargo.toml index 8f4e7c4..ccc5131 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,19 +2,15 @@ name = "codigocomentado" version = "0.1.0" authors = ["kirbylife "] -edition = "2018" +edition = "2021" [dependencies] -rocket = "0.4.11" +rocket = { version = "0.5.0", features = ["secrets"] } +rocket_dyn_templates = { version = "0.1.0", features = ["tera"] } diesel = { version = "1.0.0", features = ["postgres", "chrono"] } dotenv = "0.9.0" rand = "0.6.0" chrono = { version = "0.4.9", features = ["serde"] } serde = { version = "1.0", features = ["derive"] } -tera = "0.11" comrak = "0.6" - -[dependencies.rocket_contrib] -version = "0.4.2" -default-features = false -features = ["json", "serve", "handlebars_templates", "tera_templates"] \ No newline at end of file +tera = "1.19.1" diff --git a/Rocket.toml b/Rocket.toml new file mode 100644 index 0000000..b6315da --- /dev/null +++ b/Rocket.toml @@ -0,0 +1,7 @@ +[default] +address = "0.0.0.0" +limits = { form = "100 MiB", json = "100 MiB" } +port = 8000 + +[release] +secret_key = "openssl rand -base64 32" diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..36c419b --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +edition = "2021" \ No newline at end of file diff --git a/src/admin.rs b/src/admin.rs index 5b93cec..111d77c 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -1,11 +1,11 @@ +use crate::contexts; use crate::controllers::posts; -use crate::misc::get_context; use crate::models::NewPost; -use rocket::http::{Cookie, Cookies}; -use rocket::request::Form; +use rocket::form::Form; +use rocket::http::{Cookie, CookieJar}; use rocket::response::Redirect; use rocket::Route; -use rocket_contrib::templates::Template; +use rocket_dyn_templates::Template; use std::env; use std::vec::Vec; @@ -16,20 +16,20 @@ struct Login { } #[get("/")] -fn index(mut cookies: Cookies<'_>) -> Result { +fn index(cookies: &CookieJar<'_>) -> Result { let password = env::var("admin_pass").expect("admin_pass not setted"); match cookies.get_private("user") { Some(cookie) => { if cookie.value() == password { Ok(Redirect::to("/admin/panel")) } else { - let context = get_context(); + let context = contexts::Empty::new(); Err(Template::render("admin/index", context)) } } None => { - let context = get_context(); + let context = contexts::Empty::new(); Err(Template::render("admin/index", context)) } @@ -37,7 +37,7 @@ fn index(mut cookies: Cookies<'_>) -> Result { } #[post("/", data = "")] -fn login(mut cookies: Cookies<'_>, login: Form) -> Redirect { +fn login(cookies: &CookieJar<'_>, login: Form) -> Redirect { let username = env::var("admin_user").expect("admin_user not setted"); let password = env::var("admin_pass").expect("admin_pass not setted"); @@ -50,18 +50,16 @@ fn login(mut cookies: Cookies<'_>, login: Form) -> Redirect { } #[get("/panel")] -fn panel(mut cookies: Cookies<'_>) -> Result { +fn panel(cookies: &CookieJar<'_>) -> Result { let password = env::var("admin_pass").expect("admin_pass not setted"); match cookies.get_private("user") { Some(cookie) => { if cookie.value() == password { - let mut context = get_context(); - let (all_posts, n_posts) = posts::get_posts(None); - context.insert("posts", &all_posts); - context.insert("n_posts", &n_posts); + let context = contexts::AllPosts::new(all_posts, n_posts); + Ok(Template::render("admin/panel", context)) } else { Err(Redirect::to("/admin")) @@ -72,17 +70,15 @@ fn panel(mut cookies: Cookies<'_>) -> Result { } #[get("/add_post")] -fn add_post(mut cookies: Cookies<'_>) -> Result { +fn add_post(cookies: &CookieJar<'_>) -> Result { let password = env::var("admin_pass").expect("admin_pass not setted"); match cookies.get_private("user") { Some(cookie) => { if cookie.value() == password { - let context = get_context(); + let context = contexts::Empty::new(); Ok(Template::render("admin/add_post", context)) - } else if cookie.value() == "123" { - Err(Redirect::to("/admin")) } else { Err(Redirect::to("/admin")) } @@ -92,7 +88,7 @@ fn add_post(mut cookies: Cookies<'_>) -> Result { } #[post("/add_post", data = "")] -fn write_add_post(mut cookies: Cookies<'_>, post: Form) -> Redirect { +fn write_add_post(cookies: &CookieJar<'_>, post: Form) -> Redirect { let password = env::var("admin_pass").expect("admin_pass not setted"); match cookies.get_private("user") { @@ -111,17 +107,16 @@ fn write_add_post(mut cookies: Cookies<'_>, post: Form) -> Redirect { } #[get("/edit_post/")] -fn edit_post(mut cookies: Cookies<'_>, id: i32) -> Result { +fn edit_post(cookies: &CookieJar<'_>, id: i32) -> Result { let password = env::var("admin_pass").expect("admin_pass not setted"); match cookies.get_private("user") { Some(cookie) => { if cookie.value() == password { - let mut context = get_context(); - let post = posts::get_post(id).unwrap(); - context.insert("post", &post); + let context = contexts::SinglePost::new(post); + Ok(Template::render("admin/edit_post", context)) } else { Err(Redirect::to("/admin")) @@ -132,7 +127,7 @@ fn edit_post(mut cookies: Cookies<'_>, id: i32) -> Result { } #[post("/edit_post/", data = "")] -fn write_edit_post(mut cookies: Cookies<'_>, id: i32, post: Form) -> Redirect { +fn write_edit_post(cookies: &CookieJar<'_>, id: i32, post: Form) -> Redirect { let password = env::var("admin_pass").expect("admin_pass not setted"); match cookies.get_private("user") { diff --git a/src/contexts.rs b/src/contexts.rs new file mode 100644 index 0000000..16e0683 --- /dev/null +++ b/src/contexts.rs @@ -0,0 +1,94 @@ +use crate::controllers::posts; +use crate::misc::gen_title; +use crate::models::Post; +use serde::Serialize; + +#[derive(Serialize)] +pub struct PageOfPosts { + title: String, + posts: Vec, + total_pages: i64, + actual_page: u64, +} + +impl PageOfPosts { + pub fn new(posts: Vec, actual_page: u64, n_posts: i64) -> Self { + let total_pages = (n_posts as f64 / posts::MAX_POSTS_PER_PAGE as f64).ceil() as i64; + + PageOfPosts { + title: gen_title(), + posts, + total_pages, + actual_page, + } + } +} + +#[derive(Serialize)] +pub struct XmlFeed { + posts: Vec, +} + +impl XmlFeed { + pub fn new(posts: Vec) -> Self { + XmlFeed { posts } + } +} + +#[derive(Serialize)] +pub struct SinglePost { + title: String, + post: Post, +} + +impl SinglePost { + pub fn new(post: Post) -> Self { + SinglePost { + title: gen_title(), + post, + } + } +} + +#[derive(Serialize)] +pub struct NotFound { + title: String, + uri: String, +} + +impl NotFound { + pub fn new(uri: String) -> Self { + NotFound { + title: gen_title(), + uri, + } + } +} + +#[derive(Serialize)] +pub struct AllPosts { + title: String, + posts: Vec, + n_posts: i64, +} + +impl AllPosts { + pub fn new(posts: Vec, n_posts: i64) -> Self { + AllPosts { + title: gen_title(), + posts, + n_posts, + } + } +} + +#[derive(Serialize)] +pub struct Empty { + title: String, +} + +impl Empty { + pub fn new() -> Self { + Empty { title: gen_title() } + } +} diff --git a/src/main.rs b/src/main.rs index 41c84ef..eed923d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ -#![feature(proc_macro_hygiene, decl_macro)] - pub mod admin; +pub mod contexts; pub mod controllers; pub mod misc; pub mod models; @@ -10,20 +9,14 @@ mod schema; extern crate rocket; #[macro_use] extern crate diesel; -extern crate comrak; -extern crate dotenv; -extern crate rocket_contrib; -extern crate tera; use comrak::{markdown_to_html, ComrakOptions}; use controllers::posts; use dotenv::dotenv; -use misc::get_context; -use rocket::response::content; -use rocket::response::NamedFile; +use rocket::fs::{FileServer, NamedFile}; +use rocket::response::content::RawXml; use rocket::Request; -use rocket_contrib::serve::StaticFiles; -use rocket_contrib::templates::Template; +use rocket_dyn_templates::Template; use std::path::Path; use std::vec::Vec; @@ -31,21 +24,15 @@ use std::vec::Vec; fn index(page: Option) -> Template { let page: u64 = page.unwrap_or(1); - let mut context = get_context(); - let (posts, n_posts) = posts::get_posts(Some(page)); - let total_pages = (n_posts as f64 / posts::MAX_POSTS_PER_PAGE as f64).ceil() as i64; + let context = contexts::PageOfPosts::new(posts, page, n_posts); - context.insert("posts", &posts); - context.insert("total_pages", &total_pages); - context.insert("actual_page", &page); Template::render("index", context) } #[get("/feed.xml")] -fn rss_feed() -> content::Xml