use crate::{ admin::{AllowedDomains, BlockedDomains, ConnectedActors, Domains, LastSeen}, collector::{MemoryCollector, Snapshot}, error::Error, extractors::Admin, }; use actix_web::{ web::{Data, Json}, HttpResponse, }; use std::collections::{BTreeMap, BTreeSet}; use time::OffsetDateTime; pub(crate) async fn allow( admin: Admin, Json(Domains { domains }): Json, ) -> Result { admin.db_ref().add_allows(domains).await?; Ok(HttpResponse::NoContent().finish()) } pub(crate) async fn disallow( admin: Admin, Json(Domains { domains }): Json, ) -> Result { admin.db_ref().remove_allows(domains).await?; Ok(HttpResponse::NoContent().finish()) } pub(crate) async fn block( admin: Admin, Json(Domains { domains }): Json, ) -> Result { admin.db_ref().add_blocks(domains).await?; Ok(HttpResponse::NoContent().finish()) } pub(crate) async fn unblock( admin: Admin, Json(Domains { domains }): Json, ) -> Result { admin.db_ref().remove_blocks(domains).await?; Ok(HttpResponse::NoContent().finish()) } pub(crate) async fn allowed(admin: Admin) -> Result, Error> { let allowed_domains = admin.db_ref().allows().await?; Ok(Json(AllowedDomains { allowed_domains })) } pub(crate) async fn blocked(admin: Admin) -> Result, Error> { let blocked_domains = admin.db_ref().blocks().await?; Ok(Json(BlockedDomains { blocked_domains })) } pub(crate) async fn connected(admin: Admin) -> Result, Error> { let connected_actors = admin.db_ref().connected_ids().await?; Ok(Json(ConnectedActors { connected_actors })) } pub(crate) async fn stats( _admin: Admin, collector: Data, ) -> Result, Error> { Ok(Json(collector.snapshot())) } pub(crate) async fn last_seen(admin: Admin) -> Result, Error> { let nodes = admin.db_ref().last_seen().await?; let mut last_seen: BTreeMap> = BTreeMap::new(); let mut never = Vec::new(); for (domain, datetime) in nodes { if let Some(datetime) = datetime { last_seen.entry(datetime).or_default().insert(domain); } else { never.push(domain); } } Ok(Json(LastSeen { last_seen, never })) }