use axum::Router; use axum::middleware::from_fn_with_state; use axum::routing::{delete, get, patch, post}; use crate::features::UserService; use jwt::inject_jwt_ctx; use rate_limit::ratelimit; pub fn router(svc: UserService) -> Router { let public = Router::new().route("/users/:uid", get(super::profile::public_view::handler)); let user_social = Router::new() .route( "/users/:uid/follow", post(super::social::follow::handler).delete(super::social::unfollow::handler), ) .route( "/users/:uid/followers", get(super::social::list_followers::handler), ) .route( "/users/:uid/following", get(super::social::list_following::handler), ); let me_protected = Router::new() .route("/me", get(super::profile::me::handler)) .route("/me/profile", patch(super::profile::update_profile::handler)) .route( "/me/avatar", get(super::avatar::current::handler) .put(super::avatar::upload::handler) .delete(super::avatar::delete::handler), ) .route( "/me/preferences", get(super::preferences::get::handler).patch(super::preferences::update::handler), ) .route( "/me/memes", get(super::profile::memes::list_handler).post(super::profile::memes::create_handler), ) .route( "/me/memes/:id", delete(super::profile::memes::delete_handler), ) .route( "/me/devices", get(super::devices::list_devices::handler), ) .route( "/me/devices/:id", patch(super::devices::update_device::handler).delete(super::devices::delete_device::handler), ) .route( "/me/sessions", get(super::sessions::list_sessions::handler).delete(super::sessions::revoke_sessions::handler), ) .route( "/me/sessions/:id", delete(super::sessions::revoke_session::handler), ) .route( "/me/emails", get(super::emails::list_emails::handler).post(super::emails::add_email::handler), ) .route( "/me/emails/:email_id/primary", patch(super::emails::set_primary::handler), ) .route( "/me/emails/:email_id", delete(super::emails::delete_email::handler), ) .route( "/me/email-change", post(super::emails::request_change::handler), ) .route( "/me/email-change/confirm", post(super::emails::confirm_change::handler), ) .route( "/me/email-change/:ticket_id", delete(super::emails::cancel_change::handler), ) .route( "/me/blocks", get(super::social::list_blocks::handler), ) .route( "/me/blocks/:uid", post(super::social::block::handler).delete(super::social::unblock::handler), ) .route( "/me/deletion", post(super::deletion::request::handler).delete(super::deletion::cancel::handler), ) .route( "/me/deletion/confirm", post(super::deletion::confirm::handler), ) .route( "/me/suspensions", get(super::suspensions::list_self::handler), ) .route( "/me/recovery-codes", get(super::security::recovery_codes::list::handler), ) .route( "/me/recovery-codes/regenerate", post(super::security::recovery_codes::regenerate::handler), ) .route( "/me/access-keys", get(super::security::access_keys::list_keys::handler) .post(super::security::access_keys::create_key::handler), ) .route( "/me/access-keys/:id", delete(super::security::access_keys::delete_key::handler), ) .route( "/me/ssh-keys", get(super::security::ssh_keys::list_keys::handler).post(super::security::ssh_keys::add_key::handler), ) .route( "/me/ssh-keys/:id", delete(super::security::ssh_keys::delete_key::handler), ) .route( "/me/push-subscriptions", get(super::security::push_subscriptions::list::handler) .post(super::security::push_subscriptions::upsert::handler), ) .route( "/me/push-subscriptions/:id", delete(super::security::push_subscriptions::delete::handler), ) .route( "/me/notifications", get(super::notifications::list_notifications::handler) .patch(super::notifications::mark_read::handler), ) .route( "/me/notifications/mark-all-read", post(super::notifications::mark_all_read::handler), ) .route( "/me/notifications/unread-count", get(super::notifications::unread_count::handler), ) .route( "/me/recent-mentions", get(super::notifications::recent_mentions::handler), ) .route( "/me/reports", get(super::notifications::reports::list_my::handler), ) .route( "/me/messages/saved", get(super::notifications::saved_messages::list::handler) .post(super::notifications::saved_messages::save::handler), ) .route( "/me/messages/saved/:message_id", delete(super::notifications::saved_messages::unsave::handler), ) .route( "/me/messages/scheduled", get(super::notifications::scheduled_messages::list::handler), ) .route( "/me/messages/scheduled/:id", delete(super::notifications::scheduled_messages::cancel::handler), ) .layer(from_fn_with_state( svc.clone(), inject_jwt_ctx::, )); let admin_protected = Router::new() .route( "/admin/users/:uid/profile", patch(super::profile::update_admin::handler), ) .route( "/admin/users/:uid/suspensions", get(super::suspensions::list_user::handler).post(super::suspensions::create::handler), ) .route( "/admin/suspensions", get(super::suspensions::list_all::handler), ) .route( "/admin/suspensions/:id", delete(super::suspensions::revoke::handler), ) .route( "/admin/deletions", get(super::deletion::list_pending::handler), ) .route( "/admin/deletions/:id/complete", post(super::deletion::complete::handler), ) .layer(from_fn_with_state( svc.clone(), inject_jwt_ctx::, )); let authenticated = Router::new() .route( "/users/:uid/profile-detail", get(super::profile::profile_view::handler), ) .layer(from_fn_with_state( svc.clone(), inject_jwt_ctx::, )); let public_reports = Router::new().route("/reports", post(super::notifications::reports::submit::handler)); Router::new() .merge(public) .merge(public_reports) .merge(user_social) .merge(authenticated) .merge(me_protected) .merge(admin_protected) .layer(from_fn_with_state(svc.clone(), ratelimit::)) .with_state(svc) }