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 AdminCateringServiceList { 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 AdminCateringServiceDetail = AdminCateringServiceList; pub fn router() -> Router { Router::new() .route("/", get(list_catering_services)) .route("/{id}", get(get_catering_service)) } async fn list_catering_services( State(state): State, ) -> Result { let services = sqlx::query_as!( AdminCateringServiceList, r#" SELECT c.id, c.user_id, c.bio, c.experience_years, c.custom_data, c.created_at, c.updated_at, u.first_name, u.last_name, u.email, u.phone, u.status FROM catering_service_profiles c JOIN users u ON c.user_id = u.id ORDER BY c.created_at DESC LIMIT 100 "# ) .fetch_all(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {e}")))?; Ok(Json(services)) } async fn get_catering_service( State(state): State, Path(id): Path, ) -> Result { let service = sqlx::query_as!( AdminCateringServiceDetail, r#" SELECT c.id, c.user_id, c.bio, c.experience_years, c.custom_data, c.created_at, c.updated_at, u.first_name, u.last_name, u.email, u.phone, u.status FROM catering_service_profiles c JOIN users u ON c.user_id = u.id WHERE c.id = $1 "#, id ) .fetch_optional(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {e}")))?; match service { Some(c) => Ok(Json(c)), None => Err((StatusCode::NOT_FOUND, "Catering service not found".to_string())), } }