summaryrefslogtreecommitdiff
path: root/src/event
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/event
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/event')
-rw-r--r--src/event/handlers/mod.rs3
-rw-r--r--src/event/handlers/stream/mod.rs (renamed from src/event/routes/get.rs)3
-rw-r--r--src/event/handlers/stream/test/channel.rs (renamed from src/event/routes/test/channel.rs)33
-rw-r--r--src/event/handlers/stream/test/invite.rs (renamed from src/event/routes/test/invite.rs)13
-rw-r--r--src/event/handlers/stream/test/message.rs (renamed from src/event/routes/test/message.rs)41
-rw-r--r--src/event/handlers/stream/test/mod.rs (renamed from src/event/routes/test/mod.rs)2
-rw-r--r--src/event/handlers/stream/test/resume.rs (renamed from src/event/routes/test/resume.rs)22
-rw-r--r--src/event/handlers/stream/test/setup.rs (renamed from src/event/routes/test/setup.rs)9
-rw-r--r--src/event/handlers/stream/test/token.rs (renamed from src/event/routes/test/token.rs)17
-rw-r--r--src/event/mod.rs2
-rw-r--r--src/event/routes/mod.rs3
11 files changed, 69 insertions, 79 deletions
diff --git a/src/event/handlers/mod.rs b/src/event/handlers/mod.rs
new file mode 100644
index 0000000..22d988c
--- /dev/null
+++ b/src/event/handlers/mod.rs
@@ -0,0 +1,3 @@
+mod stream;
+
+pub use stream::handler as stream;
diff --git a/src/event/routes/get.rs b/src/event/handlers/stream/mod.rs
index f6c91fa..d0d3f08 100644
--- a/src/event/routes/get.rs
+++ b/src/event/handlers/stream/mod.rs
@@ -15,6 +15,9 @@ use crate::{
token::{app::ValidateError, extract::Identity},
};
+#[cfg(test)]
+mod test;
+
pub async fn handler(
State(app): State<App>,
identity: Identity,
diff --git a/src/event/routes/test/channel.rs b/src/event/handlers/stream/test/channel.rs
index 0695ab1..187c3c3 100644
--- a/src/event/routes/test/channel.rs
+++ b/src/event/handlers/stream/test/channel.rs
@@ -2,10 +2,7 @@ use axum::extract::State;
use axum_extra::extract::Query;
use futures::{future, stream::StreamExt as _};
-use crate::{
- event::routes::get,
- test::fixtures::{self, future::Expect as _},
-};
+use crate::test::fixtures::{self, future::Expect as _};
#[tokio::test]
async fn creating() {
@@ -17,11 +14,11 @@ async fn creating() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -65,11 +62,11 @@ async fn previously_created() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -96,11 +93,11 @@ async fn expiring() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -140,11 +137,11 @@ async fn previously_expired() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -170,11 +167,11 @@ async fn deleting() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -214,11 +211,11 @@ async fn previously_deleted() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -256,11 +253,11 @@ async fn previously_purged() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
diff --git a/src/event/routes/test/invite.rs b/src/event/handlers/stream/test/invite.rs
index 1d1bec6..c8e12fb 100644
--- a/src/event/routes/test/invite.rs
+++ b/src/event/handlers/stream/test/invite.rs
@@ -2,10 +2,7 @@ use axum::extract::State;
use axum_extra::extract::Query;
use futures::{future, stream::StreamExt as _};
-use crate::{
- event::routes::get,
- test::fixtures::{self, future::Expect as _},
-};
+use crate::test::fixtures::{self, future::Expect as _};
#[tokio::test]
async fn accepting_invite() {
@@ -19,11 +16,11 @@ async fn accepting_invite() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -69,11 +66,11 @@ async fn previously_accepted_invite() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
diff --git a/src/event/routes/test/message.rs b/src/event/handlers/stream/test/message.rs
index 84a3aec..a80c896 100644
--- a/src/event/routes/test/message.rs
+++ b/src/event/handlers/stream/test/message.rs
@@ -5,10 +5,7 @@ use futures::{
stream::{self, StreamExt as _},
};
-use crate::{
- event::routes::get,
- test::fixtures::{self, future::Expect as _},
-};
+use crate::test::fixtures::{self, future::Expect as _};
#[tokio::test]
async fn sending() {
@@ -21,11 +18,11 @@ async fn sending() {
// Call the endpoint
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -80,11 +77,11 @@ async fn previously_sent() {
// Call the endpoint
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -126,11 +123,11 @@ async fn sent_in_multiple_channels() {
// Call the endpoint
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -168,11 +165,11 @@ async fn sent_sequentially() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -207,11 +204,11 @@ async fn expiring() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -253,11 +250,11 @@ async fn previously_expired() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -285,11 +282,11 @@ async fn deleting() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -331,11 +328,11 @@ async fn previously_deleted() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -375,11 +372,11 @@ async fn previously_purged() {
// Subscribe
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
diff --git a/src/event/routes/test/mod.rs b/src/event/handlers/stream/test/mod.rs
index e7e35f1..df43deb 100644
--- a/src/event/routes/test/mod.rs
+++ b/src/event/handlers/stream/test/mod.rs
@@ -4,3 +4,5 @@ mod message;
mod resume;
mod setup;
mod token;
+
+use super::{QueryParams, Response, handler};
diff --git a/src/event/routes/test/resume.rs b/src/event/handlers/stream/test/resume.rs
index 633eae3..34fee4d 100644
--- a/src/event/routes/test/resume.rs
+++ b/src/event/handlers/stream/test/resume.rs
@@ -5,7 +5,7 @@ use axum_extra::extract::Query;
use futures::stream::{self, StreamExt as _};
use crate::{
- event::{Sequenced as _, routes::get},
+ event::Sequenced as _,
test::fixtures::{self, future::Expect as _},
};
@@ -31,11 +31,11 @@ async fn resume() {
let resume_at = {
// First subscription
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber.clone(),
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -52,11 +52,11 @@ async fn resume() {
};
// Resume after disconnect
- let get::Response(resumed) = get::handler(
+ let super::Response(resumed) = super::handler(
State(app),
subscriber,
Some(resume_at.into()),
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -113,11 +113,11 @@ async fn serial_resume() {
// First subscription
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber.clone(),
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -156,11 +156,11 @@ async fn serial_resume() {
];
// Second subscription
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber.clone(),
Some(resume_at.into()),
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -199,11 +199,11 @@ async fn serial_resume() {
];
// Third subscription
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber.clone(),
Some(resume_at.into()),
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
diff --git a/src/event/routes/test/setup.rs b/src/event/handlers/stream/test/setup.rs
index 1170fe4..5335055 100644
--- a/src/event/routes/test/setup.rs
+++ b/src/event/handlers/stream/test/setup.rs
@@ -2,10 +2,7 @@ use axum::extract::State;
use axum_extra::extract::Query;
use futures::{future, stream::StreamExt as _};
-use crate::{
- event::routes::get,
- test::fixtures::{self, future::Expect as _},
-};
+use crate::test::fixtures::{self, future::Expect as _};
// There's no test for this in subscribe-then-setup order because creating an
// identity to subscribe with also completes initial setup, preventing the
@@ -29,11 +26,11 @@ async fn previously_completed() {
// Subscribe to events
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
diff --git a/src/event/routes/test/token.rs b/src/event/handlers/stream/test/token.rs
index a467de5..2008323 100644
--- a/src/event/routes/test/token.rs
+++ b/src/event/handlers/stream/test/token.rs
@@ -2,10 +2,7 @@ use axum::extract::State;
use axum_extra::extract::Query;
use futures::{future, stream::StreamExt as _};
-use crate::{
- event::routes::get,
- test::fixtures::{self, future::Expect as _},
-};
+use crate::test::fixtures::{self, future::Expect as _};
#[tokio::test]
async fn terminates_on_token_expiry() {
@@ -22,11 +19,11 @@ async fn terminates_on_token_expiry() {
let subscriber =
fixtures::identity::logged_in(&app, &subscriber_creds, &fixtures::ancient()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber,
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -67,11 +64,11 @@ async fn terminates_on_logout() {
let subscriber = fixtures::identity::create(&app, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber.clone(),
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
@@ -115,11 +112,11 @@ async fn terminates_on_password_change() {
let cookie = fixtures::cookie::logged_in(&app, &creds, &fixtures::now()).await;
let subscriber = fixtures::identity::from_cookie(&app, &cookie, &fixtures::now()).await;
- let get::Response(events) = get::handler(
+ let super::Response(events) = super::handler(
State(app.clone()),
subscriber.clone(),
None,
- Query(get::QueryParams { resume_point }),
+ Query(super::QueryParams { resume_point }),
)
.await
.expect("subscribe never fails");
diff --git a/src/event/mod.rs b/src/event/mod.rs
index ff30dc7..6657243 100644
--- a/src/event/mod.rs
+++ b/src/event/mod.rs
@@ -7,8 +7,8 @@ use crate::{channel, message, user};
pub mod app;
mod broadcaster;
mod extract;
+pub mod handlers;
pub mod repo;
-pub mod routes;
mod sequence;
pub use self::{
diff --git a/src/event/routes/mod.rs b/src/event/routes/mod.rs
deleted file mode 100644
index 60ad5d8..0000000
--- a/src/event/routes/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod get;
-#[cfg(test)]
-mod test;