d5939db
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::<UserService>,
));
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::<UserService>,
));
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::<UserService>,
));
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::<UserService>))
.with_state(svc)
}