directory listing
This commit is contained in:
parent
03fefda519
commit
834f998788
@ -1,2 +1,3 @@
|
|||||||
pub mod index;
|
pub mod index;
|
||||||
pub mod post;
|
pub mod post;
|
||||||
|
pub mod post_list;
|
||||||
|
@ -13,7 +13,7 @@ pub struct PostMetadata {
|
|||||||
pub published: bool,
|
pub published: bool,
|
||||||
#[serde(deserialize_with = "deserialize_date")]
|
#[serde(deserialize_with = "deserialize_date")]
|
||||||
pub date: DateTime<Utc>,
|
pub date: DateTime<Utc>,
|
||||||
pub thumbnail: String,
|
pub thumbnail: Option<String>,
|
||||||
pub tags: Vec<String>,
|
pub tags: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
47
axum_server/src/pages/post_list.rs
Normal file
47
axum_server/src/pages/post_list.rs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
use askama::Template;
|
||||||
|
use axum::http::StatusCode;
|
||||||
|
use tokio::fs::read_dir;
|
||||||
|
use tracing::info;
|
||||||
|
|
||||||
|
use crate::post_parser::{parse_post, ParseResult};
|
||||||
|
|
||||||
|
use super::post::PostMetadata;
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "post_list.html")]
|
||||||
|
pub struct PostListTemplate {
|
||||||
|
pub posts: Vec<ParseResult<PostMetadata>>,
|
||||||
|
// TODO tags and pagination
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn render_post_list() -> Result<PostListTemplate, StatusCode> {
|
||||||
|
let path = "../_posts/blog/";
|
||||||
|
let dir = read_dir(path).await;
|
||||||
|
let mut posts: Vec<ParseResult<PostMetadata>> = Vec::new();
|
||||||
|
|
||||||
|
let mut files = match dir {
|
||||||
|
Err(_reason) => {
|
||||||
|
// TODO find the real reason
|
||||||
|
return Err(StatusCode::INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
Ok(files) => files,
|
||||||
|
};
|
||||||
|
|
||||||
|
while let Some(file) = files
|
||||||
|
.next_entry()
|
||||||
|
.await
|
||||||
|
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
|
||||||
|
{
|
||||||
|
let file_path = file.path();
|
||||||
|
let file_path_str = file_path.to_str().unwrap();
|
||||||
|
info!(":{}", file_path_str);
|
||||||
|
let post = parse_post::<PostMetadata>(file_path_str).await?;
|
||||||
|
posts.push(post);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(PostListTemplate { posts })
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Do we want pagination or not? Ask designer
|
||||||
|
// TODO How are we going to implement tags? The path extractor would have to make decision on wether we have a path or a blog post
|
||||||
|
// TODO Refactor `?` with `.map_err`
|
@ -1,4 +1,4 @@
|
|||||||
use crate::pages::{index::render_index, post::render_post};
|
use crate::pages::{index::render_index, post::render_post, post_list::render_post_list};
|
||||||
use axum::{extract::MatchedPath, http::Request, routing::get, Router};
|
use axum::{extract::MatchedPath, http::Request, routing::get, Router};
|
||||||
use tower_http::trace::TraceLayer;
|
use tower_http::trace::TraceLayer;
|
||||||
use tracing::info_span;
|
use tracing::info_span;
|
||||||
@ -6,6 +6,7 @@ use tracing::info_span;
|
|||||||
pub fn get_router() -> Router {
|
pub fn get_router() -> Router {
|
||||||
Router::new()
|
Router::new()
|
||||||
.route("/", get(render_index))
|
.route("/", get(render_index))
|
||||||
|
.route("/blog", get(render_post_list))
|
||||||
.route("/blog/:post_id", get(render_post))
|
.route("/blog/:post_id", get(render_post))
|
||||||
.layer(
|
.layer(
|
||||||
TraceLayer::new_for_http().make_span_with(|request: &Request<_>| {
|
TraceLayer::new_for_http().make_span_with(|request: &Request<_>| {
|
||||||
|
21
axum_server/templates/post_list.html
Normal file
21
axum_server/templates/post_list.html
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{% if posts.len() == 0 %}
|
||||||
|
<p class="no-posts">You've found void in the space.</p>
|
||||||
|
{% else %}
|
||||||
|
<h1>{# if filters.tags #} {# <em>{filters.tags}</em> #} Blog posts</h1>
|
||||||
|
|
||||||
|
{#if filters.tags#}
|
||||||
|
<div class="{seeAllClass}">
|
||||||
|
<a href="/blog">See all posts</a>
|
||||||
|
</div>
|
||||||
|
{% endif%}
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{% for post in posts %}
|
||||||
|
<li>
|
||||||
|
{# <ArticlePreviewCard {article} {segment} /> #} {#
|
||||||
|
<ArticleFooter {article} {segment} /> #} {{post.metadata.title}}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{# <ArticlePreviewList {...data} segment="blog" /> #}
|
Loading…
Reference in New Issue
Block a user