use axum::{ extract::{Path, State}, Json, }; use serde_json::{json, Value}; use crate::{ app::AppState, error::{AppError, AppResult}, services::event as event_svc, }; pub async fn get_events(State(state): State) -> AppResult> { let events = event_svc::get_all_with_status(&state.pool, &state.event_defs).await?; let active_count = events.iter().filter(|e| e.is_active).count(); Ok(Json(json!({ "events": events, "total": events.len(), "active_count": active_count, }))) } pub async fn get_event( State(state): State, Path(event_id): Path, ) -> AppResult> { let def = state .event_defs .iter() .find(|d| d.id == event_id) .ok_or_else(|| AppError::NotFound(format!("event '{event_id}' not found")))?; let is_active = event_svc::is_event_active(&state.pool, def).await?; Ok(Json(json!({ "event": def, "is_active": is_active, }))) } pub async fn post_activate_event( State(state): State, Path(event_id): Path, ) -> AppResult> { event_svc::activate_event(&state.pool, &event_id, &state.event_defs).await?; Ok(Json(json!({ "activated": event_id, "is_active": true }))) } pub async fn post_deactivate_event( State(state): State, Path(event_id): Path, ) -> AppResult> { event_svc::deactivate_event(&state.pool, &event_id, &state.event_defs).await?; Ok(Json(json!({ "deactivated": event_id, "is_active": false }))) }