torrust_index_backend/web/api/v1/
routes.rs

1//! Route initialization for the v1 API.
2use std::env;
3use std::sync::Arc;
4
5use axum::routing::get;
6use axum::Router;
7use tower_http::cors::CorsLayer;
8
9use super::contexts::about::handlers::about_page_handler;
10use super::contexts::{about, category, proxy, settings, tag, torrent, user};
11use crate::bootstrap::config::ENV_VAR_CORS_PERMISSIVE;
12use crate::common::AppData;
13
14pub const API_VERSION_URL_PREFIX: &str = "v1";
15
16/// Add all API routes to the router.
17#[allow(clippy::needless_pass_by_value)]
18pub fn router(app_data: Arc<AppData>) -> Router {
19    // code-review: should we use plural for the resource prefix: `users`, `categories`, `tags`?
20    // See: https://stackoverflow.com/questions/6845772/should-i-use-singular-or-plural-name-convention-for-rest-resources
21
22    let v1_api_routes = Router::new()
23        .route("/", get(about_page_handler).with_state(app_data.clone()))
24        .nest("/user", user::routes::router(app_data.clone()))
25        .nest("/about", about::routes::router(app_data.clone()))
26        .nest("/category", category::routes::router(app_data.clone()))
27        .nest("/tag", tag::routes::router_for_single_resources(app_data.clone()))
28        .nest("/tags", tag::routes::router_for_multiple_resources(app_data.clone()))
29        .nest("/settings", settings::routes::router(app_data.clone()))
30        .nest("/torrent", torrent::routes::router_for_single_resources(app_data.clone()))
31        .nest("/torrents", torrent::routes::router_for_multiple_resources(app_data.clone()))
32        .nest("/proxy", proxy::routes::router(app_data.clone()));
33
34    let router = Router::new()
35        .route("/", get(about_page_handler).with_state(app_data))
36        .nest(&format!("/{API_VERSION_URL_PREFIX}"), v1_api_routes);
37
38    if env::var(ENV_VAR_CORS_PERMISSIVE).is_ok() {
39        router.layer(CorsLayer::permissive())
40    } else {
41        router
42    }
43}