summaryrefslogtreecommitdiff
path: root/src/routes.rs
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/routes.rs
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/routes.rs')
-rw-r--r--src/routes.rs61
1 files changed, 20 insertions, 41 deletions
diff --git a/src/routes.rs b/src/routes.rs
index 5bb5f91..1e66582 100644
--- a/src/routes.rs
+++ b/src/routes.rs
@@ -9,56 +9,35 @@ use crate::{app::App, boot, channel, event, expire, invite, message, setup, ui,
pub fn routes(app: &App) -> Router<App> {
// UI routes that can be accessed before the administrator completes setup.
let ui_bootstrap = Router::new()
- .route("/{*path}", get(ui::routes::path::get::handler))
- .route("/setup", get(ui::routes::setup::get::handler));
+ .route("/{*path}", get(ui::handlers::asset))
+ .route("/setup", get(ui::handlers::setup));
// UI routes that require the administrator to complete setup first.
let ui_setup_required = Router::new()
- .route("/", get(ui::routes::get::handler))
- .route("/ch/{channel}", get(ui::routes::ch::channel::get::handler))
- .route(
- "/invite/{invite}",
- get(ui::routes::invite::invite::get::handler),
- )
- .route("/login", get(ui::routes::login::get::handler))
- .route("/me", get(ui::routes::me::get::handler))
+ .route("/", get(ui::handlers::index))
+ .route("/ch/{channel}", get(ui::handlers::channel))
+ .route("/invite/{invite}", get(ui::handlers::invite))
+ .route("/login", get(ui::handlers::login))
+ .route("/me", get(ui::handlers::me))
.route_layer(crate::setup::Required(app.clone()).with_fallback(Redirect::to("/setup")));
// API routes that can run before the administrator completes setup.
- let api_bootstrap = Router::new().route("/api/setup", post(setup::routes::post::handler));
+ let api_bootstrap = Router::new().route("/api/setup", post(setup::handlers::setup));
// API routes that require the administrator to complete setup first.
let api_setup_required = Router::new()
- .route("/api/auth/login", post(user::routes::login::post::handler))
- .route(
- "/api/auth/logout",
- post(user::routes::logout::post::handler),
- )
- .route("/api/boot", get(boot::routes::get::handler))
- .route("/api/channels", post(channel::routes::post::handler))
- .route(
- "/api/channels/{channel}",
- post(channel::routes::channel::post::handler),
- )
- .route(
- "/api/channels/{channel}",
- delete(channel::routes::channel::delete::handler),
- )
- .route("/api/events", get(event::routes::get::handler))
- .route("/api/invite", post(invite::routes::post::handler))
- .route(
- "/api/invite/{invite}",
- get(invite::routes::invite::get::handler),
- )
- .route(
- "/api/invite/{invite}",
- post(invite::routes::invite::post::handler),
- )
- .route(
- "/api/messages/{message}",
- delete(message::routes::message::delete::handler),
- )
- .route("/api/password", post(user::routes::password::post::handler))
+ .route("/api/auth/login", post(user::handlers::login))
+ .route("/api/auth/logout", post(user::handlers::logout))
+ .route("/api/boot", get(boot::handlers::boot))
+ .route("/api/channels", post(channel::handlers::create))
+ .route("/api/channels/{channel}", post(channel::handlers::send))
+ .route("/api/channels/{channel}", delete(channel::handlers::delete))
+ .route("/api/events", get(event::handlers::stream))
+ .route("/api/invite", post(invite::handlers::issue))
+ .route("/api/invite/{invite}", get(invite::handlers::get))
+ .route("/api/invite/{invite}", post(invite::handlers::accept))
+ .route("/api/messages/{message}", delete(message::handlers::delete))
+ .route("/api/password", post(user::handlers::change_password))
// Run expiry whenever someone accesses the API. This was previously a blanket middleware
// affecting the whole service, but loading the client makes a several requests before the
// client can completely load, each of which was triggering expiry. There is absolutely no