aboutsummaryrefslogtreecommitdiff
path: root/src/api.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-09-01 21:47:18 +0200
committermetamuffin <metamuffin@disroot.org>2024-09-01 21:47:18 +0200
commit243a9eabe185661fa7c35fec59482c215fc8dc4f (patch)
tree379f48f070a5c0961df82b628b2be7203bbee2c4 /src/api.rs
parent4c9c8de0c9f1f03f44ae60c088f506c1e4a51d26 (diff)
downloadstatuspage-243a9eabe185661fa7c35fec59482c215fc8dc4f.tar
statuspage-243a9eabe185661fa7c35fec59482c215fc8dc4f.tar.bz2
statuspage-243a9eabe185661fa7c35fec59482c215fc8dc4f.tar.zst
add simple api
Diffstat (limited to 'src/api.rs')
-rw-r--r--src/api.rs70
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()
+ })
+ }
+}