1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Serialize, Deserialize, Clone)]
5pub struct JobErrorReturn {
6 #[serde(rename = "error")]
7 pub error_string: String,
8 pub retry_worthy: bool,
9}
10
11#[derive(Debug, Serialize, Deserialize, Clone)]
12pub struct RetryableTask {
13 #[serde(rename = "taskId")]
14 pub task_id: String,
15
16 #[serde(rename = "retryCount")]
17 pub retry_count: i32,
18
19 #[serde(rename = "maxRetries")]
20 pub max_retries: i32,
21
22 #[serde(rename = "retryAfterHours")]
23 pub retry_after_hours: f64,
24
25 #[serde(rename = "retryAfterTime")]
26 pub retry_after_time: DateTime<Utc>,
27
28 #[serde(rename = "taskData")]
29 pub task_data: String,
30
31 #[serde(rename = "taskType")]
32 pub task_type: String,
33
34 #[serde(rename = "LastErrorObj", skip_serializing_if = "Option::is_none")]
35 pub last_error_obj: Option<String>,
36
37 #[serde(rename = "LastJobError", skip_serializing_if = "Option::is_none")]
38 pub last_job_error: Option<JobErrorReturn>,
39
40 #[serde(rename = "deletedAt", skip_serializing_if = "Option::is_none")]
41 pub deleted_at: Option<DateTime<Utc>>,
42
43 #[serde(skip, default = "Utc::now")]
44 pub created_at: DateTime<Utc>,
45
46 #[serde(skip, default = "Utc::now")]
47 pub updated_at: DateTime<Utc>,
48}
49
50impl RetryableTask {
51 pub fn new(
52 task_id: String,
53 task_type: String,
54 task_data: String,
55 max_retries: i32,
56 retry_after_hours: f64,
57 ) -> Self {
58 let now = Utc::now();
59 Self {
60 task_id,
61 task_type,
62 task_data,
63 max_retries,
64 retry_after_hours,
65 retry_count: 0,
66 retry_after_time: now,
67 last_error_obj: None,
68 last_job_error: None,
69 deleted_at: None,
70 created_at: now,
71 updated_at: now,
72 }
73 }
74
75 pub fn mark_deleted(&mut self) {
76 self.deleted_at = Some(Utc::now());
77 self.updated_at = Utc::now();
78 }
79
80 pub fn update_retry_config(&mut self, error_msg: Option<String>) {
81 self.retry_count += 1;
82
83 let seconds = (self.retry_after_hours * 3600.0) as i64;
85 self.retry_after_time = Utc::now() + chrono::Duration::seconds(seconds);
86
87 self.last_error_obj = error_msg.clone();
88
89 if let Some(msg) = error_msg {
90 self.last_job_error = Some(JobErrorReturn {
91 error_string: msg,
92 retry_worthy: true,
93 });
94 } else {
95 self.last_job_error = None;
96 }
97
98 self.updated_at = Utc::now();
99 }
100}