feat: add sync-status endpoint to update file status based on processor files

This commit is contained in:
Accusys
2026-07-19 21:58:03 +08:00
parent 84dda3b5bc
commit 2ed56b7973
+51
View File
@@ -1602,4 +1602,55 @@ pub fn file_routes() -> Router<AppState> {
"/api/v1/file/:file_uuid/metadata",
post(update_file_metadata),
)
.route(
"/api/v1/file/:file_uuid/sync-status",
post(sync_file_status),
)
}
async fn sync_file_status(
Path(file_uuid): Path<String>,
State(state): State<AppState>,
) -> Result<Json<serde_json::Value>, StatusCode> {
use crate::core::config::OUTPUT_DIR;
let output_dir = OUTPUT_DIR.as_str();
let required_processors = ["face.json", "asrx.json", "ocr.json", "pose.json", "appearance.json"];
let mut completed_count = 0;
for processor in &required_processors {
let path = std::path::Path::new(output_dir)
.join(format!("{}.{}", file_uuid, processor));
if path.exists() {
completed_count += 1;
}
}
let all_complete = completed_count == required_processors.len();
let new_status = if all_complete { "completed" } else { "processing" };
let videos_table = schema::table_name("videos");
let result = sqlx::query(&format!(
"UPDATE {} SET status = $1, updated_at = NOW() WHERE file_uuid = $2",
videos_table
))
.bind(new_status)
.bind(&file_uuid)
.execute(state.db.pool())
.await;
match result {
Ok(res) if res.rows_affected() > 0 => Ok(Json(serde_json::json!({
"success": true,
"file_uuid": file_uuid,
"status": new_status,
"processors_complete": completed_count,
"processors_total": required_processors.len()
}))),
Ok(_) => Err(StatusCode::NOT_FOUND),
Err(e) => {
tracing::error!("[SYNC_STATUS] Update failed: {}", e);
Err(StatusCode::INTERNAL_SERVER_ERROR)
}
}
}