use async_trait::async_trait;
use sqlx::{mysql::MySqlRow, MySql, QueryBuilder, Row};
use aether_data_contracts::repository::video_tasks::{
StoredVideoTask, UpsertVideoTask, VideoTaskLookupKey, VideoTaskModelCount,
VideoTaskQueryFilter, VideoTaskReadRepository, VideoTaskStatus, VideoTaskStatusCount,
VideoTaskWriteRepository,
};
use aether_data_contracts::DataLayerError;
use crate::error::SqlResultExt;
use crate::MysqlPool;
const VIDEO_TASK_COLUMNS: &str = r#"
SELECT
id,
short_id,
request_id,
user_id,
api_key_id,
username,
api_key_name,
external_task_id,
provider_id,
endpoint_id,
key_id,
client_api_format,
provider_api_format,
format_converted,
model,
prompt,
original_request_body,
duration_seconds,
resolution,
aspect_ratio,
size,
status,
progress_percent,
progress_message,
retry_count,
poll_interval_seconds,
next_poll_at AS next_poll_at_unix_secs,
poll_count,
max_poll_count,
created_at AS created_at_unix_ms,
submitted_at AS submitted_at_unix_secs,
completed_at AS completed_at_unix_secs,
updated_at AS updated_at_unix_secs,
error_code,
error_message,
video_url,
request_metadata
FROM video_tasks
"#;
#[derive(Debug, Clone)]
pub struct MysqlVideoTaskRepository {
pool: MysqlPool,
}
impl MysqlVideoTaskRepository {
pub fn new(pool: MysqlPool) -> Self {
Self { pool }
}
async fn find_by_id(&self, id: &str) -> Result