use crate::AppState; use axum::{extract::{Path, State}, http::StatusCode, response::IntoResponse, routing::get, Json, Router}; use chrono::{DateTime, Utc}; use serde::Serialize; use uuid::Uuid; #[derive(Serialize)] pub struct AdminVideoEditorList { pub id: Uuid, pub user_id: Uuid, pub first_name: String, pub last_name: String, pub email: String, pub phone: Option, pub status: String, pub bio: Option, pub experience_years: Option, pub custom_data: serde_json::Value, pub created_at: DateTime, pub updated_at: DateTime, } type AdminVideoEditorDetail = AdminVideoEditorList; pub fn router() -> Router { Router::new() .route("/", get(list_video_editors)) .route("/{id}", get(get_video_editor)) } async fn list_video_editors( State(state): State, ) -> Result { let editors = sqlx::query_as!( AdminVideoEditorList, r#" SELECT v.id, v.user_id, v.bio, v.experience_years, v.custom_data, v.created_at, v.updated_at, u.first_name, u.last_name, u.email, u.phone, u.status FROM video_editor_profiles v JOIN users u ON v.user_id = u.id ORDER BY v.created_at DESC LIMIT 100 "# ) .fetch_all(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {e}")))?; Ok(Json(editors)) } async fn get_video_editor( State(state): State, Path(id): Path, ) -> Result { let editor = sqlx::query_as!( AdminVideoEditorDetail, r#" SELECT v.id, v.user_id, v.bio, v.experience_years, v.custom_data, v.created_at, v.updated_at, u.first_name, u.last_name, u.email, u.phone, u.status FROM video_editor_profiles v JOIN users u ON v.user_id = u.id WHERE v.id = $1 "#, id ) .fetch_optional(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {e}")))?; match editor { Some(v) => Ok(Json(v)), None => Err((StatusCode::NOT_FOUND, "Video editor not found".to_string())), } }