Files
SCOPENET-MC/panel/server/src/routes/mod.rs
T

218 lines
13 KiB
Rust

pub mod account;
pub mod achievements;
pub mod activity;
pub mod admin;
pub mod connections;
pub mod economy;
pub mod guild_bank;
pub mod guilds;
pub mod landing;
pub mod livemap;
pub mod leveling;
pub mod meta;
pub mod progression;
pub mod public;
pub mod quests;
pub mod servers;
pub mod social;
use crate::state::AppState;
use axum::extract::DefaultBodyLimit;
use axum::routing::{delete, get, post, put};
use axum::Router;
pub fn api(state: &AppState) -> Router<AppState> {
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("/instances", get(admin::list_instances))
.route("/auth/login", post(public::login))
.route("/auth/register", post(public::register))
.route("/auth/me", get(public::me))
.route("/auth/connections/config", get(connections::public_config))
.route("/auth/forgot-password", post(connections::forgot_password))
.route("/auth/reset-password", post(connections::reset_password))
.route("/auth/discord/start", get(connections::discord_start))
.route("/auth/discord/callback", get(connections::discord_callback))
.route("/auth/discord/poll", get(connections::discord_poll))
.route("/account/connections/discord", get(connections::my_discord).delete(connections::unlink_discord))
.route("/account/profile", get(account::profile))
.route("/account/stats", get(servers::account_player_stats))
.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("/servers/public", get(servers::public_servers))
.route("/servers/{id}/leaderboard", get(servers::public_server_leaderboard))
.route("/servers/{id}/livemap", get(livemap::viewer_info))
.route("/leaderboard", get(servers::global_leaderboard))
.route("/landing", get(landing::public_landing))
.route("/launcher/authlib-injector.json", get(account::authlib_index))
.route("/launcher/authlib-injector.jar", get(account::authlib_jar))
// Leveling & Rewards
.route("/levels/me", get(leveling::get_my_levels))
.route("/leveling/me", get(leveling::get_my_levels))
.route("/levels/player/{uuid}", get(leveling::get_player_levels))
.route("/levels/leaderboard", get(leveling::get_level_leaderboard))
.route("/levels/rewards", get(leveling::list_rewards))
// Daily & Weekly Quests
.route("/quests/my", get(quests::get_my_quests))
.route("/quests/me", get(quests::get_my_quests))
.route("/quests/{id}/claim", post(quests::claim_quest))
// Achievements
.route("/achievements/my", get(achievements::get_my_achievements))
.route("/achievements/me", get(achievements::get_my_achievements))
.route("/achievements/player/{uuid}", get(achievements::get_player_achievements))
// Guilds & Land Claims
.route("/guilds", get(guilds::list_guilds).post(guilds::create_guild))
.route("/guilds/my", get(guilds::get_my_guild))
.route("/guilds/claims/grid", get(guilds::get_chunk_grid))
.route("/guilds/claims/{id}", delete(guilds::unclaim_by_id))
.route("/guilds/{id}", get(guilds::get_guild_by_id).put(guilds::update_guild))
.route("/guilds/{id}/members", get(guilds::get_guild_members).post(guilds::add_guild_member))
.route("/guilds/{id}/members/{uuid}", delete(guilds::remove_guild_member))
.route("/guilds/{id}/posts", get(guilds::get_guild_posts).post(guilds::create_guild_post))
.route("/guilds/{id}/wallet", get(guilds::guild_wallet))
.route("/guilds/{id}/wallet/deposit", post(guilds::guild_wallet_deposit))
.route("/guilds/{id}/wallet/withdraw", post(guilds::guild_wallet_withdraw))
.route("/guilds/{id}/claims", post(guilds::claim_chunk).delete(guilds::unclaim_chunk))
.route("/guilds/{id}/claim", post(guilds::claim_chunk))
.route("/guilds/{id}/unclaim", post(guilds::unclaim_chunk))
// Economy
.route("/economy/me", get(economy::get_my_balances))
.route("/economy/balances", get(economy::get_my_balances))
.route("/economy/transactions", get(economy::get_my_transactions))
.route("/servers/{id}/economy/baltop", get(economy::get_server_baltop))
.route("/servers/{id}/economy/market", get(economy::get_server_market))
// Social: Friends, DMs, Invites, Profiles, Posts, Members Search
.route("/friends", get(social::list_friends))
.route("/friends/request", post(social::send_friend_request))
.route("/friends/respond", post(social::respond_friend_request))
.route("/friends/{uuid}/accept", post(social::accept_friend_request))
.route("/friends/{uuid}", delete(social::remove_friend))
.route("/messages/{uuid}", get(social::get_direct_messages).post(social::send_direct_message))
.route("/invites", get(social::list_my_game_invites).post(social::send_game_invite))
.route("/invites/{id}/respond", post(social::respond_game_invite))
.route("/profiles/me", put(social::update_my_profile))
.route("/profiles/{uuid}", get(social::get_player_profile))
.route("/profiles/me/posts", post(social::create_user_post))
.route("/profiles/me/posts/{id}", delete(social::delete_user_post))
.route("/posts/{id}/like", post(social::like_user_post))
.route("/social/friends", get(social::list_friends))
.route("/social/friends/request", post(social::send_friend_request))
.route("/social/friends/respond", post(social::respond_friend_request))
.route("/social/messages/{uuid}", get(social::get_direct_messages).post(social::send_direct_message))
.route("/social/profile/me", put(social::update_my_profile))
.route("/social/profile/{uuid}", get(social::get_player_profile))
.route("/social/posts", post(social::create_user_post))
.route("/social/posts/{id}/like", post(social::like_user_post))
.route("/social/members", get(social::search_members))
.route("/members/search", get(social::search_members))
.layer(DefaultBodyLimit::max(4 * 1024 * 1024));
let admin = Router::new()
.route("/connections", get(connections::admin_get).put(connections::admin_put))
.route("/connections/test-email", post(connections::admin_test_email))
.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("/landing", get(landing::admin_get_landing).put(landing::admin_put_landing))
.route("/landing/upload-launcher", post(landing::upload_launcher))
.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("/servers/{id}/livemap", get(livemap::admin_status).delete(livemap::admin_reset))
.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))
// Admin Quests & Achievements & Rewards & Guilds
.route("/rewards", get(leveling::list_rewards).post(leveling::admin_create_reward))
.route("/rewards/{id}", put(leveling::admin_update_reward).delete(leveling::admin_delete_reward))
.route("/levels/rewards", get(leveling::list_rewards).post(leveling::admin_create_reward))
.route("/levels/rewards/{id}", put(leveling::admin_update_reward).delete(leveling::admin_delete_reward))
.route("/quests", get(quests::admin_list_quests).post(quests::admin_create_quest))
.route("/quests/{id}", put(quests::admin_update_quest).delete(quests::admin_delete_quest))
.route("/achievements", get(achievements::admin_list_achievements).post(achievements::admin_create_achievement))
.route("/achievements/{id}", put(achievements::admin_update_achievement).delete(achievements::admin_delete_achievement))
.route("/progression", get(progression::get_settings).put(progression::put_settings))
.route("/progression/players", get(progression::list_players))
.route("/progression/players/{uuid}", get(progression::get_player))
.route("/progression/players/{uuid}/adjust", post(progression::adjust_player))
.route("/guilds", get(guilds::admin_list_guilds))
.route("/guilds/{id}", delete(guilds::admin_delete_guild))
.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))
.route("/guilds/check-chunk", post(guilds::server_check_chunk))
.route("/guilds/claim-snapshot", post(guilds::server_claim_snapshot))
.route("/guilds/claim-index", post(guilds::server_claim_index))
.route("/guilds/claim", post(guilds::server_claim_chunk))
.route("/guilds/unclaim", post(guilds::server_unclaim_chunk))
.route("/guilds/player", post(guilds::server_get_player_guild))
.route("/guilds/create", post(guilds::server_create_guild))
.route("/guilds/leave", post(guilds::server_guild_leave))
.route("/guilds/bank", post(guild_bank::server_bank_info))
.route("/guilds/bank/transfer", post(guild_bank::server_bank_transfer))
.route("/guilds/bank/credit", post(guild_bank::server_bank_credit))
.route("/guilds/bank/pay", post(guild_bank::server_bank_pay))
.route("/economy/balance", post(economy::server_get_balance))
.route("/economy/pay", post(economy::server_transfer))
.route("/economy/transfer", post(economy::server_transfer))
.route("/economy/adjust", post(economy::server_adjust_balance))
.route("/economy/market", post(economy::server_market_read))
.route("/economy/sync-balance", post(economy::server_sync_balance))
.route("/economy/baltop", post(economy::server_baltop))
.route("/economy/market/list", post(economy::server_market_list))
.route("/economy/market/buy", post(economy::server_market_buy))
.layer(DefaultBodyLimit::max(2 * 1024 * 1024));
// Live map ingest: chunk batches are larger than the other game calls.
let livemap_game = Router::new()
.route("/livemap/config", get(livemap::game_config_route))
.route("/livemap/manifest", get(livemap::game_manifest))
.route("/livemap/chunks", post(livemap::game_chunks))
.route("/livemap/level", post(livemap::game_level))
.route("/livemap/players", post(livemap::game_players))
.route("/livemap/ws", get(livemap::game_ws))
.layer(DefaultBodyLimit::max(10 * 1024 * 1024));
Router::new()
.route("/api/livemap/{id}/{dim}/{*path}", get(livemap::proxy))
.nest("/api/v1", launcher)
.nest("/api/server/v1", game.merge(livemap_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))
}