webdav_server/api/
route.rs1use 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
20pub 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
38fn auth_route() -> Router<AppState> {
40 Router::new()
41 .route("/register", post(api::auth::register))
42 .route("/login", post(api::auth::login))
43}
44
45fn 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}