1use std::time::{Duration, SystemTime};
4
5use serde::{Deserialize, Serialize};
6use uuid::Uuid;
7
8use crate::{
9 common::{Label, LabelFilter, TimeRange},
10 jobs::{JobDefinition, JobTypeId},
11};
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
15#[repr(transparent)]
16pub struct ScheduleId(pub Uuid);
17
18impl std::fmt::Display for ScheduleId {
19 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20 write!(f, "{}", self.0)
21 }
22}
23
24impl From<Uuid> for ScheduleId {
25 fn from(value: Uuid) -> Self {
26 Self(value)
27 }
28}
29
30impl From<ScheduleId> for Uuid {
31 fn from(value: ScheduleId) -> Self {
32 value.0
33 }
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ScheduleDefinition {
39 pub scheduling: SchedulingPolicy,
41 pub job_template: JobDefinition,
43 pub labels: Vec<Label>,
45 pub time_range: TimeRange,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
51pub enum SchedulingPolicy {
52 FixedInterval {
54 interval: Duration,
56 immediate: bool,
59 missed: MissedTimePolicy,
61 },
62 Cron {
64 expression: String,
66 immediate: bool,
69 missed: MissedTimePolicy,
71 },
72}
73
74#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
76pub enum MissedTimePolicy {
77 Skip,
79 Create,
81}
82
83pub struct ScheduleDetails {
85 pub id: ScheduleId,
87 pub schedule: ScheduleDefinition,
89 pub created_at: SystemTime,
91 pub status: ScheduleStatus,
93 pub stopped_at: Option<SystemTime>,
95}
96
97#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
99pub enum ScheduleStatus {
100 Active,
102 Stopped,
104}
105
106#[derive(Debug, Default, Clone, Serialize, Deserialize)]
108pub struct ScheduleFilters {
109 pub schedule_ids: Option<Vec<ScheduleId>>,
111 pub job_type_ids: Option<Vec<JobTypeId>>,
113 pub statuses: Option<Vec<ScheduleStatus>>,
115 pub created_at: Option<TimeRange>,
118 pub labels: Option<Vec<LabelFilter>>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
124pub enum ScheduleOrderBy {
125 CreatedAtAsc,
127 CreatedAtDesc,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct StoppedSchedule {
134 pub schedule_id: ScheduleId,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct PendingSchedule {
141 pub schedule_id: ScheduleId,
143 pub last_target_execution_time: Option<SystemTime>,
146 pub scheduling: SchedulingPolicy,
148 pub time_range: TimeRange,
150 pub job_template: JobDefinition,
152}