upub/core/src/model/job.rs

60 lines
1.9 KiB
Rust
Raw Normal View History

use sea_orm::entity::prelude::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, EnumIter, DeriveActiveEnum)]
2024-06-07 07:12:48 +02:00
#[sea_orm(rs_type = "i16", db_type = "SmallInteger")]
pub enum JobType {
Inbound = 1,
Outbound = 2,
Delivery = 3,
}
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "jobs")]
pub struct Model {
#[sea_orm(primary_key)]
pub internal: i64,
pub job_type: JobType,
pub actor: String,
pub target: Option<String>,
pub activity: String,
pub payload: Option<serde_json::Value>,
pub published: ChronoDateTimeUtc,
pub not_before: ChronoDateTimeUtc,
2024-06-07 07:15:47 +02:00
pub attempt: i16,
pub error: Option<String>,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {}
impl Model {
pub fn next_attempt(&self) -> ChronoDateTimeUtc {
match self.attempt {
0 => chrono::Utc::now() + std::time::Duration::from_secs(10),
1 => chrono::Utc::now() + std::time::Duration::from_secs(60),
2 => chrono::Utc::now() + std::time::Duration::from_secs(5 * 60),
3 => chrono::Utc::now() + std::time::Duration::from_secs(20 * 60),
4 => chrono::Utc::now() + std::time::Duration::from_secs(60 * 60),
5 => chrono::Utc::now() + std::time::Duration::from_secs(12 * 60 * 60),
_ => chrono::Utc::now() + std::time::Duration::from_secs(24 * 60 * 60),
}
}
pub fn repeat(self, error: Option<String>) -> ActiveModel {
ActiveModel {
internal: sea_orm::ActiveValue::NotSet,
job_type: sea_orm::ActiveValue::Set(self.job_type),
not_before: sea_orm::ActiveValue::Set(self.next_attempt()),
actor: sea_orm::ActiveValue::Set(self.actor),
target: sea_orm::ActiveValue::Set(self.target),
payload: sea_orm::ActiveValue::Set(self.payload),
activity: sea_orm::ActiveValue::Set(self.activity),
published: sea_orm::ActiveValue::Set(self.published),
attempt: sea_orm::ActiveValue::Set(self.attempt + 1),
error: sea_orm::ActiveValue::Set(error),
}
}
}