use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::types::{TaskConfig, TaskStatus, SubmitTaskParams};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryableTask {
pub task_id: String,
pub task_type: i16,
pub retry_count: i64,
pub max_retries: i64,
pub payload: serde_json::Value,
}
#[async_trait]
pub trait TaskStorage: Send + Sync {
async fn save_task_log(
&self,
task_id: &str,
task_type: i16,
priority: i16,
config: &TaskConfig,
params: &SubmitTaskParams,
) -> Result<(), String>;
async fn save_task_queue(
&self,
task_id: &str,
topic: &str,
priority: i16,
) -> Result<(), String>;
async fn update_task_status(
&self,
task_id: &str,
status: TaskStatus,
) -> Result<(), String>;
async fn get_retry_count(&self, task_id: &str) -> Result<i64, String>;
async fn update_retry(&self, task_id: &str, retry_count: i64) -> Result<(), String>;
async fn save_task_result(
&self,
task_id: &str,
output: &serde_json::Value,
) -> Result<(), String>;
async fn log_execution(
&self,
task_id: &str,
status: TaskStatus,
error: Option<&str>,
elapsed_ms: i64,
) -> Result<(), String>;
async fn scan_retryable_tasks(
&self,
task_types: &[i16],
limit: usize,
) -> Result<Vec<RetryableTask>, String>;
}