use crate::error::Result;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScheduledJob {
pub job_id: String,
pub name: String,
pub job_type: String,
pub schedule: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_run: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_run: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
pub struct CreateScheduledJobRequest {
#[builder(setter(into))]
pub name: String,
#[builder(setter(into))]
pub job_type: String,
#[builder(setter(into))]
pub schedule: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub params: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobExecution {
pub execution_id: String,
pub job_id: String,
pub start_time: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<String>,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
define_handler!(
pub struct JobSchedulerHandler;
);
impl_crud!(JobSchedulerHandler {
list => ScheduledJob, "/v1/job_scheduler";
get(&str) => ScheduledJob, "/v1/job_scheduler/{}";
delete(&str), "/v1/job_scheduler/{}";
create(CreateScheduledJobRequest) => ScheduledJob, "/v1/job_scheduler";
update(&str, CreateScheduledJobRequest) => ScheduledJob, "/v1/job_scheduler/{}";
});
impl JobSchedulerHandler {
pub async fn trigger(&self, job_id: &str) -> Result<JobExecution> {
self.client
.post(
&format!("/v1/job_scheduler/{}/trigger", job_id),
&Value::Null,
)
.await
}
pub async fn history(&self, job_id: &str) -> Result<Vec<JobExecution>> {
self.client
.get(&format!("/v1/job_scheduler/{}/history", job_id))
.await
}
pub async fn update_all(&self, body: Value) -> Result<Vec<ScheduledJob>> {
self.client.put("/v1/job_scheduler", &body).await
}
}