this repo has no description
1pub mod api; 2pub mod auth; 3pub mod cache; 4pub mod circuit_breaker; 5pub mod config; 6pub mod crawlers; 7pub mod image; 8pub mod notifications; 9pub mod oauth; 10pub mod plc; 11pub mod rate_limit; 12pub mod repo; 13pub mod state; 14pub mod storage; 15pub mod sync; 16pub mod util; 17pub mod validation; 18 19use axum::{ 20 Router, 21 routing::{any, get, post}, 22}; 23use state::AppState; 24use tower_http::services::{ServeDir, ServeFile}; 25 26pub fn app(state: AppState) -> Router { 27 let router = Router::new() 28 .route("/health", get(api::server::health)) 29 .route("/xrpc/_health", get(api::server::health)) 30 .route("/robots.txt", get(api::server::robots_txt)) 31 .route( 32 "/xrpc/com.atproto.server.describeServer", 33 get(api::server::describe_server), 34 ) 35 .route( 36 "/xrpc/com.atproto.server.createAccount", 37 post(api::identity::create_account), 38 ) 39 .route( 40 "/xrpc/com.atproto.server.createSession", 41 post(api::server::create_session), 42 ) 43 .route( 44 "/xrpc/com.atproto.server.getSession", 45 get(api::server::get_session), 46 ) 47 .route( 48 "/xrpc/com.atproto.server.deleteSession", 49 post(api::server::delete_session), 50 ) 51 .route( 52 "/xrpc/com.atproto.server.refreshSession", 53 post(api::server::refresh_session), 54 ) 55 .route( 56 "/xrpc/com.atproto.server.confirmSignup", 57 post(api::server::confirm_signup), 58 ) 59 .route( 60 "/xrpc/com.atproto.server.resendVerification", 61 post(api::server::resend_verification), 62 ) 63 .route( 64 "/xrpc/com.atproto.server.getServiceAuth", 65 get(api::server::get_service_auth), 66 ) 67 .route( 68 "/xrpc/com.atproto.identity.resolveHandle", 69 get(api::identity::resolve_handle), 70 ) 71 .route( 72 "/xrpc/com.atproto.repo.createRecord", 73 post(api::repo::create_record), 74 ) 75 .route( 76 "/xrpc/com.atproto.repo.putRecord", 77 post(api::repo::put_record), 78 ) 79 .route( 80 "/xrpc/com.atproto.repo.getRecord", 81 get(api::repo::get_record), 82 ) 83 .route( 84 "/xrpc/com.atproto.repo.deleteRecord", 85 post(api::repo::delete_record), 86 ) 87 .route( 88 "/xrpc/com.atproto.repo.listRecords", 89 get(api::repo::list_records), 90 ) 91 .route( 92 "/xrpc/com.atproto.repo.describeRepo", 93 get(api::repo::describe_repo), 94 ) 95 .route( 96 "/xrpc/com.atproto.repo.uploadBlob", 97 post(api::repo::upload_blob), 98 ) 99 .route( 100 "/xrpc/com.atproto.repo.applyWrites", 101 post(api::repo::apply_writes), 102 ) 103 .route( 104 "/xrpc/com.atproto.sync.getLatestCommit", 105 get(sync::get_latest_commit), 106 ) 107 .route( 108 "/xrpc/com.atproto.sync.listRepos", 109 get(sync::list_repos), 110 ) 111 .route( 112 "/xrpc/com.atproto.sync.getBlob", 113 get(sync::get_blob), 114 ) 115 .route( 116 "/xrpc/com.atproto.sync.listBlobs", 117 get(sync::list_blobs), 118 ) 119 .route( 120 "/xrpc/com.atproto.sync.getRepoStatus", 121 get(sync::get_repo_status), 122 ) 123 .route( 124 "/xrpc/com.atproto.server.checkAccountStatus", 125 get(api::server::check_account_status), 126 ) 127 .route( 128 "/xrpc/com.atproto.identity.getRecommendedDidCredentials", 129 get(api::identity::get_recommended_did_credentials), 130 ) 131 .route( 132 "/xrpc/com.atproto.repo.listMissingBlobs", 133 get(api::repo::list_missing_blobs), 134 ) 135 .route( 136 "/xrpc/com.atproto.sync.notifyOfUpdate", 137 post(sync::notify_of_update), 138 ) 139 .route( 140 "/xrpc/com.atproto.sync.requestCrawl", 141 post(sync::request_crawl), 142 ) 143 .route( 144 "/xrpc/com.atproto.sync.getBlocks", 145 get(sync::get_blocks), 146 ) 147 .route( 148 "/xrpc/com.atproto.sync.getRepo", 149 get(sync::get_repo), 150 ) 151 .route( 152 "/xrpc/com.atproto.sync.getRecord", 153 get(sync::get_record), 154 ) 155 .route( 156 "/xrpc/com.atproto.sync.subscribeRepos", 157 get(sync::subscribe_repos), 158 ) 159 .route( 160 "/xrpc/com.atproto.sync.getHead", 161 get(sync::get_head), 162 ) 163 .route( 164 "/xrpc/com.atproto.sync.getCheckout", 165 get(sync::get_checkout), 166 ) 167 .route( 168 "/xrpc/com.atproto.moderation.createReport", 169 post(api::moderation::create_report), 170 ) 171 .route( 172 "/xrpc/com.atproto.admin.getAccountInfo", 173 get(api::admin::get_account_info), 174 ) 175 .route( 176 "/xrpc/com.atproto.admin.getAccountInfos", 177 get(api::admin::get_account_infos), 178 ) 179 .route( 180 "/xrpc/com.atproto.server.activateAccount", 181 post(api::server::activate_account), 182 ) 183 .route( 184 "/xrpc/com.atproto.server.deactivateAccount", 185 post(api::server::deactivate_account), 186 ) 187 .route( 188 "/xrpc/com.atproto.server.requestAccountDelete", 189 post(api::server::request_account_delete), 190 ) 191 .route( 192 "/xrpc/com.atproto.server.deleteAccount", 193 post(api::server::delete_account), 194 ) 195 .route( 196 "/xrpc/com.atproto.server.requestPasswordReset", 197 post(api::server::request_password_reset), 198 ) 199 .route( 200 "/xrpc/com.atproto.server.resetPassword", 201 post(api::server::reset_password), 202 ) 203 .route( 204 "/xrpc/com.atproto.server.requestEmailUpdate", 205 post(api::server::request_email_update), 206 ) 207 .route( 208 "/xrpc/com.atproto.server.confirmEmail", 209 post(api::server::confirm_email), 210 ) 211 .route( 212 "/xrpc/com.atproto.server.updateEmail", 213 post(api::server::update_email), 214 ) 215 .route( 216 "/xrpc/com.atproto.server.reserveSigningKey", 217 post(api::server::reserve_signing_key), 218 ) 219 .route( 220 "/xrpc/com.atproto.identity.updateHandle", 221 post(api::identity::update_handle), 222 ) 223 .route( 224 "/xrpc/com.atproto.identity.requestPlcOperationSignature", 225 post(api::identity::request_plc_operation_signature), 226 ) 227 .route( 228 "/xrpc/com.atproto.identity.signPlcOperation", 229 post(api::identity::sign_plc_operation), 230 ) 231 .route( 232 "/xrpc/com.atproto.identity.submitPlcOperation", 233 post(api::identity::submit_plc_operation), 234 ) 235 .route( 236 "/xrpc/com.atproto.repo.importRepo", 237 post(api::repo::import_repo), 238 ) 239 .route( 240 "/xrpc/com.atproto.admin.deleteAccount", 241 post(api::admin::delete_account), 242 ) 243 .route( 244 "/xrpc/com.atproto.admin.updateAccountEmail", 245 post(api::admin::update_account_email), 246 ) 247 .route( 248 "/xrpc/com.atproto.admin.updateAccountHandle", 249 post(api::admin::update_account_handle), 250 ) 251 .route( 252 "/xrpc/com.atproto.admin.updateAccountPassword", 253 post(api::admin::update_account_password), 254 ) 255 .route( 256 "/xrpc/com.atproto.server.listAppPasswords", 257 get(api::server::list_app_passwords), 258 ) 259 .route( 260 "/xrpc/com.atproto.server.createAppPassword", 261 post(api::server::create_app_password), 262 ) 263 .route( 264 "/xrpc/com.atproto.server.revokeAppPassword", 265 post(api::server::revoke_app_password), 266 ) 267 .route( 268 "/xrpc/com.atproto.server.createInviteCode", 269 post(api::server::create_invite_code), 270 ) 271 .route( 272 "/xrpc/com.atproto.server.createInviteCodes", 273 post(api::server::create_invite_codes), 274 ) 275 .route( 276 "/xrpc/com.atproto.server.getAccountInviteCodes", 277 get(api::server::get_account_invite_codes), 278 ) 279 .route( 280 "/xrpc/com.atproto.admin.getInviteCodes", 281 get(api::admin::get_invite_codes), 282 ) 283 .route( 284 "/xrpc/com.atproto.admin.disableAccountInvites", 285 post(api::admin::disable_account_invites), 286 ) 287 .route( 288 "/xrpc/com.atproto.admin.enableAccountInvites", 289 post(api::admin::enable_account_invites), 290 ) 291 .route( 292 "/xrpc/com.atproto.admin.disableInviteCodes", 293 post(api::admin::disable_invite_codes), 294 ) 295 .route( 296 "/xrpc/com.atproto.admin.getSubjectStatus", 297 get(api::admin::get_subject_status), 298 ) 299 .route( 300 "/xrpc/com.atproto.admin.updateSubjectStatus", 301 post(api::admin::update_subject_status), 302 ) 303 .route( 304 "/xrpc/com.atproto.admin.sendEmail", 305 post(api::admin::send_email), 306 ) 307 .route( 308 "/xrpc/app.bsky.actor.getPreferences", 309 get(api::actor::get_preferences), 310 ) 311 .route( 312 "/xrpc/app.bsky.actor.putPreferences", 313 post(api::actor::put_preferences), 314 ) 315 .route( 316 "/xrpc/app.bsky.actor.getProfile", 317 get(api::actor::get_profile), 318 ) 319 .route( 320 "/xrpc/app.bsky.actor.getProfiles", 321 get(api::actor::get_profiles), 322 ) 323 .route( 324 "/xrpc/app.bsky.feed.getTimeline", 325 get(api::feed::get_timeline), 326 ) 327 .route( 328 "/xrpc/app.bsky.feed.getAuthorFeed", 329 get(api::feed::get_author_feed), 330 ) 331 .route( 332 "/xrpc/app.bsky.feed.getActorLikes", 333 get(api::feed::get_actor_likes), 334 ) 335 .route( 336 "/xrpc/app.bsky.feed.getPostThread", 337 get(api::feed::get_post_thread), 338 ) 339 .route( 340 "/xrpc/app.bsky.feed.getFeed", 341 get(api::feed::get_feed), 342 ) 343 .route( 344 "/xrpc/app.bsky.notification.registerPush", 345 post(api::notification::register_push), 346 ) 347 .route("/.well-known/did.json", get(api::identity::well_known_did)) 348 .route("/u/{handle}/did.json", get(api::identity::user_did_doc)) 349 // OAuth 2.1 endpoints 350 .route( 351 "/.well-known/oauth-protected-resource", 352 get(oauth::endpoints::oauth_protected_resource), 353 ) 354 .route( 355 "/.well-known/oauth-authorization-server", 356 get(oauth::endpoints::oauth_authorization_server), 357 ) 358 .route("/oauth/jwks", get(oauth::endpoints::oauth_jwks)) 359 .route( 360 "/oauth/par", 361 post(oauth::endpoints::pushed_authorization_request), 362 ) 363 .route("/oauth/authorize", get(oauth::endpoints::authorize_get)) 364 .route("/oauth/authorize", post(oauth::endpoints::authorize_post)) 365 .route("/oauth/authorize/select", post(oauth::endpoints::authorize_select)) 366 .route("/oauth/authorize/2fa", get(oauth::endpoints::authorize_2fa_get)) 367 .route("/oauth/authorize/2fa", post(oauth::endpoints::authorize_2fa_post)) 368 .route("/oauth/authorize/deny", post(oauth::endpoints::authorize_deny)) 369 .route("/oauth/token", post(oauth::endpoints::token_endpoint)) 370 .route("/oauth/revoke", post(oauth::endpoints::revoke_token)) 371 .route("/oauth/introspect", post(oauth::endpoints::introspect_token)) 372 .route( 373 "/xrpc/com.atproto.temp.checkSignupQueue", 374 get(api::temp::check_signup_queue), 375 ) 376 .route( 377 "/xrpc/com.bspds.account.getNotificationPrefs", 378 get(api::notification_prefs::get_notification_prefs), 379 ) 380 .route( 381 "/xrpc/com.bspds.account.updateNotificationPrefs", 382 post(api::notification_prefs::update_notification_prefs), 383 ) 384 .route("/xrpc/{*method}", any(api::proxy::proxy_handler)) 385 .with_state(state); 386 387 let frontend_dir = std::env::var("FRONTEND_DIR") 388 .unwrap_or_else(|_| "./frontend/dist".to_string()); 389 390 if std::path::Path::new(&frontend_dir).join("index.html").exists() { 391 let index_path = format!("{}/index.html", frontend_dir); 392 let serve_dir = ServeDir::new(&frontend_dir) 393 .not_found_service(ServeFile::new(index_path)); 394 router.fallback_service(serve_dir) 395 } else { 396 router 397 } 398}