achubb_website/src/html/blog.rs

92 lines
2.4 KiB
Rust
Raw Normal View History

2024-05-11 09:32:29 -04:00
use crate::database::data::{Article, PsqlData};
2024-03-24 10:45:16 -04:00
use askama::Template;
use axum::{
extract::{Extension, Path},
response::IntoResponse,
routing::{get, Router},
};
use core::panic;
2024-05-11 09:32:29 -04:00
use sqlx::PgPool;
use std::{collections::HashMap, error::Error};
2024-05-11 07:53:20 -04:00
use super::{root::AppState, HtmlTemplate, NavBar};
2024-03-24 10:45:16 -04:00
pub fn get_router() -> Router {
Router::new()
2024-05-11 07:53:20 -04:00
.route("/", get(blog))
.route("/:article", get(article))
2024-03-24 10:45:16 -04:00
}
2024-05-11 09:32:29 -04:00
async fn blog(state: Extension<AppState>) -> impl IntoResponse {
let db_pool = &state.db;
let list: Vec<String> = get_articles_as_links_list(db_pool)
.await
.expect("couldn't get articles");
2024-05-11 07:53:20 -04:00
let template = BlogTemplate {
active_navbar: NavBar::BLOG,
2024-05-11 09:32:29 -04:00
article_list: list.join("\n"),
2024-05-11 07:53:20 -04:00
};
HtmlTemplate(template)
}
#[derive(Template)]
#[template(path = "blog.html")]
struct BlogTemplate {
active_navbar: &'static str,
2024-05-11 09:32:29 -04:00
article_list: String,
2024-05-11 07:53:20 -04:00
}
2024-03-24 10:45:16 -04:00
#[derive(Template)]
#[template(path = "Article.html")]
struct ArticleTemplate {
active_navbar: &'static str,
next: String,
previous: String,
content: String,
2024-03-24 10:45:16 -04:00
}
async fn article(
state: Extension<AppState>,
Path(params): Path<HashMap<String, String>>,
) -> impl IntoResponse {
let db_pool = &state.db;
let article_id: &String = params.get("article").unwrap();
let article: Article = match Article::read_by_reference(db_pool, article_id).await {
Ok(a) => *a,
Err(_) => panic!("Not an article at all!!!!"),
};
let template = ArticleTemplate {
2024-05-11 07:53:20 -04:00
active_navbar: NavBar::BLOG,
content: article.content,
previous: match article.previous {
Some(a) => a,
None => "".to_string(),
},
next: match article.next {
Some(a) => a,
None => "".to_string(),
},
2024-03-24 10:45:16 -04:00
};
2024-05-11 07:53:20 -04:00
HtmlTemplate(template)
2024-03-24 10:45:16 -04:00
}
2024-05-11 09:32:29 -04:00
pub async fn get_articles_as_links_list(pool: &PgPool) -> Result<Vec<String>, Box<dyn Error>> {
let mut articles: Vec<Article> = match Article::read_all(pool).await {
Ok(a) => a.iter().map(|x| *x.clone()).collect(),
Err(_) => panic!("Not an article at all!!!!"),
};
articles.sort_by(|a, b| b.date.cmp(&a.date));
let list: Vec<String> = articles
.iter()
.map(|article| {
format!(
"<li><a href=\"/blog/{}\">{}</a></li>",
article.reference, article.title
)
})
.collect();
Ok(list)
}