use std::sync::Arc;
use axum::{extract::State, http::StatusCode, response::IntoResponse};
use tracing::{error, info};
use crate::http_server::state::ServerState;
pub async fn handle_reload(State(state): State<Arc<ServerState>>) -> impl IntoResponse {
match state.reload_tx.send(()).await {
Ok(()) => {
info!("reload triggered via HTTP");
(StatusCode::OK, "Reload triggered\n")
}
Err(_) => {
error!("failed to send reload signal");
(
StatusCode::INTERNAL_SERVER_ERROR,
"Failed to trigger reload\n",
)
}
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use axum::{extract::State, http::StatusCode, response::IntoResponse};
use jiff::Timestamp;
use tokio::sync::mpsc;
use super::*;
use crate::{alert::InternalContext, http_server::state::ServerState, scheduler::Scheduler};
#[tokio::test]
async fn test_reload_endpoint() {
let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set for tests");
let pool = bestool_postgres::pool::create_pool(&db_url, "bestool-alertd-test")
.await
.unwrap();
let ctx = Arc::new(InternalContext {
pg_pool: pool,
http_client: reqwest::Client::new(),
canopy_client: None,
});
let scheduler = Arc::new(Scheduler::new(vec![], ctx.clone(), None, true, None));
let (reload_tx, mut reload_rx) = mpsc::channel::<()>(10);
let state = Arc::new(ServerState {
reload_tx,
started_at: Timestamp::now(),
pid: std::process::id(),
event_manager: None,
internal_context: ctx,
email_config: None,
dry_run: true,
scheduler,
watchdog_timeout: None,
task_endpoints: Arc::new(std::collections::HashMap::new()),
});
let response = handle_reload(State(state)).await.into_response();
assert_eq!(response.status(), StatusCode::OK);
assert!(reload_rx.try_recv().is_ok());
}
}