From fe71a7be332899e6e93f88122df451f752bf1d83 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 25 Jul 2023 18:29:07 -0400 Subject: [PATCH] API CRUD functions can now handle sorting. And headers are now handled a little better. --- app/db_sql.py | 32 +++++++++++++++++++++++++++++++- app/routers/api_crud.py | 19 +++++++++++++++---- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/app/db_sql.py b/app/db_sql.py index c793e0d..5c560c6 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -535,6 +535,7 @@ def sql_select( field_value = None, enabled: str|None = None, # enabled, disabled, all hidden: str|None = None, # hidden, not_hidden, all + order_by_li: dict|None = None, # {"the_field_name": "DESC"} limit: int = 9999999, offset: int = 0, sql: str|None = None, @@ -543,7 +544,7 @@ def sql_select( as_dict: bool|None = True, as_list: bool|None = False, max_count: int = 100000, - log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log_lvl: int = logging.DEBUG, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL ) -> None|bool|dict|list: log.setLevel(log_lvl) @@ -553,6 +554,30 @@ def sql_select( else: sql_limit_offset = '' + sql_order_by = '' + # order_by_li = {'created_on': 'DESC', 'updated_on': 'DESC'} + log.debug(order_by_li) + if order_by_li and isinstance(order_by_li, dict): # This should be a list + order_by_str_li = [] + for key, value in order_by_li.items(): + order_by_str_li.append(f'`{table_name}`.`{key}` {value}') + + # log.debug(order_by_str_li) + + # if isinstance(value, dict) or isinstance(value, list): + # data[key] = json.dumps(value) + + log.debug(order_by_str_li) + + order_by_string = ', '.join(order_by_str_li) + sql_order_by = f'ORDER BY {order_by_string}' + else: + sql_order_by = '' + log.debug(sql_order_by) + + + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + # if enabled: # sql_enabled = sql_enable_part(table_name=table_name, enabled=enabled) # Reasonably safe return str # else: @@ -594,6 +619,7 @@ def sql_select( f""" SELECT * FROM `{table_name}` + {sql_order_by} {sql_limit_offset} ; """ @@ -610,6 +636,7 @@ def sql_select( SELECT * FROM `{table_name}` WHERE `{table_name}`.id = :record_id + {sql_order_by} {sql_limit_offset} ; """ @@ -622,6 +649,7 @@ def sql_select( SELECT * FROM `{table_name}` WHERE `{table_name}`.id_random = :record_id_random + {sql_order_by} {sql_limit_offset} ; """ @@ -665,6 +693,7 @@ def sql_select( WHERE `{table_name}`.{field_name} = :{field_name} {sql_enabled} {sql_hidden} + {sql_order_by} {sql_limit_offset} ; """ @@ -691,6 +720,7 @@ def sql_select( SELECT * FROM `{table_name}` WHERE {sql_where_string} + {sql_order_by} {sql_limit_offset} ; """ diff --git a/app/routers/api_crud.py b/app/routers/api_crud.py index d8c38af..422a129 100644 --- a/app/routers/api_crud.py +++ b/app/routers/api_crud.py @@ -1,4 +1,4 @@ -import datetime, time +import datetime, json, time #from datetime import datetime, time, timedelta from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status from pydantic import BaseModel, EmailStr, Field @@ -175,6 +175,12 @@ async def get_obj_li( enabled: str = 'enabled', hidden: str = 'not_hidden', # hidden, not_hidden, all, + # order_by_li: dict = None, + order_by_li: str = Header(None), + dh_order_by_li: str = Header(None), + dh_testing: str = Header(None), + h_order_by_li: str = Header(None), + h_testing: str = Header(None), limit: int = 10000, offset: int = 0, @@ -187,9 +193,12 @@ async def get_obj_li( response: Response = Response, # commons: Common_Route_Params = Depends(common_route_params), # Switch to this later... sooner ): - log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) + if order_by_li: + order_by_li = json.loads(order_by_li) + debug_data = {} debug_data['obj_type_l1'] = obj_type_l1 debug_data['obj_type_l2'] = obj_type_l2 @@ -197,6 +206,7 @@ async def get_obj_li( #debug_data['obj_id'] = obj_id debug_data['for_obj_type'] = for_obj_type debug_data['for_obj_id'] = for_obj_id + debug_data['order_by_li'] = order_by_li log.debug(debug_data) @@ -231,12 +241,13 @@ async def get_obj_li( field_name = f'{for_obj_type}_id' # NOTE: The enabled and hidden parameters are new to this endpoint and the sql_select function! -2023-07-06 - sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id, enabled=enabled, hidden=hidden, limit=limit, offset=offset) + sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id, enabled=enabled, hidden=hidden, order_by_li=order_by_li, limit=limit, offset=offset) else: # NOTE: The enabled and hidden parameters are new to this endpoint and the sql_select function! -2023-07-06 # NOTE: This call (without field_name, field_value, limit, offset) may need more testing. - sql_result = sql_select(table_name=table_name, enabled=enabled, hidden=hidden, limit=limit, offset=offset) + sql_result = sql_select(table_name=table_name, enabled=enabled, hidden=hidden, order_by_li=order_by_li, limit=limit, offset=offset) + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(sql_result) base_name = obj_type_li[obj_name]['base_name']