webhooks (#1)
Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
@@ -7,21 +7,24 @@ use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
use chrono::Utc;
|
||||
use domain::{ChannelRepository, ScheduleEngineService};
|
||||
use domain::{ChannelRepository, DomainEvent, ScheduleEngineService};
|
||||
use tokio::sync::broadcast;
|
||||
|
||||
pub async fn run_auto_scheduler(
|
||||
schedule_engine: Arc<ScheduleEngineService>,
|
||||
channel_repo: Arc<dyn ChannelRepository>,
|
||||
event_tx: broadcast::Sender<DomainEvent>,
|
||||
) {
|
||||
loop {
|
||||
tokio::time::sleep(Duration::from_secs(3600)).await;
|
||||
tick(&schedule_engine, &channel_repo).await;
|
||||
tick(&schedule_engine, &channel_repo, &event_tx).await;
|
||||
}
|
||||
}
|
||||
|
||||
async fn tick(
|
||||
schedule_engine: &Arc<ScheduleEngineService>,
|
||||
channel_repo: &Arc<dyn ChannelRepository>,
|
||||
event_tx: &broadcast::Sender<DomainEvent>,
|
||||
) {
|
||||
let channels = match channel_repo.find_auto_schedule_enabled().await {
|
||||
Ok(c) => c,
|
||||
@@ -59,18 +62,25 @@ async fn tick(
|
||||
}
|
||||
};
|
||||
|
||||
if let Err(e) = schedule_engine.generate_schedule(channel.id, from).await {
|
||||
tracing::warn!(
|
||||
"auto-scheduler: failed to generate schedule for channel {}: {}",
|
||||
channel.id,
|
||||
e
|
||||
);
|
||||
} else {
|
||||
tracing::info!(
|
||||
"auto-scheduler: generated schedule for channel {} starting at {}",
|
||||
channel.id,
|
||||
from
|
||||
);
|
||||
match schedule_engine.generate_schedule(channel.id, from).await {
|
||||
Ok(schedule) => {
|
||||
tracing::info!(
|
||||
"auto-scheduler: generated schedule for channel {} starting at {}",
|
||||
channel.id,
|
||||
from
|
||||
);
|
||||
let _ = event_tx.send(DomainEvent::ScheduleGenerated {
|
||||
channel_id: channel.id,
|
||||
schedule,
|
||||
});
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::warn!(
|
||||
"auto-scheduler: failed to generate schedule for channel {}: {}",
|
||||
channel.id,
|
||||
e
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -221,7 +231,8 @@ mod tests {
|
||||
Arc::new(MockScheduleRepo { latest: None, saved: saved.clone() });
|
||||
let engine = make_engine(channel_repo.clone(), schedule_repo);
|
||||
|
||||
tick(&engine, &channel_repo).await;
|
||||
let (event_tx, _) = tokio::sync::broadcast::channel(8);
|
||||
tick(&engine, &channel_repo, &event_tx).await;
|
||||
|
||||
let saved = saved.lock().unwrap();
|
||||
assert_eq!(saved.len(), 1);
|
||||
@@ -240,7 +251,8 @@ mod tests {
|
||||
Arc::new(MockScheduleRepo { latest: Some(schedule), saved: saved.clone() });
|
||||
let engine = make_engine(channel_repo.clone(), schedule_repo);
|
||||
|
||||
tick(&engine, &channel_repo).await;
|
||||
let (event_tx, _) = tokio::sync::broadcast::channel(8);
|
||||
tick(&engine, &channel_repo, &event_tx).await;
|
||||
|
||||
assert_eq!(saved.lock().unwrap().len(), 0);
|
||||
}
|
||||
@@ -256,7 +268,8 @@ mod tests {
|
||||
Arc::new(MockScheduleRepo { latest: Some(schedule), saved: saved.clone() });
|
||||
let engine = make_engine(channel_repo.clone(), schedule_repo);
|
||||
|
||||
tick(&engine, &channel_repo).await;
|
||||
let (event_tx, _) = tokio::sync::broadcast::channel(8);
|
||||
tick(&engine, &channel_repo, &event_tx).await;
|
||||
|
||||
let saved = saved.lock().unwrap();
|
||||
assert_eq!(saved.len(), 1);
|
||||
@@ -274,7 +287,8 @@ mod tests {
|
||||
Arc::new(MockScheduleRepo { latest: Some(schedule), saved: saved.clone() });
|
||||
let engine = make_engine(channel_repo.clone(), schedule_repo);
|
||||
|
||||
tick(&engine, &channel_repo).await;
|
||||
let (event_tx, _) = tokio::sync::broadcast::channel(8);
|
||||
tick(&engine, &channel_repo, &event_tx).await;
|
||||
|
||||
let saved = saved.lock().unwrap();
|
||||
assert_eq!(saved.len(), 1);
|
||||
|
||||
Reference in New Issue
Block a user