/ src / api / v1.rs
v1.rs
 1  mod delegates;
 2  mod node;
 3  mod repos;
 4  mod stats;
 5  
 6  use axum::extract::State;
 7  use axum::response::{IntoResponse, Json};
 8  use axum::routing::get;
 9  use axum::Router;
10  use serde_json::json;
11  
12  use crate::api::{Context, API_VERSION, RADICLE_VERSION};
13  
14  pub fn router(ctx: Context) -> Router {
15      let root_router = Router::new()
16          .route("/", get(root_handler))
17          .with_state(ctx.clone());
18  
19      let routes = Router::new()
20          .merge(root_router)
21          .merge(node::router(ctx.clone()))
22          .merge(delegates::router(ctx.clone()))
23          .merge(repos::router(ctx.clone()))
24          .merge(stats::router(ctx));
25  
26      Router::new().nest("/v1", routes)
27  }
28  
29  async fn root_handler(State(ctx): State<Context>) -> impl IntoResponse {
30      let response = json!({
31          "message": "Welcome!",
32          "service": "radicle-httpd",
33          "version": format!("{}-{}", RADICLE_VERSION, env!("GIT_HEAD")),
34          "apiVersion": API_VERSION,
35          "nid": ctx.profile.public_key,
36          "path": "/api/v1",
37          "links": [
38              {
39                  "href": "/repos",
40                  "rel": "repos",
41                  "type": "GET"
42              },
43              {
44                  "href": "/repos/:rid",
45                  "rel": "repo",
46                  "type": "GET"
47              },
48              {
49                  "href": "/node",
50                  "rel": "node",
51                  "type": "GET"
52              },
53              {
54                  "href": "/nodes/:nid",
55                  "rel": "node",
56                  "type": "GET"
57              },
58              {
59                  "href": "/delegates/:did/repos",
60                  "rel": "repos",
61                  "type": "GET"
62              },
63              {
64                  "href": "/stats",
65                  "rel": "stats",
66                  "type": "GET"
67              }
68          ]
69      });
70  
71      Json(response)
72  }