use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::principal::PrincipalSummary;
use crate::typed_id::{PrincipalId, ScheduleId, SessionId};
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
pub const MAX_ACTIVE_SCHEDULES_PER_SESSION: u32 = 5;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "lowercase")]
pub enum ScheduleType {
OneShot,
Recurring,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct SessionSchedule {
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "sched_01933b5a00007000800000000000001"))]
pub id: ScheduleId,
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "session_01933b5a00007000800000000000001"))]
pub session_id: SessionId,
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "principal_01933b5a000070008000000000000001"))]
pub owner_principal_id: PrincipalId,
#[serde(skip_serializing_if = "Option::is_none")]
pub resolved_owner_user_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner: Option<PrincipalSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_owner: Option<PrincipalSummary>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub cron_expression: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scheduled_at: Option<DateTime<Utc>>,
pub timezone: String,
pub enabled: bool,
pub schedule_type: ScheduleType,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_trigger_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_triggered_at: Option<DateTime<Utc>>,
pub trigger_count: u32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
impl SessionSchedule {
pub fn derive_type(cron_expression: &Option<String>) -> ScheduleType {
if cron_expression.is_some() {
ScheduleType::Recurring
} else {
ScheduleType::OneShot
}
}
}