fedimovies/src/job_queue/scheduler.rs

107 lines
3.6 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
2021-04-09 00:22:17 +00:00
use std::time::Duration;
use chrono::{DateTime, Utc};
use uuid::Uuid;
use crate::config::Config;
use crate::database::DbPool;
use crate::ethereum::contracts::Blockchain;
use super::periodic_tasks::*;
2021-04-09 00:22:17 +00:00
#[derive(Debug, Eq, Hash, PartialEq)]
2023-02-05 09:29:46 +00:00
enum PeriodicTask {
NftMonitor,
2022-08-28 12:01:26 +00:00
EthereumSubscriptionMonitor,
SubscriptionExpirationMonitor,
MoneroPaymentMonitor,
2023-02-05 09:29:46 +00:00
IncomingActivityQueueExecutor,
OutgoingActivityQueueExecutor,
}
2023-02-05 09:29:46 +00:00
impl PeriodicTask {
/// Returns task period (in seconds)
fn period(&self) -> i64 {
match self {
Self::NftMonitor => 30,
2022-08-28 12:01:26 +00:00
Self::EthereumSubscriptionMonitor => 300,
Self::SubscriptionExpirationMonitor => 300,
Self::MoneroPaymentMonitor => 30,
2023-02-05 09:29:46 +00:00
Self::IncomingActivityQueueExecutor => 5,
Self::OutgoingActivityQueueExecutor => 5,
}
}
2023-02-05 09:29:46 +00:00
fn is_ready(&self, last_run: &Option<DateTime<Utc>>) -> bool {
match last_run {
Some(last_run) => {
let time_passed = Utc::now() - *last_run;
time_passed.num_seconds() >= self.period()
},
None => true,
}
}
}
2022-06-14 10:29:14 +00:00
pub fn run(
config: Config,
mut maybe_blockchain: Option<Blockchain>,
2022-12-03 21:23:52 +00:00
db_pool: DbPool,
2022-06-14 10:29:14 +00:00
) -> () {
tokio::spawn(async move {
2022-12-15 17:43:30 +00:00
let mut scheduler_state = HashMap::from([
2023-02-05 09:29:46 +00:00
(PeriodicTask::NftMonitor, None),
(PeriodicTask::EthereumSubscriptionMonitor, None),
(PeriodicTask::SubscriptionExpirationMonitor, None),
(PeriodicTask::MoneroPaymentMonitor, None),
(PeriodicTask::IncomingActivityQueueExecutor, None),
(PeriodicTask::OutgoingActivityQueueExecutor, None),
2022-12-15 17:43:30 +00:00
]);
let mut interval = tokio::time::interval(Duration::from_secs(5));
let mut token_waitlist_map: HashMap<Uuid, DateTime<Utc>> = HashMap::new();
2021-04-09 00:22:17 +00:00
loop {
interval.tick().await;
for (task, last_run) in scheduler_state.iter_mut() {
2023-02-05 09:29:46 +00:00
if !task.is_ready(last_run) {
continue;
};
let task_result = match task {
2023-02-05 09:29:46 +00:00
PeriodicTask::NftMonitor => {
nft_monitor(
2022-06-29 17:30:36 +00:00
maybe_blockchain.as_mut(),
&db_pool,
&mut token_waitlist_map,
).await
},
2023-02-05 09:29:46 +00:00
PeriodicTask::EthereumSubscriptionMonitor => {
ethereum_subscription_monitor(
&config,
2022-06-29 17:30:36 +00:00
maybe_blockchain.as_mut(),
&db_pool,
).await
},
2023-02-05 09:29:46 +00:00
PeriodicTask::SubscriptionExpirationMonitor => {
subscription_expiration_monitor(&config, &db_pool).await
2022-08-28 12:01:26 +00:00
},
2023-02-05 09:29:46 +00:00
PeriodicTask::MoneroPaymentMonitor => {
monero_payment_monitor(&config, &db_pool).await
},
2023-02-05 09:29:46 +00:00
PeriodicTask::IncomingActivityQueueExecutor => {
incoming_activity_queue_executor(&config, &db_pool).await
},
2023-02-05 09:29:46 +00:00
PeriodicTask::OutgoingActivityQueueExecutor => {
outgoing_activity_queue_executor(&config, &db_pool).await
2022-12-11 18:41:08 +00:00
},
};
task_result.unwrap_or_else(|err| {
log::error!("{:?}: {}", task, err);
});
*last_run = Some(Utc::now());
};
2022-08-28 12:01:26 +00:00
};
2021-04-09 00:22:17 +00:00
});
}