use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct JobErrorReturn {
#[serde(rename = "error")]
pub error_string: String,
pub retry_worthy: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RetryableTask {
#[serde(rename = "taskId")]
pub task_id: String,
#[serde(rename = "retryCount")]
pub retry_count: i32,
#[serde(rename = "maxRetries")]
pub max_retries: i32,
#[serde(rename = "retryAfterHours")]
pub retry_after_hours: f64,
#[serde(rename = "retryAfterTime")]
pub retry_after_time: DateTime<Utc>,
#[serde(rename = "taskData")]
pub task_data: String,
#[serde(rename = "taskType")]
pub task_type: String,
#[serde(rename = "LastErrorObj", skip_serializing_if = "Option::is_none")]
pub last_error_obj: Option<String>,
#[serde(rename = "LastJobError", skip_serializing_if = "Option::is_none")]
pub last_job_error: Option<JobErrorReturn>,
#[serde(rename = "deletedAt", skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<DateTime<Utc>>,
#[serde(skip, default = "Utc::now")]
pub created_at: DateTime<Utc>,
#[serde(skip, default = "Utc::now")]
pub updated_at: DateTime<Utc>,
}
impl RetryableTask {
pub fn new(
task_id: String,
task_type: String,
task_data: String,
max_retries: i32,
retry_after_hours: f64,
) -> Self {
let now = Utc::now();
Self {
task_id,
task_type,
task_data,
max_retries,
retry_after_hours,
retry_count: 0,
retry_after_time: now,
last_error_obj: None,
last_job_error: None,
deleted_at: None,
created_at: now,
updated_at: now,
}
}
pub fn mark_deleted(&mut self) {
self.deleted_at = Some(Utc::now());
self.updated_at = Utc::now();
}
pub fn update_retry_config(&mut self, error_msg: Option<String>) {
self.retry_count += 1;
let seconds = (self.retry_after_hours * 3600.0) as i64;
self.retry_after_time = Utc::now() + chrono::Duration::seconds(seconds);
self.last_error_obj = error_msg.clone();
if let Some(msg) = error_msg {
self.last_job_error = Some(JobErrorReturn {
error_string: msg,
retry_worthy: true,
});
} else {
self.last_job_error = None;
}
self.updated_at = Utc::now();
}
}