pub mod account; pub mod activity; pub mod admin; pub mod meta; pub mod public; pub mod servers; use crate::state::AppState; use axum::extract::DefaultBodyLimit; use axum::routing::{delete, get, post}; use axum::Router; pub fn api(state: &AppState) -> Router { let upload_limit = state.cfg.max_upload_mb * 1024 * 1024; let launcher = Router::new() .route("/launcher/manifest", get(public::manifest)) .route("/launcher/instances/{id}", get(public::instance_manifest)) .route("/launcher/events", post(public::event)) .route("/auth/login", post(public::login)) .route("/auth/register", post(public::register)) .route("/auth/me", get(public::me)) .route("/account/profile", get(account::profile)) .route("/account/username", axum::routing::put(account::set_username)) .route("/account/skin", post(account::upload_skin).delete(account::delete_skin)) .route("/account/skin/model", axum::routing::put(account::set_model)) .route("/account/cape", axum::routing::put(account::set_cape)) .route("/avatar/{id}", get(account::avatar)) .route("/launcher/authlib-injector.json", get(account::authlib_index)) .route("/launcher/authlib-injector.jar", get(account::authlib_jar)) .layer(DefaultBodyLimit::max(4 * 1024 * 1024)); let admin = Router::new() .route("/activity", get(activity::list)) .route("/stats", get(admin::stats)) .route("/users", get(admin::list_users).post(admin::create_user)) .route("/users/{id}", axum::routing::patch(admin::update_user).delete(admin::delete_user)) .route("/groups", get(admin::list_groups).post(admin::create_group)) .route("/groups/{id}", delete(admin::delete_group)) .route("/branding", get(admin::get_branding).put(admin::put_branding)) .route("/settings", get(admin::get_settings).put(admin::put_settings)) .route("/instances", get(admin::list_instances).post(admin::create_instance)) .route("/instances/{id}", get(admin::get_instance).put(admin::update_instance).delete(admin::delete_instance)) .route("/instances/{id}/reset", post(admin::reset_source)) .route("/instances/{id}/import/modrinth", post(admin::import_modrinth)) .route("/instances/{id}/import/curseforge", post(admin::import_curseforge)) .route("/instances/{id}/import/upload", post(admin::import_upload)) .route("/instances/{id}/files", post(admin::upload_files).delete(admin::delete_file)) .route("/uploads", post(admin::upload_media)) .route("/users/{id}/skin", post(admin::admin_set_skin).delete(admin::admin_delete_skin)) .route("/users/{id}/skin/model", axum::routing::put(admin::admin_set_model)) .route("/users/{id}/cape", axum::routing::put(admin::admin_set_cape)) .route("/capes", get(admin::list_capes).post(admin::create_cape)) .route("/capes/{id}", axum::routing::put(admin::update_cape).delete(admin::delete_cape)) .route("/auth-server", get(admin::auth_server_info)) .route("/servers", get(servers::list).post(servers::create)) .route("/servers/{id}", get(servers::detail).put(servers::update).delete(servers::remove)) .route("/servers/{id}/token", post(servers::regenerate_token)) .route("/users/{id}/activity", get(servers::user_activity)) .route("/meta/minecraft", get(meta::minecraft)) .route("/meta/loaders/{loader}", get(meta::loaders)) .route("/modrinth/search", get(meta::modrinth_search)) .route("/modrinth/project/{id}/versions", get(meta::modrinth_versions)) .route("/curseforge/search", get(meta::curseforge_search)) .route("/curseforge/mod/{id}/files", get(meta::curseforge_files)) .layer(DefaultBodyLimit::max(upload_limit)); // Called by the SCOPENET Paper plugin and Fabric/Forge mods. let game = Router::new() .route("/hello", post(servers::hello)) .route("/login", post(servers::login)) .route("/sync", post(servers::sync)) .layer(DefaultBodyLimit::max(2 * 1024 * 1024)); Router::new() .nest("/api/v1", launcher) .nest("/api/server/v1", game) .nest("/api/admin", admin) .merge(crate::yggdrasil::routes().layer(DefaultBodyLimit::max(4 * 1024 * 1024))) .layer(axum::middleware::from_fn_with_state(state.clone(), activity::audit)) }