From 2c0fe8d6e56324af330d7eb537458a9eda7b5ffc Mon Sep 17 00:00:00 2001 From: Mylloon Date: Thu, 20 Apr 2023 15:43:25 +0200 Subject: [PATCH] meta: cleanup * move date to utils dir * rename get_* to build_* * increase index ttl from 60 to 120 * split index blog build in half --- src/misc/date.rs | 29 ++++++++++++++++++++ src/misc/mod.rs | 1 + src/routes/agreements.rs | 8 +++--- src/routes/blog.rs | 59 +++++++++++++++++++++------------------- src/routes/contrib.rs | 4 +-- src/routes/index.rs | 4 +-- src/routes/networks.rs | 4 +-- src/routes/not_found.rs | 4 +-- src/routes/portfolio.rs | 4 +-- src/routes/web3.rs | 4 +-- src/template.rs | 30 ++------------------ 11 files changed, 80 insertions(+), 71 deletions(-) create mode 100644 src/misc/date.rs diff --git a/src/misc/date.rs b/src/misc/date.rs new file mode 100644 index 0000000..a31b229 --- /dev/null +++ b/src/misc/date.rs @@ -0,0 +1,29 @@ +use chrono::{Datelike, NaiveDate}; +use ramhorns::Content; +use serde::{Deserialize, Deserializer}; + +#[derive(Content, Default)] +pub struct Date { + pub day: u32, + pub month: u32, + pub year: i32, +} + +impl<'de> Deserialize<'de> for Date { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + match <&str>::deserialize(deserializer) { + Ok(s) => match NaiveDate::parse_from_str(s, "%d-%m-%Y") { + Ok(date) => Ok(Self { + day: date.day(), + month: date.month(), + year: date.year(), + }), + Err(e) => Err(serde::de::Error::custom(e)), + }, + Err(e) => Err(e), + } + } +} diff --git a/src/misc/mod.rs b/src/misc/mod.rs index 0c8ab90..2318286 100644 --- a/src/misc/mod.rs +++ b/src/misc/mod.rs @@ -1,2 +1,3 @@ +pub mod date; pub mod github; mod utils; diff --git a/src/routes/agreements.rs b/src/routes/agreements.rs index d61611d..674b65c 100644 --- a/src/routes/agreements.rs +++ b/src/routes/agreements.rs @@ -7,7 +7,7 @@ use ramhorns::Content; #[get("/.well-known/security.txt")] #[get("/security.txt")] pub async fn security(req: HttpRequest, config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_security( + HttpResponse::Ok().body(build_securitytxt( config.get_ref().clone(), req.connection_info().to_owned(), )) @@ -21,7 +21,7 @@ struct SecurityTemplate { } #[once(time = 60)] -fn get_security(config: Config, info: ConnectionInfo) -> String { +fn build_securitytxt(config: Config, info: ConnectionInfo) -> String { config.tmpl.render( "security.txt", SecurityTemplate { @@ -45,11 +45,11 @@ pub async fn humans() -> impl Responder { #[get("/robots.txt")] pub async fn robots() -> impl Responder { - HttpResponse::Ok().body(get_robots()) + HttpResponse::Ok().body(build_robotstxt()) } #[once(time = 60)] -fn get_robots() -> String { +fn build_robotstxt() -> String { // TODO, see https://www.robotstxt.org/orig.html "User-agent: * Allow: /".to_string() } diff --git a/src/routes/blog.rs b/src/routes/blog.rs index 6176534..b7543cd 100644 --- a/src/routes/blog.rs +++ b/src/routes/blog.rs @@ -5,12 +5,13 @@ use ramhorns::Content; use crate::{ config::Config, - template::{get_md_asm, get_md_metadata, read_md_file, Date, File, FileMetadata, Infos}, + misc::date::Date, + template::{get_md_asm, get_md_metadata, read_md_file, File, FileMetadata, Infos}, }; #[get("/blog")] pub async fn index(config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_index(config.get_ref().clone())) + HttpResponse::Ok().body(build_index(config.get_ref().clone())) } #[derive(Content)] @@ -18,6 +19,27 @@ struct BlogIndexTemplate { posts: Option>, } +#[once(time = 120)] +pub fn build_index(config: Config) -> String { + let mut posts = get_posts("data/blog"); + + // Sort from newest to oldest + posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day)); + posts.reverse(); + + config.tmpl.render( + "blog/index.html", + BlogIndexTemplate { + posts: if posts.is_empty() { None } else { Some(posts) }, + }, + Infos { + page_title: Some("Blog".to_string()), + page_desc: Some("Liste des posts d'Anri".to_string()), + page_kw: Some(["blog", "blogging"].join(", ")), + }, + ) +} + #[derive(Content)] struct Post { title: String, @@ -25,17 +47,14 @@ struct Post { url: String, } -#[once(time = 60)] -pub fn get_index(config: Config) -> String { - let location = "data/blog"; - +fn get_posts(location: &str) -> Vec { let entries = std::fs::read_dir(location) .unwrap() .flatten() .filter(|f| f.path().extension().unwrap() == "md") .collect::>(); - let mut posts = entries + entries .iter() .map(|f| { let _filename = f.file_name(); @@ -80,23 +99,7 @@ pub fn get_index(config: Config) -> String { }), } }) - .collect::>(); - - // Sort from newest to oldest - posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day)); - posts.reverse(); - - config.tmpl.render( - "blog/index.html", - BlogIndexTemplate { - posts: if posts.is_empty() { None } else { Some(posts) }, - }, - Infos { - page_title: Some("Blog".to_string()), - page_desc: Some("Liste des posts d'Anri".to_string()), - page_kw: Some(["blog", "blogging"].join(", ")), - }, - ) + .collect::>() } #[derive(Content)] @@ -106,19 +109,19 @@ struct BlogPostTemplate { #[get("/blog/{id}")] pub async fn page(path: web::Path<(String,)>, config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_post(path.into_inner().0, config.get_ref().clone())) + HttpResponse::Ok().body(build_post(path.into_inner().0, config.get_ref().clone())) } -pub fn get_post(file: String, config: Config) -> String { +pub fn build_post(file: String, config: Config) -> String { let mut post = None; - let infos = _get_post(&mut post, file); + let infos = get_post(&mut post, file); config .tmpl .render("blog/post.html", BlogPostTemplate { post }, infos) } -fn _get_post(post: &mut Option, filename: String) -> Infos { +fn get_post(post: &mut Option, filename: String) -> Infos { let blog_dir = "data/blog"; let ext = ".md"; diff --git a/src/routes/contrib.rs b/src/routes/contrib.rs index 0b7ff0c..2acebba 100644 --- a/src/routes/contrib.rs +++ b/src/routes/contrib.rs @@ -11,7 +11,7 @@ use ramhorns::Content; #[get("/contrib")] pub async fn page(config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_page(config.get_ref().clone()).await) + HttpResponse::Ok().body(build_page(config.get_ref().clone()).await) } #[derive(Content)] @@ -40,7 +40,7 @@ struct Pull { } #[once(time = 120)] -pub async fn get_page(config: Config) -> String { +pub async fn build_page(config: Config) -> String { // Fetch latest data from github let data = match fetch_pr().await { Ok(projects) => { diff --git a/src/routes/index.rs b/src/routes/index.rs index d7ec7e3..e70b805 100644 --- a/src/routes/index.rs +++ b/src/routes/index.rs @@ -6,14 +6,14 @@ use crate::{config::Config, template::Infos}; #[get("/")] pub async fn page(config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_page(config.get_ref().clone())) + HttpResponse::Ok().body(build_page(config.get_ref().clone())) } #[derive(Content)] struct IndexTemplate {} #[once(time = 60)] -pub fn get_page(config: Config) -> String { +pub fn build_page(config: Config) -> String { config.tmpl.render( "index.html", IndexTemplate {}, diff --git a/src/routes/networks.rs b/src/routes/networks.rs index 891c4d3..acd3a68 100644 --- a/src/routes/networks.rs +++ b/src/routes/networks.rs @@ -6,14 +6,14 @@ use crate::{config::Config, template::Infos}; #[get("/networks")] pub async fn page(config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_page(config.get_ref().clone())) + HttpResponse::Ok().body(build_page(config.get_ref().clone())) } #[derive(Content)] struct NetworksTemplate {} #[once(time = 60)] -pub fn get_page(config: Config) -> String { +pub fn build_page(config: Config) -> String { config.tmpl.render( "networks.html", NetworksTemplate {}, diff --git a/src/routes/not_found.rs b/src/routes/not_found.rs index 20cf657..88d18c2 100644 --- a/src/routes/not_found.rs +++ b/src/routes/not_found.rs @@ -5,14 +5,14 @@ use ramhorns::Content; use crate::{config::Config, template::Infos}; pub async fn page(config: web::Data) -> impl Responder { - HttpResponse::NotFound().body(get_page(config.get_ref().clone())) + HttpResponse::NotFound().body(build_page(config.get_ref().clone())) } #[derive(Content)] struct Error404Template {} #[once(time = 60)] -pub fn get_page(config: Config) -> String { +pub fn build_page(config: Config) -> String { config .tmpl .render("404.html", Error404Template {}, Infos::default()) diff --git a/src/routes/portfolio.rs b/src/routes/portfolio.rs index ca9cfba..6986dae 100644 --- a/src/routes/portfolio.rs +++ b/src/routes/portfolio.rs @@ -10,7 +10,7 @@ use crate::{ #[get("/portfolio")] pub async fn page(config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_page(config.get_ref().clone())) + HttpResponse::Ok().body(build_page(config.get_ref().clone())) } #[derive(Content)] @@ -25,7 +25,7 @@ struct PortfolioTemplate<'a> { } #[once(time = 60)] -pub fn get_page(config: Config) -> String { +pub fn build_page(config: Config) -> String { let projects_dir = "data/projects"; let ext = ".md"; diff --git a/src/routes/web3.rs b/src/routes/web3.rs index 0069f12..3ee0f57 100644 --- a/src/routes/web3.rs +++ b/src/routes/web3.rs @@ -6,14 +6,14 @@ use crate::{config::Config, template::Infos}; #[get("/web3")] pub async fn page(config: web::Data) -> impl Responder { - HttpResponse::Ok().body(get_page(config.get_ref().clone())) + HttpResponse::Ok().body(build_page(config.get_ref().clone())) } #[derive(Content)] struct Web3Template {} #[once(time = 60)] -pub fn get_page(config: Config) -> String { +pub fn build_page(config: Config) -> String { config.tmpl.render( "web3.html", Web3Template {}, diff --git a/src/template.rs b/src/template.rs index 273a679..89025ac 100644 --- a/src/template.rs +++ b/src/template.rs @@ -1,9 +1,10 @@ -use chrono::{Datelike, NaiveDate}; use markdown::mdast::Node; use ramhorns::{Content, Ramhorns}; -use serde::{Deserialize, Deserializer}; +use serde::Deserialize; use std::fs; +use crate::misc::date::Date; + #[derive(Clone)] pub struct Template { pub directory: String, @@ -59,31 +60,6 @@ impl FrontMatter<'_> { } } } -#[derive(Content, Default)] -pub struct Date { - pub day: u32, - pub month: u32, - pub year: i32, -} - -impl<'de> Deserialize<'de> for Date { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - match <&str>::deserialize(deserializer) { - Ok(s) => match NaiveDate::parse_from_str(s, "%d-%m-%Y") { - Ok(date) => Ok(Self { - day: date.day(), - month: date.month(), - year: date.year(), - }), - Err(e) => Err(serde::de::Error::custom(e)), - }, - Err(e) => Err(e), - } - } -} #[derive(Default, Deserialize, Content)] pub struct FileMetadata {