Skip to main content

snerd_rust/
task.rs

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        // Calculate next retry time
84        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}