diff --git a/app/models/order_cart_methods.py b/app/models/order_cart_methods.py new file mode 100644 index 0000000..d14f456 --- /dev/null +++ b/app/models/order_cart_methods.py @@ -0,0 +1,46 @@ +from __future__ import annotations +import datetime + +from typing import Dict, List, Optional, Set, Union +from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator + +from ..lib_general import * +from ..db_sql import sql_select + +from .order_cart_model import Order_Cart_Base + + +# ### BEGIN ### API Order Cart Methods ### load_order_cart_obj() ### +def load_order_cart_obj(order_cart_id:int|str=None, inc_order_cart_line_li=None, inc_order_cart_cfg=None): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if order_cart_id := redis_lookup_id_random(record_id_random=order_cart_id, table_name='order_cart'): pass + else: return False + + if order_cart_rec := sql_select(table_name='v_order_cart', record_id=order_cart_id): + #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(order_cart_rec) + + if inc_order_cart_line_li: + order_cart_line_data = {} + order_cart_line_data['order_cart_id'] = order_cart_id + if order_cart_line_rec_li := sql_select(table_name='v_order_cart_line', data=order_cart_line_data, as_list=True): + order_cart_rec['order_cart_line_list'] = order_cart_line_rec_li + + if inc_order_cart_cfg: + if order_cart_cfg_rec := sql_select(table_name='v_account_cfg_detail', field_name='account_id', field_value=order_cart_rec.get('account_id', None)): + order_cart_rec['cfg'] = order_cart_cfg_rec + + log.debug(order_cart_rec) + else: + return False + + try: + order_cart_obj = Order_Cart_Base(**order_cart_rec) + log.debug(order_cart_obj) + except ValidationError as e: + log.error(e.json()) + + return order_cart_obj +# ### END ### API Order Cart Methods ### load_order_cart_obj() ### diff --git a/app/routers/order_cart.py b/app/routers/order_cart.py index d327738..28567e8 100644 --- a/app/routers/order_cart.py +++ b/app/routers/order_cart.py @@ -12,6 +12,7 @@ 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_cart_model import Order_Cart_Base +from ..models.order_cart_methods import load_order_cart_obj from ..models.response_model import * @@ -90,6 +91,84 @@ async def get_order_cart_obj_li( return result +# Look up is only for account, order, person, or user records +@router.get('/lookup', response_model=Resp_Body_Base) +async def lookup_order_cart_obj( + for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50), + for_obj_id: Optional[Union[int,str]] = None, + inc_order_cart_line_li: Optional[bool] = True, + inc_order_cart_cfg: Optional[bool] = True, + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'order_cart' + base_name = Order_Cart_Base + + if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass + else: return mk_resp(data=False, status_code=404) # Not Found + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + + data = {} + as_list = False + if for_obj_type == 'account' and for_obj_id: + data['account_id'] = for_obj_id + sql_where_for_obj_type = """`order_cart`.account_id = :account_id""" + sql_limit = '' + as_list = True + elif for_obj_type == 'order' and for_obj_id: + data['order_id'] = for_obj_id + sql_where_for_obj_type = """`order_cart`.order_id = :order_id""" + sql_limit = 'LIMIT 1' + elif for_obj_type == 'person' and for_obj_id: + data['person_id'] = for_obj_id + sql_where_for_obj_type = """`order_cart`.person_id = :person_id""" + sql_limit = 'LIMIT 1' + elif for_obj_type == 'user' and for_obj_id: + data['user_id'] = for_obj_id + sql_where_for_obj_type = """`order_cart`.user_id = :user_id""" + sql_limit = 'LIMIT 1' + else: + log.debug(f'Object type={for_obj_type}; Object ID={for_obj_id}') + return mk_resp(data=False, status_code=400) # Bad Request + + sql = f""" + SELECT id AS 'order_cart_id', id_random AS 'order_cart_id_random' + FROM `order_cart` AS `order_cart` + WHERE {sql_where_for_obj_type} + {sql_limit} + """ + + # This will return a list if selecting by account ID + order_cart_obj_result = sql_select(data=data, sql=sql, as_list=as_list) + if isinstance(order_cart_obj_result, dict): + order_cart_id = order_cart_obj_result.get('order_cart_id', None) + order_cart_id_random = order_cart_obj_result.get('order_cart_id_random', None) + + if order_cart_obj := load_order_cart_obj(order_cart_id=order_cart_id, inc_order_cart_line_li=inc_order_cart_line_li, inc_order_cart_cfg=inc_order_cart_cfg): + data = order_cart_obj.dict(by_alias=True, exclude_unset=False) + return mk_resp(data=data) + else: + return mk_resp(data=False, status_code=404) # Not Found + elif isinstance(order_cart_obj_result, list): + order_cart_obj_li = [] + for order_cart_obj in order_cart_obj_result: + order_cart_id = order_cart_obj.get('order_cart_id', None) + order_cart_obj_li.append( + load_order_cart_obj( + order_cart_id=order_cart_id, inc_order_cart_line_li=inc_order_cart_line_li, inc_order_cart_cfg=inc_order_cart_cfg + ) + ) + data = order_cart_obj_li + return mk_resp(data=data) + else: + log.debug(order_cart_obj_result) + return mk_resp(data=False, status_code=404) # Not Found + + @router.get('/{obj_id}', response_model=Resp_Body_Base) async def get_order_cart_obj( obj_id: str = Query(..., min_length=1, max_length=22), diff --git a/app/routers/product.py b/app/routers/product.py index 4dac26f..8954bac 100644 --- a/app/routers/product.py +++ b/app/routers/product.py @@ -72,6 +72,7 @@ async def patch_product_obj( async def get_product_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), + prod_type: Optional[str] = Query(None, min_length=2, max_length=50), x_account_id: str = Header(...), by_alias: Optional[bool] = True, exclude_unset: Optional[bool] = True, @@ -80,14 +81,43 @@ async def get_product_obj_li( log.debug(locals()) obj_type = 'product' - 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 + base_name = Product_Base + data = {} + + if for_obj_type == 'account' and for_obj_id: + for_obj_id_random = for_obj_id + for_obj_id = redis_lookup_id_random(record_id_random=for_obj_id_random, table_name=for_obj_type) + + data['for_obj_type'] = for_obj_type + data['for_obj_id'] = for_obj_id + data['for_obj_id_random'] = for_obj_id_random + + sql_for_obj_type = f"""`product`.account_id = :for_obj_id""" + else: sql_for_obj_type = '' + + if prod_type in ['event', 'event option', 'membership', 'fundraising']: + data['type_name'] = prod_type + + sql_product_type = f"""AND product.type_name = :type_name""" + else: sql_product_type = '' + + sql = f""" + SELECT * + FROM `v_product` AS product + WHERE {sql_for_obj_type} + {sql_product_type} + """ + + 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) diff --git a/app/routers/site_domain.py b/app/routers/site_domain.py index 45fdc25..ab41c55 100644 --- a/app/routers/site_domain.py +++ b/app/routers/site_domain.py @@ -71,7 +71,7 @@ async def patch_site_domain_obj( @router.get('/lookup_fqdn', response_model=Resp_Body_Base) -async def get_site_domain_obj( +async def lookup_site_domain_obj( fqdn: str, access_key: Optional[str] = None, referrer: Optional[str] = None,