From b862d59e65145dd72a4e315380db82af11fce96c Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 29 Jan 2026 18:08:03 -0500 Subject: [PATCH] feat(api): return 400 for database schema errors in V3 search - Updated api_crud_v3 and api_crud_v3_nested to detect 'database_schema' errors (like Unknown Column) and return a 400 Bad Request instead of a generic 500 Internal Server Error. - Added missing error handling for sql_select failure in get_child_obj_li. --- app/routers/api_crud_v3.py | 6 +++++- app/routers/api_crud_v3_nested.py | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/routers/api_crud_v3.py b/app/routers/api_crud_v3.py index e1c09b0..13e4edd 100644 --- a/app/routers/api_crud_v3.py +++ b/app/routers/api_crud_v3.py @@ -366,7 +366,11 @@ async def search_obj_li( if sql_result is False: # Standardized rich error bubbling db_err = format_db_error(get_last_sql_error()) - return mk_resp(data=False, status_code=500, response=response, status_message="Search failed due to database error.", details=db_err.dict()) + + # If it's a schema error (like Unknown Column), it's a 400 Bad Request + status_code = 400 if db_err.category == "database_schema" else 500 + + return mk_resp(data=False, status_code=status_code, response=response, status_message="Search failed due to database error.", details=db_err.dict()) if sql_result: resp_data_li = [base_name(**record).dict(by_alias=serialization.by_alias, exclude_unset=serialization.exclude_unset, exclude_defaults=serialization.exclude_defaults, exclude_none=serialization.exclude_none) for record in sql_result] diff --git a/app/routers/api_crud_v3_nested.py b/app/routers/api_crud_v3_nested.py index 3848498..b76a058 100644 --- a/app/routers/api_crud_v3_nested.py +++ b/app/routers/api_crud_v3_nested.py @@ -118,6 +118,15 @@ async def get_child_obj_li( as_list=True, ) + if sql_result is False: + # Standardized rich error bubbling + db_err = format_db_error(get_last_sql_error()) + + # If it's a schema error (like Unknown Column), it's a 400 Bad Request + status_code = 400 if db_err.category == "database_schema" else 500 + + return mk_resp(data=False, status_code=status_code, response=response, status_message="Search failed due to database error.", details=db_err.dict()) + if sql_result: resp_data_li = [base_name(**record).dict(by_alias=serialization.by_alias, exclude_unset=serialization.exclude_unset, exclude_defaults=serialization.exclude_defaults, exclude_none=serialization.exclude_none) for record in sql_result] return mk_resp(data=resp_data_li, response=response)