1
0
Fork 0

implement post aliases

This commit is contained in:
Adrian Hedqvist 2023-03-29 18:19:39 +02:00
parent baa5cbc344
commit 6be5525bae
4 changed files with 21 additions and 4 deletions

View file

@ -20,10 +20,11 @@ lazy_static! {
.unwrap(); .unwrap();
} }
pub fn routes() -> Router<Arc<AppState>> { pub fn routes(state: &Arc<AppState>) -> Router<Arc<AppState>> {
Router::new() Router::new()
.route("/", get(index)) .route("/", get(index))
.nest("/posts", posts::router()) .nest("/posts", posts::router())
.merge(posts::alias_router(state.posts.values()))
.route("/healthcheck", get(healthcheck)) .route("/healthcheck", get(healthcheck))
.route("/metrics", get(metrics)) .route("/metrics", get(metrics))
.nest_service("/static", tower_http::services::ServeDir::new("./static")) .nest_service("/static", tower_http::services::ServeDir::new("./static"))

View file

@ -1,6 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use axum::{extract::{Path, State}, response::Html, routing::get, Extension, Router}; use axum::{extract::{Path, State}, response::{Html, Redirect}, routing::get, Extension, Router};
use serde_derive::Serialize; use serde_derive::Serialize;
use tracing::{instrument, log::*}; use tracing::{instrument, log::*};
@ -17,6 +17,21 @@ pub fn router() -> Router<Arc<AppState>> {
.fallback_service(tower_http::services::ServeDir::new("./posts")) .fallback_service(tower_http::services::ServeDir::new("./posts"))
} }
pub fn alias_router<'a>(posts: impl IntoIterator<Item=&'a Post>) -> Router<Arc<AppState>> {
let mut router = Router::new();
for post in posts {
for alias in &post.aliases {
let path = post.absolute_path.to_owned();
router = router.route(alias, get(move || async {
let path = path;
Redirect::permanent(&path)
}));
}
}
router
}
#[derive(Serialize, Debug)] #[derive(Serialize, Debug)]
struct PageContext<'a> { struct PageContext<'a> {
title: &'a str, title: &'a str,

View file

@ -27,7 +27,8 @@ async fn main() -> Result<()> {
let posts = post::load_all().await?; let posts = post::load_all().await?;
let state = Arc::new(AppState { tera, posts }); let state = Arc::new(AppState { tera, posts });
let app = handlers::routes()
let app = handlers::routes(&state)
.layer(TraceLayer::new_for_http()) .layer(TraceLayer::new_for_http())
.layer(CompressionLayer::new()) .layer(CompressionLayer::new())
.with_state(state); .with_state(state);

View file

@ -11,7 +11,7 @@
<li>✅ post metadata (frontmatter, toml)</li> <li>✅ post metadata (frontmatter, toml)</li>
<li>✅ app metrics (page hits, etc)</li> <li>✅ app metrics (page hits, etc)</li>
<li>✅ tests</li> <li>✅ tests</li>
<li> page aliases (redirects, for back-compat with old routes)</li> <li> page aliases (redirects, for back-compat with old routes)</li>
<li>⬜ sass compilation (using rsass? grass?)</li> <li>⬜ sass compilation (using rsass? grass?)</li>
<li>⬜ rss/atom/jsonfeed</li> <li>⬜ rss/atom/jsonfeed</li>
<li>✅ proper error handling (i guess??)</li> <li>✅ proper error handling (i guess??)</li>