diff options
author | metamuffin <metamuffin@disroot.org> | 2024-09-01 21:47:18 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-09-01 21:47:18 +0200 |
commit | 243a9eabe185661fa7c35fec59482c215fc8dc4f (patch) | |
tree | 379f48f070a5c0961df82b628b2be7203bbee2c4 /src/api.rs | |
parent | 4c9c8de0c9f1f03f44ae60c088f506c1e4a51d26 (diff) | |
download | statuspage-243a9eabe185661fa7c35fec59482c215fc8dc4f.tar statuspage-243a9eabe185661fa7c35fec59482c215fc8dc4f.tar.bz2 statuspage-243a9eabe185661fa7c35fec59482c215fc8dc4f.tar.zst |
add simple api
Diffstat (limited to 'src/api.rs')
-rw-r--r-- | src/api.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/api.rs b/src/api.rs new file mode 100644 index 0000000..56ee6f0 --- /dev/null +++ b/src/api.rs @@ -0,0 +1,70 @@ +use crate::{Config, Status, STATUS}; +use serde_json::{json, Value}; +use std::{ops::Deref, sync::Arc}; + +pub async fn make_json_response(config: Arc<Config>) -> Value { + let status = STATUS.read().await; + let status = status.deref(); + let total_err = status + .values() + .map(|s| s.status.is_err() as usize) + .sum::<usize>(); + let total_ok = status + .values() + .map(|s| s.status.is_ok() as usize) + .sum::<usize>(); + + let mut titles_failed = Vec::new(); + let services = config + .services + .iter() + .enumerate() + .map(|(i, s)| { + let total_err = status + .range((i, usize::MIN)..(i, usize::MAX)) + .map(|(_, s)| s.status.is_err() as usize) + .sum::<usize>(); + let total_ok = status + .range((i, usize::MIN)..(i, usize::MAX)) + .map(|(_, s)| s.status.is_ok() as usize) + .sum::<usize>(); + if total_err != 0 { + titles_failed.push(&s.title) + } + json!({ + "status": if total_err == 0 { + "ok" + } else if total_ok == 0 { + "failed" + } else { + "degraded" + }, + "title": &s.title, + }) + }) + .collect::<Vec<_>>(); + + json!({ + "status": if total_err == 0 { + "ok" + } else if total_ok == 0 { + "failed" + } else { + "degraded" + }, + "total_ok": total_ok, + "total_err": total_err, + "services": services, + "failed": titles_failed + }) +} + +impl Status { + pub fn json(&self) -> Value { + json!({ + "ok": self.status.is_ok(), + "message": match &self.status { Ok(m) => m, Err(m) => m }, + "time": self.time.timestamp() + }) + } +} |