about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVika <vika@fireburn.ru>2024-08-01 20:10:21 +0300
committerVika <vika@fireburn.ru>2024-08-01 20:40:32 +0300
commit3c4eb66ca5f96b8cc3289aba6c34373df1dba64a (patch)
tree9f766829032ea6955bb8c1f40fb0d57f277bb2e3
parentd3e2cc0b49f6c5e9385ac55b55ddc337afc3ef4e (diff)
downloadkittybox-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.
-rw-r--r--src/lib.rs49
-rw-r--r--src/main.rs55
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);