blog genericity
This commit is contained in:
parent
c787171d6b
commit
9558202a46
2 changed files with 19 additions and 7 deletions
|
@ -7,7 +7,7 @@ use ::rss::{
|
||||||
extension::atom::{AtomExtension, Link},
|
extension::atom::{AtomExtension, Link},
|
||||||
Category, Channel, Guid, Image, Item,
|
Category, Channel, Guid, Image, Item,
|
||||||
};
|
};
|
||||||
use actix_web::{get, web, HttpResponse, Responder};
|
use actix_web::{get, http::header::ContentType, web, HttpResponse, Responder};
|
||||||
use cached::proc_macro::once;
|
use cached::proc_macro::once;
|
||||||
use chrono::{DateTime, Datelike, Local, NaiveDateTime, Utc};
|
use chrono::{DateTime, Datelike, Local, NaiveDateTime, Utc};
|
||||||
use chrono_tz::Europe;
|
use chrono_tz::Europe;
|
||||||
|
@ -27,6 +27,8 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
const MIME_TYPE_RSS: &str = "application/rss+xml";
|
const MIME_TYPE_RSS: &str = "application/rss+xml";
|
||||||
|
const BLOG_DIR: &str = "blog";
|
||||||
|
const POST_DIR: &str = "posts";
|
||||||
|
|
||||||
#[get("/blog")]
|
#[get("/blog")]
|
||||||
async fn index(config: web::Data<Config>) -> impl Responder {
|
async fn index(config: web::Data<Config>) -> impl Responder {
|
||||||
|
@ -36,13 +38,19 @@ async fn index(config: web::Data<Config>) -> impl Responder {
|
||||||
#[derive(Content, Debug)]
|
#[derive(Content, Debug)]
|
||||||
struct BlogIndexTemplate {
|
struct BlogIndexTemplate {
|
||||||
navbar: NavBar,
|
navbar: NavBar,
|
||||||
|
about: Option<File>,
|
||||||
posts: Vec<Post>,
|
posts: Vec<Post>,
|
||||||
no_posts: bool,
|
no_posts: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[once(time = 60)]
|
#[once(time = 60)]
|
||||||
fn build_index(config: Config) -> String {
|
fn build_index(config: Config) -> String {
|
||||||
let mut posts = get_posts(format!("{}/blog", config.locations.data_dir));
|
let blog_dir = format!("{}/{}", config.locations.data_dir, BLOG_DIR);
|
||||||
|
let mut posts = get_posts(format!("{}/{}", blog_dir, POST_DIR));
|
||||||
|
|
||||||
|
// Get about
|
||||||
|
let about: Option<File> =
|
||||||
|
read_file(&format!("{}/about.md", blog_dir), TypeFileMetadata::Generic);
|
||||||
|
|
||||||
// Sort from newest to oldest
|
// Sort from newest to oldest
|
||||||
posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day));
|
posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day));
|
||||||
|
@ -55,6 +63,7 @@ fn build_index(config: Config) -> String {
|
||||||
blog: true,
|
blog: true,
|
||||||
..NavBar::default()
|
..NavBar::default()
|
||||||
},
|
},
|
||||||
|
about,
|
||||||
no_posts: posts.is_empty(),
|
no_posts: posts.is_empty(),
|
||||||
posts,
|
posts,
|
||||||
},
|
},
|
||||||
|
@ -82,7 +91,7 @@ struct Post {
|
||||||
impl Post {
|
impl Post {
|
||||||
// Fetch the file content
|
// Fetch the file content
|
||||||
fn fetch_content(&mut self, data_dir: &str) {
|
fn fetch_content(&mut self, data_dir: &str) {
|
||||||
let blog_dir = format!("{}/blog", data_dir);
|
let blog_dir = format!("{}/{}/{}", data_dir, BLOG_DIR, POST_DIR);
|
||||||
let ext = ".md";
|
let ext = ".md";
|
||||||
|
|
||||||
if let Some(file) = read_file(
|
if let Some(file) = read_file(
|
||||||
|
@ -217,7 +226,7 @@ fn get_post(
|
||||||
name: String,
|
name: String,
|
||||||
data_dir: String,
|
data_dir: String,
|
||||||
) -> (Infos, String) {
|
) -> (Infos, String) {
|
||||||
let blog_dir = format!("{}/blog", data_dir);
|
let blog_dir = format!("{}/{}/{}", data_dir, BLOG_DIR, POST_DIR);
|
||||||
let ext = ".md";
|
let ext = ".md";
|
||||||
|
|
||||||
*post = read_file(
|
*post = read_file(
|
||||||
|
@ -272,13 +281,16 @@ fn get_post(
|
||||||
#[get("/blog/rss")]
|
#[get("/blog/rss")]
|
||||||
async fn rss(config: web::Data<Config>) -> impl Responder {
|
async fn rss(config: web::Data<Config>) -> impl Responder {
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
.append_header(("content-type", MIME_TYPE_RSS))
|
.content_type(ContentType(MIME_TYPE_RSS.parse().unwrap()))
|
||||||
.body(build_rss(config.get_ref().to_owned()))
|
.body(build_rss(config.get_ref().to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[once(time = 10800)] // 3h
|
#[once(time = 10800)] // 3h
|
||||||
fn build_rss(config: Config) -> String {
|
fn build_rss(config: Config) -> String {
|
||||||
let mut posts = get_posts(format!("{}/blog", config.locations.data_dir));
|
let mut posts = get_posts(format!(
|
||||||
|
"{}/{}/{}",
|
||||||
|
config.locations.data_dir, BLOG_DIR, POST_DIR
|
||||||
|
));
|
||||||
|
|
||||||
// Sort from newest to oldest
|
// Sort from newest to oldest
|
||||||
posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day));
|
posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day));
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
{{#data}}
|
{{#data}}
|
||||||
|
|
||||||
<h1>Blog</h1>
|
<h1>Blog</h1>
|
||||||
<p>Blog perso, je dis peut-être n'importe quoi 🫶</p>
|
{{#about}} {{&content}} {{/about}}
|
||||||
<a id="rss" href="/blog/rss">Lien vers le flux RSS</a>
|
<a id="rss" href="/blog/rss">Lien vers le flux RSS</a>
|
||||||
|
|
||||||
{{#no_posts}}
|
{{#no_posts}}
|
||||||
|
|
Loading…
Reference in a new issue