import datetime #from datetime import datetime, time, timedelta from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status from pydantic import BaseModel, EmailStr, Field from typing import Dict, List, Optional, Set, Union from ..lib_general import * from ..log import * from app.config import settings from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template from ..models.order_model import Order_Base from ..models.response_model import * router = APIRouter() @router.post('', response_model=Resp_Body_Base) async def post_order_obj( obj: Order_Base, x_account_id: str = Header(...), return_obj: Optional[bool] = True, by_alias: Optional[bool] = True, exclude_unset: Optional[bool] = True, ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'order' obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) result = post_obj_template( obj_type=obj_type, data=obj_data_dict, return_obj=True, by_alias=True, exclude_unset=True, ) return result @router.patch('/{obj_id}', response_model=Resp_Body_Base) async def patch_order_obj( obj_id: str = Query(..., min_length=1, max_length=22), obj: Order_Base = None, x_account_id: Optional[str] = Header(..., ), return_obj: Optional[bool] = True, by_alias: Optional[bool] = True, exclude_unset: Optional[bool] = True, ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'order' obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type) obj_data_dict['id_random'] = obj_id result = patch_obj_template( obj_type=obj_type, data=obj_data_dict, obj_id=obj_id, return_obj=True, by_alias=True, exclude_unset=True, ) return result @router.get('/list', response_model=Resp_Body_Base) async def get_order_obj_li( for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50), for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22), order_status: Optional[str] = 'complete', x_account_id: str = Header(...), by_alias: Optional[bool] = True, exclude_unset: Optional[bool] = True, ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'order' result = get_obj_li_template( obj_type=obj_type, for_obj_type=for_obj_type, for_obj_id=for_obj_id, by_alias=True, exclude_unset=True, ) return result person_id = redis_lookup_id_random(record_id_random=person_id_random, table_name='person') data = {} data['person_id'] = person_id if obj_type == 'person': # and check there is an ID as well! sql_account_person_user = f"""`order`.person_id = :person_id""" if order_status: data['status'] = order_status sql_status = f"""AND `order`.status = :status""" else: sql_status = '' # if from_datetime and to_datetime: # data['from_datetime'] = from_datetime # data['to_datetime'] = to_datetime # sql_from_to_datetime = f"""AND `order`.created_on >= :from_datetime AND `order`.created_on <= :to_datetime""" # elif from_datetime: # data['from_datetime'] = from_datetime # sql_from_to_datetime = f"""AND `order`.created_on >= :from_datetime""" # elif to_datetime: # data['to_datetime'] = to_datetime # sql_from_to_datetime = f"""AND `order`.created_on <= :to_datetime""" # else: # sql_from_to_datetime = '' if limit := request.args.get('limit', default=None, type=int): data['limit'] = limit sql_limit = f"""LIMIT :limit""" else: sql_limit = '' sql = f""" SELECT `order`.id AS 'order_id', `order`.id_random AS 'order_id_random' FROM `order` AS `order` WHERE {sql_account_person_user} {sql_status} /*{sql_from_to_datetime}*/ ORDER BY `order`.created_on DESC, `order`.updated_on DESC {sql_limit}; """ if sql_result := sql_select(data=data, sql=sql, as_list=True): resp_data_li = [] for record in sql_result: resp_data = base_name(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset) resp_data_li.append(resp_data) return mk_resp(data=resp_data_li) else: log.debug(sql_result) return mk_resp(data=False, status_code=404) @router.get('/{obj_id}', response_model=Resp_Body_Base) async def get_order_obj( obj_id: str = Query(..., min_length=1, max_length=22), x_account_id: str = Header(...), by_alias: Optional[bool] = True, exclude_unset: Optional[bool] = True, ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'order' result = get_obj_template( obj_type=obj_type, obj_id=obj_id, by_alias=True, exclude_unset=True, ) return result @router.delete('/{obj_id}', response_model=Resp_Body_Base) async def delete_order_obj( obj_id: str = Query(..., min_length=1, max_length=22), x_account_id: str = Header(...), ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'order' result = delete_obj_template( obj_type=obj_type, obj_id=obj_id, ) return result