use std::collections::HashMap;
use chrono::{DateTime, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use ironflow_store::entities::{HistoryGranularity, HistoryPeriod, StatsHistoryBucket};
use ironflow_store::models::RunStatus;
use super::run::parse_label_param;
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct StatsResponse {
pub total_runs: u64,
pub completed_runs: u64,
pub failed_runs: u64,
pub cancelled_runs: u64,
pub active_runs: u64,
pub awaiting_approval_runs: u64,
pub success_rate_percent: f64,
pub total_cost_usd: Decimal,
pub total_duration_ms: u64,
}
#[cfg_attr(feature = "openapi", derive(utoipa::IntoParams))]
#[derive(Debug, Deserialize)]
pub struct StatsHistoryQuery {
pub workflow: Option<String>,
pub period: Option<HistoryPeriod>,
pub granularity: Option<HistoryGranularity>,
pub status: Option<RunStatus>,
pub has_steps: Option<bool>,
pub label: Option<String>,
pub created_by: Option<Uuid>,
}
impl StatsHistoryQuery {
pub fn parse_labels(&self) -> Option<HashMap<String, String>> {
parse_label_param(&self.label)
}
}
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct StatsHistoryResponse {
pub period: HistoryPeriod,
pub granularity: HistoryGranularity,
pub workflow: Option<String>,
pub buckets: Vec<StatsHistoryBucketResponse>,
}
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct StatsHistoryBucketResponse {
pub time: DateTime<Utc>,
pub completed: u64,
pub warning: u64,
pub failed: u64,
pub cancelled: u64,
pub pending: u64,
pub running: u64,
pub retrying: u64,
pub awaiting_approval: u64,
pub sleeping: u64,
pub success_rate_percent: Option<f64>,
pub avg_duration_ms: u64,
pub p95_duration_ms: u64,
pub total_cost_usd: Decimal,
}
impl From<StatsHistoryBucket> for StatsHistoryBucketResponse {
fn from(b: StatsHistoryBucket) -> Self {
let success_rate_percent = b.success_rate_percent();
StatsHistoryBucketResponse {
time: b.time,
completed: b.completed,
warning: b.warning,
failed: b.failed,
cancelled: b.cancelled,
pending: b.pending,
running: b.running,
retrying: b.retrying,
awaiting_approval: b.awaiting_approval,
sleeping: b.sleeping,
success_rate_percent,
avg_duration_ms: b.avg_duration_ms,
p95_duration_ms: b.p95_duration_ms,
total_cost_usd: b.total_cost_usd,
}
}
}