Add json api

This commit is contained in:
2024-01-31 22:14:50 +01:00
parent cff7dddf4e
commit e9ac30898b
5 changed files with 69 additions and 3 deletions

30
Cargo.lock generated
View File

@ -1402,6 +1402,12 @@ dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "paste"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]]
name = "pear"
version = "0.2.8"
@ -1739,6 +1745,28 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "rmp"
version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20"
dependencies = [
"byteorder",
"num-traits",
"paste",
]
[[package]]
name = "rmp-serde"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a"
dependencies = [
"byteorder",
"rmp",
"serde",
]
[[package]]
name = "rocket"
version = "0.5.0"
@ -1762,9 +1790,11 @@ dependencies = [
"pin-project-lite",
"rand",
"ref-cast",
"rmp-serde",
"rocket_codegen",
"rocket_http",
"serde",
"serde_json",
"state",
"tempfile",
"time",

View File

@ -19,7 +19,7 @@ duplicate = "0.2"
handlebars = "3"
http = "0.2"
ron = "0.6.4"
rocket = { version = "0.5", features = ["secrets"] }
rocket = { version = "0.5", features = ["secrets", "msgpack", "json"] }
rocket_dyn_templates = { version = "0.1.0", features = ["handlebars"] }
tokio = { version = "1", features = ["fs"] }
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls"] }

View File

@ -7,7 +7,7 @@ use std::collections::HashMap;
pub type ServiceId = String;
#[derive(Debug, Copy, Clone)]
#[derive(Debug, Copy, Clone, Serialize)]
pub enum HealthStatus {
/// The service is up and running
Up,

View File

@ -36,7 +36,10 @@ async fn main() -> eyre::Result<()> {
.attach(Template::fairing())
.manage(Arc::clone(&state))
.mount("/static", FileServer::from("static"))
.mount("/", rocket::routes![routes::pages::dashboard]);
.mount(
"/",
rocket::routes![routes::pages::dashboard, routes::api::status],
);
start_poller(state);

View File

@ -0,0 +1,33 @@
use crate::health::HealthState;
use crate::health::HealthStatus;
use chrono::DateTime;
use chrono::Utc;
use rocket::serde::json::Json;
use rocket::{get, State};
use serde::Serialize;
use std::collections::BTreeMap;
use std::sync::Arc;
#[derive(Serialize)]
pub struct Status {
last_update: Option<DateTime<Utc>>,
services: BTreeMap<String, HealthStatus>,
}
#[get("/status")]
pub async fn status(state: &State<Arc<HealthState>>) -> Json<Status> {
let last_update = *state.last_update.lock().await;
let mut services = BTreeMap::new();
for (id, status) in &state.health {
let Some(status) = *status.lock().await else {
continue;
};
services.insert(id.clone(), status);
}
Json(Status {
last_update,
services,
})
}