use axum::{
extract::{Path, Query, State},
http::StatusCode,
response::{IntoResponse, Json, Response},
};
use std::sync::Arc;
use crate::database::traits::DatabaseProvider;
use crate::schema::RowQuery;
const MAX_LIMIT: u64 = 500;
pub async fn get_rows_handler<DB: DatabaseProvider>(
State(database): State<Arc<DB>>,
Path(table_name): Path<String>,
Query(mut query): Query<RowQuery>,
) -> Response {
if query.limit > MAX_LIMIT {
query.limit = MAX_LIMIT;
}
match database.get_rows(&table_name, query).await {
Ok(response) => (StatusCode::OK, Json(response)).into_response(),
Err(error) => {
eprintln!(
"Failed to get rows from table '{}': {}",
table_name,
error
);
let status = if error.to_string().contains("not found") {
StatusCode::NOT_FOUND
} else if error.to_string().contains("Invalid column") {
StatusCode::BAD_REQUEST
} else if error.to_string().contains("timeout") {
StatusCode::REQUEST_TIMEOUT
} else {
StatusCode::INTERNAL_SERVER_ERROR
};
(
status,
Json(serde_json::json!({
"error": error.to_string()
})),
)
.into_response()
}
}
}
pub async fn count_rows_handler<DB: DatabaseProvider>(
State(database): State<Arc<DB>>,
Path(table_name): Path<String>,
Query(query): Query<RowQuery>,
) -> Response {
match database.count_rows(&table_name, &query).await {
Ok(response) => (StatusCode::OK, Json(response)).into_response(),
Err(error) => {
eprintln!(
"Failed to count rows from table '{}': {}",
table_name,
error
);
let status = if error.to_string().contains("not found") {
StatusCode::NOT_FOUND
} else if error.to_string().contains("Invalid column") {
StatusCode::BAD_REQUEST
} else {
StatusCode::INTERNAL_SERVER_ERROR
};
(
status,
Json(serde_json::json!({
"error": error.to_string()
})),
)
.into_response()
}
}
}