Skip to main content

agent_office/services/schedule/
mod.rs

1use crate::services::schedule::domain::Schedule;
2use async_trait::async_trait;
3use chrono::{DateTime, Utc};
4use thiserror::Error;
5use uuid::Uuid;
6
7pub mod domain;
8pub mod service_impl;
9
10pub use service_impl::ScheduleServiceImpl;
11
12#[derive(Error, Debug)]
13pub enum ScheduleError {
14    #[error("Schedule not found: {0}")]
15    ScheduleNotFound(Uuid),
16
17    #[error("Invalid cron expression: {0}")]
18    InvalidCronExpression(String),
19
20    #[error("Storage error: {0}")]
21    Storage(String),
22}
23
24pub type Result<T> = std::result::Result<T, ScheduleError>;
25
26#[async_trait]
27pub trait ScheduleService: Send + Sync {
28    /// Create a new schedule
29    async fn create_schedule(
30        &self,
31        agent_id: String,
32        cron_expression: String,
33        action: String,
34    ) -> Result<Schedule>;
35
36    /// Get a schedule by ID
37    async fn get_schedule(&self, id: Uuid) -> Result<Schedule>;
38
39    /// List all schedules for an agent
40    async fn list_schedules_by_agent(&self, agent_id: &str) -> Result<Vec<Schedule>>;
41
42    /// Update a schedule
43    async fn update_schedule(
44        &self,
45        id: Uuid,
46        cron_expression: Option<String>,
47        action: Option<String>,
48    ) -> Result<Schedule>;
49
50    /// Delete a schedule
51    async fn delete_schedule(&self, id: Uuid) -> Result<()>;
52
53    /// Toggle schedule on/off
54    async fn toggle_schedule(&self, id: Uuid) -> Result<Schedule>;
55
56    /// Check schedules for an agent and return fired actions
57    /// This checks if any active schedule should fire for the current time
58    /// and updates last_fired_at to prevent duplicate firing
59    async fn check_and_fire_schedules(
60        &self,
61        agent_id: &str,
62        current_time: DateTime<Utc>,
63    ) -> Result<Vec<String>>;
64
65    /// Get next predicted run time for a schedule
66    fn get_next_run(&self, schedule: &Schedule, current_time: DateTime<Utc>) -> Option<DateTime<Utc>>;
67}