codigocomentado/src/main.rs

135 lines
3.3 KiB
Rust
Raw Normal View History

2019-12-08 23:07:49 +00:00
pub mod admin;
2024-02-20 06:41:51 +00:00
pub mod contexts;
pub mod controllers;
pub mod misc;
2019-11-14 02:10:42 +00:00
pub mod models;
2019-12-17 23:02:10 +00:00
mod schema;
2019-11-14 02:10:42 +00:00
2019-11-13 07:17:38 +00:00
#[macro_use]
extern crate rocket;
2019-11-14 02:10:42 +00:00
#[macro_use]
extern crate diesel;
2019-11-13 07:17:38 +00:00
use comrak::{markdown_to_html, ComrakOptions};
2019-12-16 00:34:27 +00:00
use controllers::posts;
2019-12-17 23:02:10 +00:00
use dotenv::dotenv;
2024-02-20 06:41:51 +00:00
use rocket::fs::{FileServer, NamedFile};
use rocket::response::content::RawXml;
2019-11-23 19:05:41 +00:00
use rocket::Request;
2024-02-20 06:41:51 +00:00
use rocket_dyn_templates::Template;
2019-12-15 23:24:19 +00:00
use std::path::Path;
2019-11-14 02:10:42 +00:00
use std::vec::Vec;
2019-11-14 02:10:42 +00:00
#[get("/?<page>")]
2019-12-16 00:34:27 +00:00
fn index(page: Option<u64>) -> Template {
let page: u64 = page.unwrap_or(1);
2019-11-14 02:10:42 +00:00
2019-12-19 00:32:45 +00:00
let (posts, n_posts) = posts::get_posts(Some(page));
2019-11-17 05:10:06 +00:00
2024-02-20 06:41:51 +00:00
let context = contexts::PageOfPosts::new(posts, page, n_posts);
2019-11-17 05:10:06 +00:00
2019-11-13 07:17:38 +00:00
Template::render("index", context)
}
2023-12-11 04:53:43 +00:00
#[get("/feed.xml")]
2024-02-20 06:41:51 +00:00
fn rss_feed() -> RawXml<Template> {
2023-12-11 04:53:43 +00:00
let (mut posts, _) = posts::get_posts(None);
let comrak_options = ComrakOptions {
ext_table: true,
ext_autolink: true,
ext_tasklist: true,
unsafe_: true,
..ComrakOptions::default()
};
posts.iter_mut().for_each(|post| {
let content = markdown_to_html(&post.content, &comrak_options);
post.content = content;
});
2024-02-20 06:41:51 +00:00
let context = contexts::XmlFeed::new(posts);
2023-12-11 04:53:43 +00:00
2024-02-20 06:41:51 +00:00
RawXml(Template::render("rss", context))
2023-12-11 04:53:43 +00:00
}
#[get("/atom.xml")]
2024-02-20 06:41:51 +00:00
fn atom_feed() -> RawXml<Template> {
2023-12-11 04:53:43 +00:00
let (mut posts, _) = posts::get_posts(None);
let comrak_options = ComrakOptions {
ext_table: true,
ext_autolink: true,
ext_tasklist: true,
unsafe_: true,
..ComrakOptions::default()
};
posts.iter_mut().for_each(|post| {
let content = markdown_to_html(&post.content, &comrak_options);
post.content = content;
});
2024-02-20 06:41:51 +00:00
let context = contexts::XmlFeed::new(posts);
2023-12-11 04:53:43 +00:00
2024-02-20 06:41:51 +00:00
RawXml(Template::render("atom", context))
2023-12-11 04:53:43 +00:00
}
2019-11-18 08:16:16 +00:00
#[get("/post/<title>")]
2019-11-17 22:09:36 +00:00
fn show_post(title: String) -> Template {
let title_splited: Vec<&str> = title.split('-').collect();
let id = title_splited.last().unwrap().parse().unwrap_or(-1);
2019-11-17 22:09:36 +00:00
2019-12-16 00:34:27 +00:00
match posts::get_post(id) {
2019-11-25 23:42:57 +00:00
Ok(mut post) => {
let comrak_options = ComrakOptions {
ext_table: true,
ext_autolink: true,
ext_tasklist: true,
2023-01-27 06:42:30 +00:00
unsafe_: true,
..ComrakOptions::default()
};
let content = markdown_to_html(&post.content, &comrak_options);
2019-11-25 23:42:57 +00:00
post.content = content;
2019-11-17 22:09:36 +00:00
2024-02-20 06:41:51 +00:00
let context = contexts::SinglePost::new(post);
Template::render("post", context)
}
Err(_) => {
2024-02-20 06:59:15 +00:00
let url = format!("/post/{}", title_splited.join("-"));
2024-02-20 06:41:51 +00:00
2024-02-20 06:59:15 +00:00
let context = contexts::NotFound::new(url);
2024-02-20 06:41:51 +00:00
Template::render("404", context)
}
}
2019-11-17 22:09:36 +00:00
}
2019-11-23 19:05:41 +00:00
#[catch(404)]
fn not_found_404(req: &Request) -> Template {
let uri = format!("{}", req.uri());
2024-02-20 06:41:51 +00:00
let context = contexts::NotFound::new(uri);
2019-11-23 19:05:41 +00:00
Template::render("404", context)
}
2019-12-15 23:24:19 +00:00
#[get("/favicon.ico")]
2024-02-20 06:41:51 +00:00
async fn favicon() -> Option<NamedFile> {
NamedFile::open(Path::new("static/favicon.ico")).await.ok()
2019-12-15 23:24:19 +00:00
}
2024-02-20 06:41:51 +00:00
#[launch]
fn rocket() -> _ {
2019-12-17 23:02:10 +00:00
dotenv().ok();
2024-02-20 06:41:51 +00:00
rocket::build()
2019-11-13 07:17:38 +00:00
.attach(Template::fairing())
2023-12-11 04:53:43 +00:00
.mount("/", routes![index, show_post, favicon, rss_feed, atom_feed])
2019-12-17 23:02:10 +00:00
.mount("/admin", admin::get_routes())
2024-02-20 06:41:51 +00:00
.mount("/static", FileServer::from("static"))
.register("/", catchers![not_found_404])
2019-11-13 01:57:32 +00:00
}