use axum::Router; use axum::middleware::from_fn_with_state; use axum::routing::{delete, get, patch, post}; use crate::features::SpaceService; use jwt::inject_jwt_ctx; use rate_limit::ratelimit; pub fn router(svc: SpaceService) -> Router { let public = Router::new() .route("/spaces/:sid", get(super::spaces::get::handler)) .route( "/spaces/:sid/roles/:rid", get(super::roles::get::handler), ) .layer(from_fn_with_state( svc.clone(), inject_jwt_ctx::, )); let protected = Router::new() .route("/spaces", post(super::spaces::create::handler)) .route("/spaces", get(super::spaces::list::handler)) .route( "/spaces/:sid", patch(super::spaces::update::handler).delete(super::spaces::delete::handler), ) .route( "/spaces/:sid/members", post(super::members::add::handler).get(super::members::list::handler), ) .route( "/spaces/:sid/members/:uid", get(super::members::get::handler) .patch(super::members::update::handler) .delete(super::members::remove::handler), ) .route( "/spaces/:sid/roles", post(super::roles::create::handler).get(super::roles::list::handler), ) .route( "/spaces/:sid/roles/:rid", patch(super::roles::update::handler).delete(super::roles::delete::handler), ) .route( "/spaces/:sid/members/:uid/roles", post(super::roles::assign::handler), ) .route( "/spaces/:sid/members/:uid/roles/:rid", delete(super::roles::unassign::handler), ) .route( "/spaces/:sid/invites", post(super::invites::create::handler).get(super::invites::list::handler), ) .route( "/spaces/:sid/invites/:iid", delete(super::invites::revoke::handler), ) .route("/spaces/invites/accept", post(super::invites::accept::handler)) .route( "/spaces/:sid/bans", post(super::bans::ban::handler).get(super::bans::list::handler), ) .route( "/spaces/:sid/bans/:uid", get(super::bans::get::handler) .patch(super::bans::update::handler) .delete(super::bans::unban::handler), ) .route( "/spaces/:sid/channels", get(super::channels::list::handler), ) .route( "/spaces/:sid/channels/:cid", get(super::channels::get::handler), ) .route( "/spaces/:sid/channels/:cid/members", post(super::channel_members::add::handler).get(super::channel_members::list::handler), ) .route( "/spaces/:sid/channels/:cid/members/:uid", get(super::channel_members::get::handler) .patch(super::channel_members::update::handler) .delete(super::channel_members::remove::handler), ) .route( "/spaces/:sid/channels/:cid/overwrites/roles", post(super::overwrites::set_role::handler).get(super::overwrites::list_role::handler), ) .route( "/spaces/:sid/channels/:cid/overwrites/roles/:rid", delete(super::overwrites::remove_role::handler), ) .route( "/spaces/:sid/channels/:cid/overwrites/users", post(super::overwrites::set_user::handler).get(super::overwrites::list_user::handler), ) .route( "/spaces/:sid/channels/:cid/overwrites/users/:uid", delete(super::overwrites::remove_user::handler), ) .layer(from_fn_with_state( svc.clone(), inject_jwt_ctx::, )); Router::new() .merge(public) .merge(protected) .layer(from_fn_with_state(svc.clone(), ratelimit::)) .with_state(svc) }