start using Json() for better typing, correctness, testability

This commit is contained in:
Brandon Thomas committed 2024-07-07 19:23:57 -04:00
1 parent 17a4cf774d
commit 113ed359fd
3 files changed
+27 -55

No files matched your search

@@ -5,7 +5,7 @@ use std::sync::Arc;
use actix_web::{HttpMessage, HttpRequest, HttpResponse, web};
use actix_web::error::ResponseError;
use actix_web::http::StatusCode;
use actix_web::web::Path;
use actix_web::web::{Json, Path};
use actix_web_lab::extract::Query;
use chrono::{DateTime, Utc};
use log::error;
@@ -174,8 +174,9 @@ impl fmt::Display for BatchGetInferenceJobStatusError {
pub async fn batch_get_inference_job_status_handler(
http_request: HttpRequest,
query: Query<BatchGetInferenceJobStatusQueryParams>,
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, BatchGetInferenceJobStatusError>
{
server_state: web::Data<Arc<ServerState>>
) -> Result<Json<BatchGetInferenceJobStatusSuccessResponse>, BatchGetInferenceJobStatusError> {
let tokens = query.tokens.iter()
.map(|token| token.trim())
// NB: A bunch of Python clients use our API and can fail in this manner.
@@ -186,7 +187,7 @@ pub async fn batch_get_inference_job_status_handler(
.collect::<Vec<_>>();
if tokens.is_empty() {
return records_to_response(Vec::new());
return Ok(records_to_response(Vec::new()));
}
// NB: Since this is publicly exposed, we don't query sensitive data.
@@ -230,30 +231,20 @@ pub async fn batch_get_inference_job_status_handler(
};
}
records_to_response(records)
Ok(records_to_response(records))
}
fn records_to_response(records: Vec<GenericInferenceJobStatus>) -> Result<HttpResponse, BatchGetInferenceJobStatusError> {
let records = records.into_iter()
.map(|record| {
db_record_to_response_payload(record, None)
})
.collect::<Vec<_>>();
let response = BatchGetInferenceJobStatusSuccessResponse {
fn records_to_response(records: Vec<GenericInferenceJobStatus>)
-> Json<BatchGetInferenceJobStatusSuccessResponse>
{
Json(BatchGetInferenceJobStatusSuccessResponse {
success: true,
job_states: records,
};
let body = serde_json::to_string(&response)
.map_err(|e| {
error!("error returning response: {:?}", e);
BatchGetInferenceJobStatusError::ServerError
})?;
Ok(HttpResponse::Ok()
.content_type("application/json")
.body(body))
job_states: records.into_iter()
.map(|record| {
db_record_to_response_payload(record, None)
})
.collect::<Vec<_>>(),
})
}
fn db_record_to_response_payload(
@@ -4,7 +4,7 @@ use std::sync::Arc;
use actix_web::{HttpMessage, HttpRequest, HttpResponse, web};
use actix_web::error::ResponseError;
use actix_web::http::StatusCode;
use actix_web::web::Path;
use actix_web::web::{Json, Path};
use chrono::{DateTime, Utc};
use log::error;
use r2d2_redis::redis::{Commands, RedisResult};
@@ -162,7 +162,7 @@ impl fmt::Display for GetInferenceJobStatusError {
pub async fn get_inference_job_status_handler(
http_request: HttpRequest,
path: Path<GetInferenceJobStatusPathInfo>,
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, GetInferenceJobStatusError>
server_state: web::Data<Arc<ServerState>>) -> Result<Json<GetInferenceJobStatusSuccessResponse>, GetInferenceJobStatusError>
{
if path.token.as_str().trim() == "None" {
// NB: A bunch of Python clients use our API and can fail in this manner.
@@ -231,20 +231,10 @@ pub async fn get_inference_job_status_handler(
let record_for_response = record_to_payload(
record, maybe_extra_status_description);
let response = GetInferenceJobStatusSuccessResponse {
Ok(Json(GetInferenceJobStatusSuccessResponse {
success: true,
state: record_for_response,
};
let body = serde_json::to_string(&response)
.map_err(|e| {
error!("error returning response: {:?}", e);
GetInferenceJobStatusError::ServerError
})?;
Ok(HttpResponse::Ok()
.content_type("application/json")
.body(body))
}))
}
fn record_to_payload(
@@ -5,7 +5,7 @@ use std::sync::Arc;
use actix_web::{HttpMessage, HttpRequest, HttpResponse, web};
use actix_web::error::ResponseError;
use actix_web::http::StatusCode;
use actix_web::web::Path;
use actix_web::web::{Json, Path};
use actix_web_lab::extract::Query;
use chrono::{DateTime, Duration, Utc};
use log::{error, warn};
@@ -188,8 +188,9 @@ impl fmt::Display for ListSessionJobsError {
pub async fn list_session_jobs_handler(
http_request: HttpRequest,
query: Query<ListSessionJobsQueryParams>,
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, ListSessionJobsError>
{
server_state: web::Data<Arc<ServerState>>
) -> Result<Json<ListSessionJobsSuccessResponse>, ListSessionJobsError> {
let mut mysql_connection = server_state.mysql_pool
.acquire()
.await
@@ -277,7 +278,7 @@ pub async fn list_session_jobs_handler(
records_to_response(records)
}
fn records_to_response(records: Vec<GenericInferenceJobStatus>) -> Result<HttpResponse, ListSessionJobsError> {
fn records_to_response(records: Vec<GenericInferenceJobStatus>) -> Result<Json<ListSessionJobsSuccessResponse>, ListSessionJobsError> {
let mut records = records.into_iter()
.map(|record| {
db_record_to_response_payload(record, None)
@@ -296,20 +297,10 @@ fn records_to_response(records: Vec<GenericInferenceJobStatus>) -> Result<HttpRe
success_count <= 3
});
let response = ListSessionJobsSuccessResponse {
Ok(Json(ListSessionJobsSuccessResponse {
success: true,
jobs: records,
};
let body = serde_json::to_string(&response)
.map_err(|e| {
error!("error returning response: {:?}", e);
ListSessionJobsError::ServerError
})?;
Ok(HttpResponse::Ok()
.content_type("application/json")
.body(body))
}))
}
fn db_record_to_response_payload(