use actix_web::HttpResponse;
use serde_json::json;
use sqlx::{Pool, Postgres};
use super::super::catalog_errors::schema_internal_fetch_error;
use super::super::catalog_service_loader_query::load_schema_column_rows;
use super::super::presentation::schema_columns as build_schema_columns_payload;
use super::super::request_params::NormalizedColumnQuery;
use super::super::schema_backend::SchemaBackend;
pub(in super::super) async fn schema_columns_response(
backend: &SchemaBackend,
app_state: &crate::AppState,
query: NormalizedColumnQuery,
) -> HttpResponse {
let rows = match backend {
SchemaBackend::Postgres { pool } => match load_schema_column_rows(pool, &query).await {
Ok(rows) => rows,
Err(err) => return schema_internal_fetch_error("columns", &err),
},
SchemaBackend::D1 { connection_info } => {
let schema_label = query.table_schema.as_deref().unwrap_or("public");
match super::super::schema_d1::load_schema_column_rows(
app_state,
connection_info,
schema_label,
Some(query.table_name.as_str()),
)
.await
{
Ok(rows) => rows,
Err(resp) => return resp,
}
}
};
HttpResponse::Ok().json(json!({ "columns": build_schema_columns_payload(rows) }))
}