use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ProcessingJobProjection {
pub id: Uuid,
pub file_id: Uuid,
pub job_type: ProcessingJobType,
pub status: JobStatus,
pub priority: i32,
pub input_data: Option<serde_json::Value>,
pub result_data: Option<serde_json::Value>,
pub error_message: Option<String>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub retry_count: i32,
pub max_retries: i32,
pub metadata: serde_json::Value,
pub projection_version: i64,
pub last_event_sequence: i64,
pub projection_updated_at: DateTime<Utc>,
}
impl ProcessingJobProjection {
pub fn new(
id: Uuid,
file_id: Uuid,
job_type: ProcessingJobType,
status: JobStatus,
priority: i32,
input_data: Option<serde_json::Value>,
result_data: Option<serde_json::Value>,
error_message: Option<String>,
started_at: Option<DateTime<Utc>>,
completed_at: Option<DateTime<Utc>>,
retry_count: i32,
max_retries: i32,
metadata: serde_json::Value
) -> Self {
Self {
id,
file_id,
job_type,
status,
priority,
input_data,
result_data,
error_message,
started_at,
completed_at,
retry_count,
max_retries,
metadata,
projection_version: 1,
last_event_sequence: 0,
projection_updated_at: Utc::now(),
}
}
pub fn id(&self) -> &Uuid {
&self.id
}
pub fn apply_event(&mut self, event_sequence: i64) {
self.projection_version += 1;
self.last_event_sequence = event_sequence;
self.projection_updated_at = Utc::now();
}
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ProcessingJobSummary {
pub id: Uuid,
pub status: JobStatus,
}