use axum::Router; use axum::middleware::from_fn_with_state; use axum::routing::{delete, get, patch, post}; use crate::features::IssueService; use jwt::inject_jwt_ctx; use rate_limit::ratelimit; pub fn router(svc: IssueService) -> Router { let protected: Router = Router::new() .route("/issues", post(super::issues::create::handler)) .route("/issues", get(super::issues::list::handler)) .route("/issues/:channel_id", get(super::issues::get::handler)) .route("/issues/:channel_id", patch(super::issues::update::handler)) .route("/issues/:channel_id", delete(super::issues::delete::handler)) .route("/issues/:channel_id", post(super::issue::create::handler)) .route( "/issues/:channel_id/:issue_id", get(super::issue::get::handler) .patch(super::issue::update::handler) .delete(super::issue::delete::handler), ) .route( "/issues/:channel_id/:issue_id/close", post(super::issue::close::handler), ) .route( "/issues/:channel_id/:issue_id/comments", get(super::comment::list::handler).post(super::comment::create::handler), ) .route( "/issues/:channel_id/:issue_id/comments/:comment_id", get(super::comment::get::handler) .patch(super::comment::update::handler) .delete(super::comment::delete::handler), ) .route( "/issues/:channel_id/labels", get(super::label::list::handler).post(super::label::create::handler), ) .route( "/issues/:channel_id/:issue_id/labels", get(super::label::list_for_issue::handler), ) .route( "/issues/:channel_id/:issue_id/labels/:label_id", post(super::label::bind::handler).delete(super::label::unbind::handler), ) .route( "/issues/:channel_id/labels/:label_id", get(super::label::get::handler) .patch(super::label::update::handler) .delete(super::label::delete::handler), ) .route( "/issues/:channel_id/milestones", get(super::milestone::list::handler).post(super::milestone::create::handler), ) .route( "/issues/:channel_id/milestones/:milestone_id", get(super::milestone::get::handler) .patch(super::milestone::update::handler) .delete(super::milestone::delete::handler), ) .route( "/issues/:channel_id/:issue_id/reactions", post(super::issue_reaction::create::handler) .get(super::issue_reaction::list::handler), ) .route( "/issues/:channel_id/:issue_id/comments/:comment_id/reactions", post(super::issue_reaction::create_comment::handler) .get(super::issue_reaction::list_comment::handler), ) .route( "/issues/:channel_id/:issue_id/reactions/:reaction_id", delete(super::issue_reaction::delete::handler), ) .route( "/issues/:channel_id/:issue_id/watch", get(super::issue_watch::get::handler) .put(super::issue_watch::upsert::handler) .delete(super::issue_watch::delete::handler), ) .route( "/issues/:channel_id/:issue_id/members", get(super::issue_member::list::handler).post(super::issue_member::create::handler), ) .route( "/issues/:channel_id/:issue_id/members/:member_id", delete(super::issue_member::delete::handler), ) .route( "/issues/:channel_id/pins", get(super::issue_pin::list::handler).post(super::issue_pin::create::handler), ) .route( "/issues/:channel_id/pins/:pin_id", delete(super::issue_pin::delete::handler), ) .route( "/issues/:channel_id/:issue_id/repo_relations", get(super::issue_repo_rel::list::handler).post(super::issue_repo_rel::create::handler), ) .route( "/issues/:channel_id/:issue_id/repo_relations/:rel_id", delete(super::issue_repo_rel::delete::handler), ) .route( "/issues/:channel_id/:issue_id/users", get(super::issue_user::list::handler), ) .route( "/issues/:channel_id/:issue_id/users/:uid", patch(super::issue_user::update::handler), ) .route( "/issues/:channel_id/:issue_id/events", get(super::issue_event::list::handler), ) .route( "/issues/:channel_id/:issue_id/dependencies", get(super::issue_dependency::list::handler) .post(super::issue_dependency::create::handler), ) .route( "/issues/:channel_id/:issue_id/dependencies/:dep_id", delete(super::issue_dependency::delete::handler), ) .route( "/issues/:channel_id/:issue_id/content_history", get(super::issue_content_history::list::handler), ) .route( "/issues/:channel_id/:issue_id/stopwatch", get(super::issue_stopwatch::get::handler) .post(super::issue_stopwatch::start::handler) .delete(super::issue_stopwatch::stop::handler), ) .route( "/issues/:channel_id/:issue_id/tracked_time", get(super::issue_tracked_time::list::handler), ) .route( "/issues/:channel_id/attachments/:owner_type/:owner_id", post(super::issue_attachment::upload::handler) .get(super::issue_attachment::list::handler), ) .route( "/issues/:channel_id/attachments/:owner_type/:owner_id/:att_id", delete(super::issue_attachment::delete::handler), ) .layer(from_fn_with_state( svc.clone(), inject_jwt_ctx::, )); Router::new() .merge(protected) .layer(from_fn_with_state(svc.clone(), ratelimit::)) .with_state(svc) }