diff options
author | Vika <vika@fireburn.ru> | 2024-08-01 20:10:21 +0300 |
---|---|---|
committer | Vika <vika@fireburn.ru> | 2024-08-01 20:40:32 +0300 |
commit | 3c4eb66ca5f96b8cc3289aba6c34373df1dba64a (patch) | |
tree | 9f766829032ea6955bb8c1f40fb0d57f277bb2e3 /src | |
parent | d3e2cc0b49f6c5e9385ac55b55ddc337afc3ef4e (diff) | |
download | kittybox-3c4eb66ca5f96b8cc3289aba6c34373df1dba64a.tar.zst |
Move Kittybox router composition into the library
Since Kittybox router composition is entirely generic, we can move it into the library. I feel like I could also split database types into their own crates, too.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 49 | ||||
-rw-r--r-- | src/main.rs | 55 |
2 files changed, 51 insertions, 53 deletions
diff --git a/src/lib.rs b/src/lib.rs index 1cc01c2..2d15423 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -206,3 +206,52 @@ pub mod companion { ) } } + +async fn teapot_route() -> impl axum::response::IntoResponse { + use axum::http::{header, StatusCode}; + (StatusCode::IM_A_TEAPOT, [(header::CONTENT_TYPE, "text/plain")], "Sorry, can't brew coffee yet!") +} + +async fn health_check<D>( + axum::extract::State(data): axum::extract::State<D>, +) -> impl axum::response::IntoResponse +where + D: crate::database::Storage +{ + (axum::http::StatusCode::OK, std::borrow::Cow::Borrowed("OK")) +} + +pub async fn compose_kittybox<St, A, S, M, Q>() -> axum::Router<St> +where +A: AuthBackend + 'static + FromRef<St>, +S: Storage + 'static + FromRef<St>, +M: MediaStore + 'static + FromRef<St>, +Q: kittybox_util::queue::JobQueue<crate::webmentions::Webmention> + FromRef<St>, +reqwest::Client: FromRef<St>, +Arc<Mutex<JoinSet<()>>>: FromRef<St>, +St: Clone + Send + Sync + 'static +{ + use axum::routing::get; + axum::Router::new() + .route("/", get(crate::frontend::homepage::<S>)) + .fallback(get(crate::frontend::catchall::<S>)) + .route("/.kittybox/micropub", crate::micropub::router::<A, S, St>()) + .route("/.kittybox/onboarding", crate::frontend::onboarding::router::<St, S>()) + .nest("/.kittybox/media", crate::media::router::<St, A, M>()) + .merge(crate::indieauth::router::<St, A, S>()) + .merge(crate::webmentions::router::<St, Q>()) + .route("/.kittybox/health", get(health_check::<S>)) + .route( + "/.kittybox/static/:path", + axum::routing::get(crate::frontend::statics) + ) + .route("/.kittybox/coffee", get(teapot_route)) + .nest("/.kittybox/micropub/client", crate::companion::router::<St>()) + .layer(tower_http::trace::TraceLayer::new_for_http()) + .layer(tower_http::catch_panic::CatchPanicLayer::new()) + .layer(tower_http::sensitive_headers::SetSensitiveHeadersLayer::new([ + axum::http::header::AUTHORIZATION, + axum::http::header::COOKIE, + axum::http::header::SET_COOKIE, + ])) +} diff --git a/src/main.rs b/src/main.rs index 90fa196..788e765 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,60 +1,9 @@ -use axum::extract::FromRef; -use kittybox::{database::Storage, indieauth::backend::AuthBackend, media::storage::MediaStore, webmentions::Webmention}; +use kittybox::{database::Storage, indieauth::backend::AuthBackend, media::storage::MediaStore, webmentions::Webmention, compose_kittybox}; use tokio::{sync::Mutex, task::JoinSet}; use std::{env, time::Duration, sync::Arc}; use tracing::error; -async fn teapot_route() -> impl axum::response::IntoResponse { - use axum::http::{header, StatusCode}; - (StatusCode::IM_A_TEAPOT, [(header::CONTENT_TYPE, "text/plain")], "Sorry, can't brew coffee yet!") -} - -async fn health_check<D>( - axum::extract::State(data): axum::extract::State<D>, -) -> impl axum::response::IntoResponse -where - D: kittybox::database::Storage -{ - (axum::http::StatusCode::OK, std::borrow::Cow::Borrowed("OK")) -} - - -async fn compose_stateful_kittybox<St, A, S, M, Q>() -> axum::Router<St> -where -A: AuthBackend + 'static + FromRef<St>, -S: Storage + 'static + FromRef<St>, -M: MediaStore + 'static + FromRef<St>, -Q: kittybox_util::queue::JobQueue<kittybox::webmentions::Webmention> + FromRef<St>, -reqwest::Client: FromRef<St>, -Arc<Mutex<JoinSet<()>>>: FromRef<St>, -St: Clone + Send + Sync + 'static -{ - use axum::routing::get; - axum::Router::new() - .route("/", get(kittybox::frontend::homepage::<S>)) - .fallback(get(kittybox::frontend::catchall::<S>)) - .route("/.kittybox/micropub", kittybox::micropub::router::<A, S, St>()) - .route("/.kittybox/onboarding", kittybox::frontend::onboarding::router::<St, S>()) - .nest("/.kittybox/media", kittybox::media::router::<St, A, M>()) - .merge(kittybox::indieauth::router::<St, A, S>()) - .merge(kittybox::webmentions::router::<St, Q>()) - .route("/.kittybox/health", get(health_check::<S>)) - .route( - "/.kittybox/static/:path", - axum::routing::get(kittybox::frontend::statics) - ) - .route("/.kittybox/coffee", get(teapot_route)) - .nest("/.kittybox/micropub/client", kittybox::companion::router::<St>()) - .layer(tower_http::trace::TraceLayer::new_for_http()) - .layer(tower_http::catch_panic::CatchPanicLayer::new()) - .layer(tower_http::sensitive_headers::SetSensitiveHeadersLayer::new([ - axum::http::header::AUTHORIZATION, - axum::http::header::COOKIE, - axum::http::header::SET_COOKIE, - ])) -} - #[tokio::main] async fn main() { use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Registry}; @@ -221,7 +170,7 @@ async fn main() { }; type St = kittybox::AppState<AuthBackend, Storage, MediaStore, JobQueue>; - let stateful_router = compose_stateful_kittybox::<St, AuthBackend, Storage, MediaStore, JobQueue>().await; + let stateful_router = compose_kittybox::<St, AuthBackend, Storage, MediaStore, JobQueue>().await; let task = kittybox::webmentions::supervised_webmentions_task::<St, Storage, JobQueue>(&state, cancellation_token.clone()); let router = stateful_router.with_state(state); |