summaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2025-06-17 02:11:45 -0400
committerOwen Jacobson <owen@grimoire.ca>2025-06-18 18:31:40 -0400
commit4e3d5ccac99b24934c972e088cd7eb02bb95df06 (patch)
treec94f5a42f7e734b81892c1289a1d2b566706ba7c /src/boot
parent5ed96f8e8b9d9f19ee249f5c73a5a21ef6bca09f (diff)
Handlers are _named operations_, which can be exposed via routes.
Each domain module that exposes handlers does so through a `handlers` child module, ideally as a top-level symbol that can be plugged directly into Axum's `MethodRouter`. Modules could make exceptions to this - kill the doctrinaire inside yourself, after all - but none of the API modules that actually exist need such exceptions, and consistency is useful. The related details of request types, URL types, response types, errors, &c &c are then organized into modules under `handlers`, along with their respective tests.
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/handlers/boot/mod.rs (renamed from src/boot/routes/get.rs)3
-rw-r--r--src/boot/handlers/boot/test.rs (renamed from src/boot/routes/test.rs)17
-rw-r--r--src/boot/handlers/mod.rs3
-rw-r--r--src/boot/mod.rs2
-rw-r--r--src/boot/routes/mod.rs3
5 files changed, 15 insertions, 13 deletions
diff --git a/src/boot/routes/get.rs b/src/boot/handlers/boot/mod.rs
index 4873b7a..010f57b 100644
--- a/src/boot/routes/get.rs
+++ b/src/boot/handlers/boot/mod.rs
@@ -5,6 +5,9 @@ use axum::{
use crate::{app::App, boot::Snapshot, error::Internal, token::extract::Identity, user::User};
+#[cfg(test)]
+mod test;
+
pub async fn handler(State(app): State<App>, identity: Identity) -> Result<Response, Internal> {
let snapshot = app.boot().snapshot().await?;
Ok(Response {
diff --git a/src/boot/routes/test.rs b/src/boot/handlers/boot/test.rs
index 55802fe..0a7622b 100644
--- a/src/boot/routes/test.rs
+++ b/src/boot/handlers/boot/test.rs
@@ -1,6 +1,5 @@
use axum::extract::State;
-use super::get;
use crate::test::fixtures;
#[tokio::test]
@@ -8,7 +7,7 @@ async fn returns_identity() {
let app = fixtures::scratch_app().await;
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer.clone())
+ let response = super::handler(State(app), viewer.clone())
.await
.expect("boot always succeeds");
@@ -21,7 +20,7 @@ async fn includes_logins() {
let spectator = fixtures::user::create(&app, &fixtures::now()).await;
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
@@ -34,7 +33,7 @@ async fn includes_channels() {
let channel = fixtures::channel::create(&app, &fixtures::now()).await;
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
@@ -49,7 +48,7 @@ async fn includes_messages() {
let message = fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await;
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
@@ -70,7 +69,7 @@ async fn excludes_expired_messages() {
.expect("expiry never fails");
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
@@ -90,7 +89,7 @@ async fn excludes_deleted_messages() {
.expect("deleting valid message succeeds");
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
@@ -108,7 +107,7 @@ async fn excludes_expired_channels() {
.expect("expiry never fails");
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
@@ -126,7 +125,7 @@ async fn excludes_deleted_channels() {
.expect("deleting a valid channel succeeds");
let viewer = fixtures::identity::fictitious();
- let response = get::handler(State(app), viewer)
+ let response = super::handler(State(app), viewer)
.await
.expect("boot always succeeds");
diff --git a/src/boot/handlers/mod.rs b/src/boot/handlers/mod.rs
new file mode 100644
index 0000000..194c4a9
--- /dev/null
+++ b/src/boot/handlers/mod.rs
@@ -0,0 +1,3 @@
+mod boot;
+
+pub use boot::handler as boot;
diff --git a/src/boot/mod.rs b/src/boot/mod.rs
index 2b74de1..48da4f0 100644
--- a/src/boot/mod.rs
+++ b/src/boot/mod.rs
@@ -5,7 +5,7 @@ use serde::Serialize;
use crate::{channel::Channel, event::Sequence, message::Message, user::User};
pub mod app;
-pub mod routes;
+pub mod handlers;
#[derive(serde::Serialize)]
pub struct Snapshot {
diff --git a/src/boot/routes/mod.rs b/src/boot/routes/mod.rs
deleted file mode 100644
index 60ad5d8..0000000
--- a/src/boot/routes/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod get;
-#[cfg(test)]
-mod test;