use chrono::{DateTime, Duration, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub const DEFAULT_MAX_JOBS: usize = 100;
pub const DEFAULT_TIMEOUT_MS: u64 = 300_000;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ScheduleType {
At { at: DateTime<Utc> },
Every { interval: Duration },
Cron { expr: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum PayloadType {
Prompt { text: String },
Action {
name: String,
params: Option<HashMap<String, serde_json::Value>>,
},
Event {
name: String,
data: Option<HashMap<String, serde_json::Value>>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum JobState {
Active,
Paused,
Completed,
Failed,
}
impl Default for JobState {
fn default() -> Self {
Self::Active
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobDefinition {
pub id: String,
pub name: String,
pub description: Option<String>,
pub schedule: ScheduleType,
pub payload: PayloadType,
pub state: JobState,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub last_run: Option<DateTime<Utc>>,
pub next_run: Option<DateTime<Utc>>,
pub run_count: u64,
pub max_runs: Option<u64>,
pub room_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct JobUpdate {
pub name: Option<String>,
pub description: Option<Option<String>>,
pub schedule: Option<ScheduleType>,
pub payload: Option<PayloadType>,
pub state: Option<JobState>,
pub max_runs: Option<Option<u64>>,
pub room_id: Option<Option<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CronConfig {
pub enabled: bool,
pub max_jobs: usize,
pub default_timeout_ms: u64,
}
impl Default for CronConfig {
fn default() -> Self {
Self {
enabled: true,
max_jobs: DEFAULT_MAX_JOBS,
default_timeout_ms: DEFAULT_TIMEOUT_MS,
}
}
}