admin ui featured blogs

This commit is contained in:
2024-05-09 23:26:06 +02:00
parent 8f5069e207
commit 1e75744b7b
19 changed files with 266 additions and 17 deletions

View File

@ -0,0 +1,13 @@
use crate::{pages::post::PostMetadata, post_list::get_post_list, post_parser::ParseResult};
use axum::http::StatusCode;
pub async fn get_featured_posts() -> Result<Vec<ParseResult<PostMetadata>>, StatusCode> {
let post_list = get_post_list::<PostMetadata>().await?;
let featured_posts = post_list
.into_iter()
.filter(|post| post.metadata.segments.contains(&"featured".to_string()))
.collect();
Ok(featured_posts)
}

View File

@ -1,7 +1,20 @@
use chrono::{DateTime, Utc};
use tracing::debug;
// This filter does not have extra arguments
pub fn pretty_date(date_time: &DateTime<Utc>) -> ::askama::Result<String> {
let formatted = format!("{}", date_time.format("%e %B %Y"));
Ok(formatted)
}
// This filter does not have extra arguments
pub fn description_filter(body: &String) -> ::askama::Result<String> {
let description = body
.lines()
.filter(|line| line.starts_with("<p"))
.take(3)
.collect::<Vec<&str>>()
.join("\n");
debug!(description);
Ok(description)
}

View File

@ -1,9 +1,10 @@
use axum;
use axum::{self};
use tower_http::services::ServeDir;
use tower_livereload::LiveReloadLayer;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
mod components;
mod featured_posts;
mod feed;
mod filters;
mod pages;
@ -30,7 +31,11 @@ async fn main() {
let app = router::get_router()
.nest_service("/styles", ServeDir::new("styles"))
.nest_service("/images", ServeDir::new("../static/images"))
.nest_service("/svg", ServeDir::new("../static/svg"));
.nest_service("/svg", ServeDir::new("../static/svg"))
.nest_service(
"/config.yml",
ServeDir::new("../static/resources/config.yml"),
);
#[cfg(debug_assertions)]
let app = app.layer(LiveReloadLayer::new());

View File

@ -0,0 +1,9 @@
use askama::Template;
#[derive(Template)]
#[template(path = "admin.html")]
pub struct AdminPageTemplate {}
pub async fn render_admin() -> AdminPageTemplate {
AdminPageTemplate {}
}

View File

@ -1,25 +1,32 @@
use askama::Template;
use axum::http::StatusCode;
use crate::filters;
use crate::{
components::{
site_footer::{render_site_footer, SiteFooter},
site_header::HeaderProps,
},
featured_posts::get_featured_posts,
post_parser::ParseResult,
tag_list::get_popular_blog_tags,
};
use super::post::PostMetadata;
#[derive(Template)]
#[template(path = "index.html")]
pub struct IndexTemplate {
site_footer: SiteFooter,
header_props: HeaderProps,
blog_tags: Vec<String>,
featured_posts: Vec<ParseResult<PostMetadata>>,
}
pub async fn render_index() -> Result<IndexTemplate, StatusCode> {
let site_footer = tokio::spawn(render_site_footer());
let blog_tags = tokio::spawn(get_popular_blog_tags());
let featured_posts = tokio::spawn(get_featured_posts());
let blog_tags = blog_tags
.await
@ -29,9 +36,14 @@ pub async fn render_index() -> Result<IndexTemplate, StatusCode> {
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
let featured_posts = featured_posts
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)??;
Ok(IndexTemplate {
site_footer,
header_props: HeaderProps::default(),
blog_tags,
featured_posts,
})
}

View File

@ -1,3 +1,4 @@
pub mod admin;
pub mod contact;
pub mod index;
pub mod post;

View File

@ -1,7 +1,7 @@
use crate::{
feed::render_rss_feed,
pages::{
contact::render_contact, index::render_index, post::render_post,
admin::render_admin, contact::render_contact, index::render_index, post::render_post,
post_list::render_post_list,
},
};
@ -16,6 +16,7 @@ pub fn get_router() -> Router {
.route("/blog/tags/:tag", get(render_post_list))
.route("/blog/:post_id", get(render_post))
.route("/contact", get(render_contact))
.route("/admin", get(render_admin))
.route("/feed.xml", get(render_rss_feed))
.layer(
TraceLayer::new_for_http().make_span_with(|request: &Request<_>| {