pipedash-web 0.1.1

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

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

#[derive(Debug, Serialize)]
pub struct RefreshModeResponse {
    pub mode: String,
}

#[derive(Debug, Deserialize)]
pub struct SetRefreshModeRequest {
    pub mode: String,
}

pub fn router() -> Router<AppState> {
    Router::new()
        .route("/mode", get(get_refresh_mode).put(set_refresh_mode))
        .route("/all", post(refresh_all))
}

async fn get_refresh_mode(State(state): State<AppState>) -> ApiResult<Json<RefreshModeResponse>> {
    let inner = state.inner.read().await;
    let core = inner.core.as_ref().ok_or_else(AppError::not_initialized)?;
    let mode = core.refresh_manager.get_mode().await;
    Ok(Json(RefreshModeResponse {
        mode: mode.as_str().to_string(),
    }))
}

async fn set_refresh_mode(
    State(state): State<AppState>, Json(req): Json<SetRefreshModeRequest>,
) -> ApiResult<()> {
    let inner = state.inner.read().await;
    let core = inner.core.as_ref().ok_or_else(AppError::not_initialized)?;
    let refresh_mode = req.mode.parse::<RefreshMode>().unwrap_or(RefreshMode::Idle);
    core.refresh_manager.set_mode(refresh_mode).await;
    Ok(())
}

async fn refresh_all(State(state): State<AppState>) -> ApiResult<()> {
    let inner = state.inner.read().await;
    let core = inner.core.as_ref().ok_or_else(AppError::not_initialized)?;
    core.pipeline_service.clear_all_run_history_caches().await;
    core.pipeline_service.refresh_all().await?;
    Ok(())
}