summaryrefslogtreecommitdiffstats
path: root/src/api
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2024-09-28 00:54:46 -0500
committerToby Vincent <tobyv@tobyvin.dev>2024-09-28 00:58:45 -0500
commitcd774827dd14f68d8405c45d2d9da30b3fab050e (patch)
treea24e1cabb99170caa25edff53fc978111a1c9dd4 /src/api
parent04c7f7609e5bc3fadf95c53b37a9e6e12c4e539c (diff)
feat: refactor into pub-sub and impl SSE
Diffstat (limited to 'src/api')
-rw-r--r--src/api/services.rs33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/api/services.rs b/src/api/services.rs
index 63018f1..132ecb1 100644
--- a/src/api/services.rs
+++ b/src/api/services.rs
@@ -7,7 +7,7 @@ use axum::{
use axum_extra::routing::Resource;
use serde::{Deserialize, Serialize};
-use crate::{service::Services, Error, Status};
+use crate::{service::ServiceHandles, Error, Status};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ServiceQuery {
@@ -15,26 +15,35 @@ pub struct ServiceQuery {
pub state: Option<Status>,
}
-pub fn router() -> Router<Services> {
+pub fn router() -> Router<ServiceHandles> {
Resource::named("services").index(index).show(show).into()
}
pub async fn index(
Query(query): Query<ServiceQuery>,
- State(services): State<Services>,
-) -> Result<Json<HashMap<String, Status>>, Error> {
- services
- .check_filtered(|name| (!query.name.as_ref().is_some_and(|s| s != name)))
- .await
- .map(Json)
+ State(services): State<ServiceHandles>,
+) -> Json<HashMap<String, Status>> {
+ let map = match query.name {
+ Some(n) => services
+ .iter()
+ .filter(|(name, _)| n == **name)
+ .map(|(name, srv)| (name.clone(), srv.status()))
+ .collect(),
+ None => services
+ .iter()
+ .map(|(name, srv)| (name.clone(), srv.status()))
+ .collect(),
+ };
+
+ Json(map)
}
pub async fn show(
Path(name): Path<String>,
- State(services): State<Services>,
+ State(services): State<ServiceHandles>,
) -> Result<Status, Error> {
services
- .check_one(&name)
- .await
- .ok_or_else(|| Error::ServiceNotFound(name))?
+ .get(&name)
+ .map(|s| s.status())
+ .ok_or_else(|| Error::ServiceNotFound(name))
}