1use async_trait::async_trait;
7use serde::{Deserialize, Serialize};
8
9use crate::types::{TaskConfig, TaskStatus, SubmitTaskParams};
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct RetryableTask {
14 pub task_id: String,
16 pub task_type: i16,
18 pub retry_count: i64,
20 pub max_retries: i64,
22 pub payload: serde_json::Value,
24}
25
26#[async_trait]
31pub trait TaskStorage: Send + Sync {
32 async fn save_task_log(
36 &self,
37 task_id: &str,
38 task_type: i16,
39 priority: i16,
40 config: &TaskConfig,
41 params: &SubmitTaskParams,
42 ) -> Result<(), String>;
43
44 async fn save_task_queue(
48 &self,
49 task_id: &str,
50 topic: &str,
51 priority: i16,
52 ) -> Result<(), String>;
53
54 async fn update_task_status(
58 &self,
59 task_id: &str,
60 status: TaskStatus,
61 ) -> Result<(), String>;
62
63 async fn get_retry_count(&self, task_id: &str) -> Result<i64, String>;
65
66 async fn update_retry(&self, task_id: &str, retry_count: i64) -> Result<(), String>;
70
71 async fn save_task_result(
73 &self,
74 task_id: &str,
75 output: &serde_json::Value,
76 ) -> Result<(), String>;
77
78 async fn log_execution(
82 &self,
83 task_id: &str,
84 status: TaskStatus,
85 error: Option<&str>,
86 elapsed_ms: i64,
87 ) -> Result<(), String>;
88
89 async fn scan_retryable_tasks(
94 &self,
95 task_types: &[i16],
96 limit: usize,
97 ) -> Result<Vec<RetryableTask>, String>;
98}