use std::time::{Duration, SystemTime};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::{
common::{Label, LabelFilter, TimeRange},
jobs::{JobDefinition, JobTypeId},
};
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[repr(transparent)]
pub struct ScheduleId(pub Uuid);
impl std::fmt::Display for ScheduleId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl From<Uuid> for ScheduleId {
fn from(value: Uuid) -> Self {
Self(value)
}
}
impl From<ScheduleId> for Uuid {
fn from(value: ScheduleId) -> Self {
value.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScheduleDefinition {
pub scheduling: SchedulingPolicy,
pub job_template: JobDefinition,
pub labels: Vec<Label>,
pub time_range: TimeRange,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SchedulingPolicy {
FixedInterval {
interval: Duration,
immediate: bool,
missed: MissedTimePolicy,
},
Cron {
expression: String,
immediate: bool,
missed: MissedTimePolicy,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MissedTimePolicy {
Skip,
Create,
}
pub struct ScheduleDetails {
pub id: ScheduleId,
pub schedule: ScheduleDefinition,
pub created_at: SystemTime,
pub status: ScheduleStatus,
pub stopped_at: Option<SystemTime>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ScheduleStatus {
Active,
Stopped,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ScheduleFilters {
pub schedule_ids: Option<Vec<ScheduleId>>,
pub job_type_ids: Option<Vec<JobTypeId>>,
pub statuses: Option<Vec<ScheduleStatus>>,
pub created_at: Option<TimeRange>,
pub labels: Option<Vec<LabelFilter>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ScheduleOrderBy {
CreatedAtAsc,
CreatedAtDesc,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StoppedSchedule {
pub schedule_id: ScheduleId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PendingSchedule {
pub schedule_id: ScheduleId,
pub last_target_execution_time: Option<SystemTime>,
pub scheduling: SchedulingPolicy,
pub time_range: TimeRange,
pub job_template: JobDefinition,
}
pub enum AddedSchedules {
Added(Vec<ScheduleId>),
Existing(Vec<ScheduleId>),
}
impl AddedSchedules {
#[must_use]
pub fn schedule_ids(&self) -> &[ScheduleId] {
match self {
AddedSchedules::Added(ids) | AddedSchedules::Existing(ids) => ids,
}
}
}