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 }