pipedash-web 0.1.1

REST API server for Pipedash
use axum::{
    extract::State,
    routing::post,
    Json,
    Router,
};
use serde::Serialize;

use crate::error::{
    ApiResult,
    AppError,
};
use crate::state::AppState;

#[derive(Debug, Serialize)]
pub struct FactoryResetResponse {
    pub providers_removed: i64,
    pub caches_cleared: bool,
    pub tokens_cleared: bool,
    pub metrics_cleared: bool,
}

pub fn router() -> Router<AppState> {
    Router::new().route("/factory-reset", post(factory_reset))
}

async fn factory_reset(State(state): State<AppState>) -> ApiResult<Json<FactoryResetResponse>> {
    let inner = state.inner.read().await;
    let core = inner.core.as_ref().ok_or_else(AppError::not_initialized)?;
    let providers = core.provider_service.list_providers().await?;
    let providers_count = providers.len() as i64;

    for provider in providers {
        core.provider_service.remove_provider(provider.id).await?;
    }

    if let Some(metrics_service) = &core.metrics_service {
        metrics_service.flush_metrics(None, true).await?;
    }

    Ok(Json(FactoryResetResponse {
        providers_removed: providers_count,
        caches_cleared: true,
        tokens_cleared: true,
        metrics_cleared: core.metrics_service.is_some(),
    }))
}