Reorganizing files

This commit is contained in:
Marco De Araujo 2025-12-23 08:57:20 -04:00
parent 1c4077ffc3
commit 883a0669fe
11 changed files with 105 additions and 45 deletions

1
Cargo.lock generated
View file

@ -1582,6 +1582,7 @@ dependencies = [
"serde_json", "serde_json",
"sys-locale", "sys-locale",
"unic-langid", "unic-langid",
"url",
] ]
[[package]] [[package]]

View file

@ -13,3 +13,4 @@ sys-locale = "0.3.2"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.146" serde_json = "1.0.146"
once_cell = "1.19" once_cell = "1.19"
url = "2.5.7"

40
src/api/client.rs Normal file
View file

@ -0,0 +1,40 @@
use anyhow::Result;
use reqwest::blocking::Client;
use crate::{
api::endpoints::UptimeKumaEndpoints,
data::{self, heartbeat::HeartbeatResponse, status_page::model::StatusPageResponse},
};
pub struct UptimeKumaClient {
client: Client,
}
impl UptimeKumaClient {
pub fn new() -> Self {
Self {
client: Client::new(),
}
}
pub fn fetch_heartbeat(&self, endpoints: &UptimeKumaEndpoints) -> Result<HeartbeatResponse> {
let response = self.client.get(endpoints.heartbeat_url()).send()?;
if response.status().is_success() {
let json_text = response.text()?;
data::heartbeat::parse_response(&json_text)
} else {
return Err(anyhow::anyhow!(response.status()));
}
}
pub fn fetch_status_page(&self, endpoints: &UptimeKumaEndpoints) -> Result<StatusPageResponse> {
let response = self.client.get(endpoints.status_page_url()).send()?;
if response.status().is_success() {
let json_text = response.text()?;
data::status_page::parse_response(&json_text)
} else {
return Err(anyhow::anyhow!(response.status()));
}
}
}

25
src/api/endpoints.rs Normal file
View file

@ -0,0 +1,25 @@
use url::Url;
#[derive(Debug, Clone)]
pub struct UptimeKumaEndpoints {
base_url: Url,
slug: String,
}
impl UptimeKumaEndpoints {
pub fn new(base_url: &str, slug: &str) -> Result<Self, url::ParseError> {
let base_url = Url::parse(base_url.trim_end_matches("/"))?;
Ok(Self {
base_url,
slug: slug.to_string(),
})
}
pub fn heartbeat_url(&self) -> String {
format!("{}api/status-page/heartbeat/{}", self.base_url, self.slug)
}
pub fn status_page_url(&self) -> String {
format!("{}api/status-page/{}", self.base_url, self.slug)
}
}

5
src/api/mod.rs Normal file
View file

@ -0,0 +1,5 @@
pub mod client;
pub mod endpoints;
pub use client::UptimeKumaClient;
pub use endpoints::UptimeKumaEndpoints;

View file

@ -1,20 +1,8 @@
use crate::data::heartbeat; use crate::core::models::{UnifiedData, UnifiedMonitorData};
use crate::data::heartbeat::model::{HeartbeatEntry, HeartbeatResponse, UptimeData}; use crate::data::heartbeat::model::{HeartbeatResponse};
use crate::data::status_page::model::{MonitorInfo, StatusPageResponse}; use crate::data::status_page::model::{StatusPageResponse};
#[derive(Debug, Clone)]
pub struct UnifiedMonitorData {
pub monitor_info: MonitorInfo,
pub heartbeats: Vec<HeartbeatEntry>,
pub uptime_data: Option<UptimeData>,
}
#[derive(Debug, Clone)]
pub struct UnifiedData {
pub status_page_title: String,
pub status_page_description: Option<String>,
pub monitors: Vec<UnifiedMonitorData>,
}
pub fn unify_data(status_page: &StatusPageResponse, heartbeat: &HeartbeatResponse) -> UnifiedData { pub fn unify_data(status_page: &StatusPageResponse, heartbeat: &HeartbeatResponse) -> UnifiedData {
let mut monitors = Vec::new(); let mut monitors = Vec::new();

5
src/core/mod.rs Normal file
View file

@ -0,0 +1,5 @@
pub mod data;
pub mod models;
pub use data::unify_data;
pub use models::{UnifiedData, UnifiedMonitorData};

16
src/core/models.rs Normal file
View file

@ -0,0 +1,16 @@
use crate::data::heartbeat::model::{HeartbeatEntry, HeartbeatResponse, UptimeData};
use crate::data::status_page::model::{MonitorInfo, StatusPageResponse};
#[derive(Debug, Clone)]
pub struct UnifiedMonitorData {
pub monitor_info: MonitorInfo,
pub heartbeats: Vec<HeartbeatEntry>,
pub uptime_data: Option<UptimeData>,
}
#[derive(Debug, Clone)]
pub struct UnifiedData {
pub status_page_title: String,
pub status_page_description: Option<String>,
pub monitors: Vec<UnifiedMonitorData>,
}

View file

@ -1,4 +1,2 @@
pub mod unified;
pub use unified::model::unify_data;
pub mod heartbeat; pub mod heartbeat;
pub mod status_page; pub mod status_page;

View file

@ -1 +0,0 @@
pub mod model;

View file

@ -1,11 +1,13 @@
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use reqwest::blocking::Client;
use std::result::Result::Ok; use std::result::Result::Ok;
mod i18n; mod i18n;
use i18n::init_locales; use i18n::init_locales;
mod api;
use crate::data::unify_data; use crate::core::unify_data;
use api::UptimeKumaClient;
use api::UptimeKumaEndpoints;
mod core;
mod data; mod data;
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
@ -21,33 +23,13 @@ struct Args {
fn main() -> Result<()> { fn main() -> Result<()> {
init_locales()?; init_locales()?;
let args = Args::parse(); let args = Args::parse();
let base_url = args.base_url.trim_end_matches("/");
let heartbeat_url = format!("{}/api/status-page/heartbeat/{}", base_url, args.slug); let client = UptimeKumaClient::new();
let status_page_url = format!("{}/api/status-page/{}", base_url, args.slug); let endpoints = UptimeKumaEndpoints::new(&args.base_url, &args.slug)?;
let client = Client::new(); let heartbeat_data = client.fetch_heartbeat(&endpoints)?;
println!("Heartbeat URL: {}", heartbeat_url); let status_page_data = client.fetch_status_page(&endpoints)?;
let heartbeat_response = client.get(heartbeat_url).send()?;
let heartbeat_data = if heartbeat_response.status().is_success() {
let json_text = heartbeat_response.text()?;
data::heartbeat::parse_response(&json_text)?
} else {
return Err(anyhow::anyhow!(heartbeat_response.status()));
};
println!("Status Page URL: {}", status_page_url);
let status_page_response = client.get(status_page_url).send()?;
let status_page_data = if status_page_response.status().is_success() {
let json_text = status_page_response.text()?;
data::status_page::parse_response(&json_text)?
} else {
return Err(anyhow::anyhow!(status_page_response.status()));
};
let unified_data = unify_data(&status_page_data, &heartbeat_data); let unified_data = unify_data(&status_page_data, &heartbeat_data);