use std::collections::HashMap;
use async_trait::async_trait;
use chrono::{DateTime, Utc};
use uuid::Uuid;
use crate::types::{DatabaseError, PipelineRun, PipelineRunStatus};
pub type PipelineRunRow = PipelineRun;
type DbError = DatabaseError;
#[derive(Debug, Clone)]
pub struct PipelineRunWithAttributionRow {
pub id: Uuid,
pub created_at: DateTime<Utc>,
pub status: PipelineRunStatus,
pub pipeline_run_id: Uuid,
pub pipeline_name: String,
pub pipeline_id: Uuid,
pub dataset_id: Option<Uuid>,
pub dataset_name: Option<String>,
pub owner_id: Option<Uuid>,
pub owner_email: Option<String>,
}
#[async_trait]
pub trait PipelineRunRepository: Send + Sync {
async fn log_pipeline_run(
&self,
pipeline_run_id: Uuid,
pipeline_id: Uuid,
pipeline_name: &str,
dataset_id: Option<Uuid>,
status: PipelineRunStatus,
run_info: Option<serde_json::Value>,
) -> Result<Uuid, DbError>;
async fn latest_status(
&self,
dataset_ids: &[Uuid],
pipeline_name: &str,
) -> Result<HashMap<Uuid, PipelineRunStatus>, DbError>;
async fn list_recent(
&self,
dataset_id: Option<Uuid>,
limit: u32,
) -> Result<Vec<PipelineRunRow>, DbError>;
async fn list_recent_with_attribution(
&self,
dataset_id: Option<Uuid>,
limit: u32,
) -> Result<Vec<PipelineRunWithAttributionRow>, DbError> {
let rows = self.list_recent(dataset_id, limit).await?;
Ok(rows
.into_iter()
.map(|r| PipelineRunWithAttributionRow {
id: r.id,
created_at: r.created_at,
status: r.status,
pipeline_run_id: r.pipeline_run_id,
pipeline_name: r.pipeline_name,
pipeline_id: r.pipeline_id,
dataset_id: r.dataset_id,
dataset_name: None,
owner_id: None,
owner_email: None,
})
.collect())
}
async fn reset_orphans(&self, reason: &str) -> Result<u64, DbError>;
async fn set_payload_field(
&self,
run_id: Uuid,
key: &str,
value: serde_json::Value,
) -> Result<(), DbError>;
async fn get_payload(
&self,
run_id: Uuid,
) -> Result<serde_json::Map<String, serde_json::Value>, DbError>;
async fn get_pipeline_run(&self, pipeline_run_id: Uuid)
-> Result<Option<PipelineRun>, DbError>;
async fn get_pipeline_run_by_dataset(
&self,
dataset_id: Uuid,
pipeline_name: &str,
) -> Result<Option<PipelineRun>, DbError>;
async fn get_pipeline_runs_by_dataset(
&self,
dataset_id: Uuid,
) -> Result<Vec<PipelineRun>, DbError>;
}