use chrono::Utc; use domain::events::DomainEvent; use domain::models::GeneratedSchedule; use domain::value_objects::ChannelId; use domain::DomainResult; use super::commands::GenerateScheduleCommand; use super::deps::ScheduleDeps; /// Generate a new 7-day schedule for a channel. /// /// Delegates the heavy lifting to `ScheduleEngineService::generate_schedule`, /// then publishes a `ScheduleGenerated` domain event. pub async fn execute( deps: &ScheduleDeps, cmd: GenerateScheduleCommand, ) -> DomainResult { let channel_id = ChannelId::from(cmd.channel_id); let schedule = deps .schedule_engine .generate_schedule(channel_id, Utc::now()) .await?; deps.event_publisher .publish(DomainEvent::ScheduleGenerated { channel_id, schedule_id: schedule.id(), }) .await?; Ok(schedule) } #[cfg(test)] #[path = "tests/generate.rs"] mod tests;