summaryrefslogtreecommitdiff
path: root/src/event
diff options
context:
space:
mode:
authorojacobson <ojacobson@noreply.codeberg.org>2025-06-21 04:22:52 +0200
committerojacobson <ojacobson@noreply.codeberg.org>2025-06-21 04:22:52 +0200
commitcd1dc0dab4b46bc5712070812192d5ce34071470 (patch)
treec94f5a42f7e734b81892c1289a1d2b566706ba7c /src/event
parentd84ba5cd09b713fac2f193d5c05af7415ea6742d (diff)
parent4e3d5ccac99b24934c972e088cd7eb02bb95df06 (diff)
Reorganize and consolidate HTTP routes.
HTTP routes are now defined in a single, unified module, pulling them out of the topical modules they were formerly part of. This is intended to improve the navigability of the codebase. Previously, finding the handler corresponding to a specific endpoint required prior familiarity, though in practice you could usually guess from topic area. Now, all routes are defined in one place; if you know the path, you can read down the list to find the handler. Handlers themselves live with the domain they are most appropriately "part of," generally (in this version, universally) in a `handlers` submodule. The handlers themselves have been flattened down; rather than representing a path and a method, they now represent a named operation (which is suspiciously similar to the path in most cases). This means that we no longer have constructs like `crate::ui::routes::ch::channel` - it's now `crate::ui::handlers::channel` instead. ## Disclaimer I Solemnly Swear I Didn't Change Any Handlers. ## Prior art I've inadvertently reinvented Django's `urls.py` convention, and I've opted to lean into that. Merges flatter-routes-reorg into main.
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.rs10
-rw-r--r--src/event/routes/mod.rs11
11 files changed, 73 insertions, 91 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 1f2ec42..6657243 100644
--- a/src/event/mod.rs
+++ b/src/event/mod.rs
@@ -1,18 +1,18 @@
-use crate::{channel, message, user};
-use axum::response::sse;
-use axum::response::sse::KeepAlive;
use std::time::Duration;
+use axum::response::sse::{self, KeepAlive};
+
+use crate::{channel, message, user};
+
pub mod app;
mod broadcaster;
mod extract;
+pub mod handlers;
pub mod repo;
-mod routes;
mod sequence;
pub use self::{
broadcaster::Broadcaster,
- routes::router,
sequence::{Instant, Sequence, Sequenced},
};
diff --git a/src/event/routes/mod.rs b/src/event/routes/mod.rs
deleted file mode 100644
index 742d397..0000000
--- a/src/event/routes/mod.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-use axum::{Router, routing::get};
-
-use crate::app::App;
-
-mod get;
-#[cfg(test)]
-mod test;
-
-pub fn router() -> Router<App> {
- Router::new().route("/api/events", get(get::handler))
-}