Skip to main content

webdav_server/api/
route.rs

1use axum::{
2    Json, Router,
3    extract::Request,
4    middleware,
5    routing::{get, post},
6};
7use serde_json::{Value, json};
8
9use crate::{
10    api::{
11        self,
12        assets::{self, list},
13        middleware::{auth_guard, log_middleware},
14    },
15    app::State as AppState,
16    info,
17    logger::{Module, logging_enabled},
18};
19
20/// ## Main router
21/// Rouutes `/` and all the underlying routes nested
22/// within the server. \
23/// To be used when starting server.
24pub fn route_main(state: AppState) -> Router {
25    let routes = Router::new()
26        .route("/health", get(health))
27        .nest("/api/auth", auth_route())
28        .nest("/api/v1", protected_routes(&state))
29        .with_state(state);
30
31    if logging_enabled() {
32        return routes.layer(middleware::from_fn(log_middleware));
33    }
34
35    routes
36}
37
38/// ## Authentication endpoints
39fn auth_route() -> Router<AppState> {
40    Router::new()
41        .route("/register", post(api::auth::register))
42        .route("/login", post(api::auth::login))
43}
44
45/// ## Protected Routes
46/// Endpoints that require client to hold a token, for
47/// their requests to be handled. \
48/// All the endpoints listed here, fall behind the
49/// [`crate::api::middleware::auth_guard`]
50fn protected_routes(state: &AppState) -> Router<AppState> {
51    Router::new()
52        .route("/upload/{tag}", post(assets::upload))
53        .route("/assets/{hash}", get(assets::get).delete(assets::delete))
54        .route("/storage", get(storage))
55        .route("/assets", get(list))
56        .route_layer(middleware::from_fn_with_state(state.clone(), auth_guard))
57}
58
59async fn health() -> Json<Value> {
60    info!(Module::Api, "get_health");
61    Json(json!({
62        "health" : "ok"
63    }))
64}
65
66async fn storage(_: Request) -> Json<Value> {
67    Json(json!({
68        "root" : "/storage",
69        "exists" : true,
70    }))
71}