use crate::AppState; use axum::{ extract::{Path, Query, State}, http::StatusCode, response::IntoResponse, routing::get, Json, Router, }; use contracts::auth_middleware::AuthUser; use serde::{Deserialize, Serialize}; use uuid::Uuid; pub fn router() -> Router { Router::new() .route("/", get(list_companies)) } #[derive(Deserialize)] pub struct ListQuery { pub q: Option, } #[derive(Serialize)] pub struct AdminCompanyRow { pub id: Uuid, pub user_id: Uuid, pub company_name: String, pub registration_number: Option, pub industry: Option, pub status: String, pub created_at: chrono::DateTime, pub updated_at: chrono::DateTime, } async fn list_companies( _auth: AuthUser, State(state): State, Query(q): Query, ) -> Result { let search = q.q.as_deref().unwrap_or_default().to_lowercase(); let companies = sqlx::query_as!( AdminCompanyRow, r#" SELECT id, user_id, company_name, registration_number, industry, status, created_at, updated_at FROM company_profiles WHERE ($1 = '' OR LOWER(company_name) LIKE '%' || $1 || '%') ORDER BY created_at DESC LIMIT 100 "#, search ) .fetch_all(&state.pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("DB error: {e}")))?; Ok(Json(companies)) }