use serde::Deserialize;
use tera::Context;
use crate::cron::cron_scheduler::CronScheduler;
use crate::services::http_response::DashboardResponse;
use crate::services::template_service::render_template;
#[derive(Deserialize)]
pub struct CronActionRequest {
pub action: String,
pub job_id: String,
pub enabled: Option<bool>,
}
#[derive(Deserialize)]
pub struct CreateCronJobRequest {
pub name: String,
pub queue: String,
pub cron_expression: String,
pub job_type: String,
pub payload: serde_json::Value,
}
pub async fn render_cron_jobs() -> DashboardResponse {
match CronScheduler::list_cron_jobs().await {
Ok(cron_jobs) => {
let mut ctx = Context::new();
ctx.insert("title", "Cron Jobs");
ctx.insert("cron_jobs", &cron_jobs);
render_template("cron_jobs.html.tera", ctx).await
}
Err(e) => {
tracing::error!("Failed to fetch cron jobs: {:?}", e);
DashboardResponse::text(500, "Failed to fetch cron jobs")
}
}
}
pub async fn cron_action(payload: CronActionRequest) -> DashboardResponse {
let action = &payload.action;
let job_id = &payload.job_id;
let result = match action.as_str() {
"toggle" => {
let enabled = payload.enabled.unwrap_or(true);
CronScheduler::toggle_cron_job(job_id, enabled).await
}
"delete" => {
CronScheduler::delete_cron_job(job_id).await
}
"run_now" => {
match CronScheduler::run_now(job_id).await {
Ok(enqueued_id) => {
return DashboardResponse::json(&serde_json::json!({
"status": "success",
"action": "run_now",
"enqueued_job_id": enqueued_id
}));
}
Err(e) => Err(e)
}
}
_ => {
return DashboardResponse::json_status(400, &serde_json::json!({
"error": "Invalid action"
}));
}
};
match result {
Ok(_) => DashboardResponse::json(&serde_json::json!({
"status": "success",
"action": action
})),
Err(e) => DashboardResponse::json_status(500, &serde_json::json!({
"error": e.to_string()
}))
}
}
pub async fn create_cron_job(_payload: CreateCronJobRequest) -> DashboardResponse {
DashboardResponse::json(&serde_json::json!({
"status": "Cron job creation endpoint - implement based on your job types"
}))
}