use crate::AppState; use db::models::requirement::Requirement; use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router}; use serde::Serialize; use uuid::Uuid; #[derive(Serialize)] pub struct AdminLeadRow { pub id: Uuid, pub title: String, pub description: Option, pub profession_key: String, pub location: String, pub budget: Option, pub status: String, pub created_at: chrono::DateTime, pub updated_at: chrono::DateTime, } impl From for AdminLeadRow { fn from(r: Requirement) -> Self { Self { id: r.id, title: r.title, description: Some(r.description), profession_key: r.profession_key, location: r.location, budget: r.budget, status: r.status, created_at: r.created_at, updated_at: r.updated_at, } } } pub fn router() -> Router { Router::new().route("/", get(list_leads)) } async fn list_leads( State(state): State, ) -> Result { let requirements = sqlx::query_as::<_, Requirement>( r#" SELECT id, customer_id, profession_key, title, description, location, budget, preferred_date, extra_data_json, status, rejection_reason, request_count, accepted_count, expires_at, approved_at, approved_by, created_at, updated_at FROM requirements ORDER BY created_at DESC LIMIT 100 "#, ) .fetch_all(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {e}")))?; let leads: Vec = requirements.into_iter().map(|r| r.into()).collect(); Ok(Json(leads)) }