Files
OSIT-AE-API-FastAPI/app/routers/api_crud.py
2021-05-28 01:30:56 -04:00

538 lines
23 KiB
Python

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 app.config import settings
from app.db_sql import *
from ..models.response_model import *
from ..models.account_models import *
from ..models.account_cfg_model import *
from ..models.address_models import *
from ..models.archive_model import *
from ..models.archive_content_model import *
from ..models.contact_models import *
from ..models.event_models import *
from ..models.event_exhibit_models import *
from ..models.event_person_models import *
from ..models.event_registration_models import *
from ..models.membership_models import *
from ..models.order_model import *
from ..models.order_cart_model import *
from ..models.organization_models import *
from ..models.page_model import *
from ..models.person_models import *
from ..models.product_model import *
from ..models.post_model import *
from ..models.post_comment_model import *
from ..models.site_model import *
from ..models.site_domain_model import *
from ..models.user_models import *
from ..models.user_role_model import *
obj_type_li = {}
#obj_type_li['cfg_flask'] = {'table_name': 'cfg_flask', 'base_name': Cfg_Flask_Base}
#obj_type_li['api_client_token'] = {'table_name': 'api_client_token', 'base_name': Api_Client_Token_Base}
#obj_type_li['api_key'] = {'table_name': 'api_key', 'base_name': Api_Key_Base}
#obj_type_li['api_token'] = {'table_name': 'api_token', 'base_name': Api_Token_Base}
obj_type_li['account'] = {'table_name': 'account', 'base_name': Account_Base}
obj_type_li['account_cfg'] = {'table_name': 'v_account_cfg_detail', 'base_name': Account_Cfg_Base} # NOTE check view name: *_detail?
#obj_type_li['activity_log'] = {'table_name': 'activity_log', 'base_name': Activity_Log_Base}
obj_type_li['address'] = {'table_name': 'v_address', 'base_name': Address_Base}
obj_type_li['archive'] = {'table_name': 'v_archive', 'base_name': Archive_Base}
obj_type_li['archive_content'] = {'table_name': 'v_archive_content', 'base_name': Archive_Content_Base}
#obj_type_li['change_log'] = {'table_name': 'change_log', 'base_name': Change_Log_Base}
obj_type_li['contact'] = {'table_name': 'v_contact', 'base_name': Contact_Base}
#obj_type_li['cont_edu_cert'] = {'table_name': 'cont_edu_cert', 'base_name': Cont_Edu_Cert_Base}
obj_type_li['event'] = {'table_name': 'v_event', 'base_name': Event_Base}
#obj_type_li['event_badge'] = {'table_name': 'event_badge', 'base_name': Event_Badge_Base}
#obj_type_li['event_badge_log'] = {'table_name': 'event_badge_log', 'base_name': Event_Badge_Log_Base}
#obj_type_li['event_badge_template'] = {'table_name': 'event_badge_template', 'base_name': Event_Badge_Template_Base}
#obj_type_li['event_device'] = {'table_name': 'event_device', 'base_name': Event_Device_Base}
obj_type_li['event_exhibit'] = {'table_name': 'v_event_exhibit', 'base_name': Event_Exhibit_Base} # NOTE check view name: *_detail?
#obj_type_li['event_file'] = {'table_name': 'v_event_file', 'base_name': Event_File_Base} # Should this eventually be changed to event_hosted_file
#obj_type_li['event_location'] = {'table_name': 'v_event_location', 'base_name': Event_Location_Base}
#obj_type_li['event_presentation'] = {'table_name': 'v_event_presentation', 'base_name': Event_Presentation_Base}
#obj_type_li['event_presenter'] = {'table_name': 'v_event_presenter', 'base_name': Event_Presenter_Base}
obj_type_li['event_registration'] = {'table_name': 'v_event_registration', 'base_name': Event_Registration_Base}
#obj_type_li['event_session'] = {'table_name': 'v_event_session', 'base_name': Event_Session_Base}
#obj_type_li['event_track'] = {'table_name': 'v_event_track', 'base_name': Event_Track_Base}
#obj_type_li['hosted_file'] = {'table_name': 'hosted_file', 'base_name': Hosted_File_Base}
#obj_type_li['hosted_file_link'] = {'table_name': 'hosted_file_link', 'base_name': Hosted_File_Link_Base}
#obj_type_li['journal'] = {'table_name': 'v_journal', 'base_name': Journal_Base}
#obj_type_li['journal_entry'] = {'table_name': 'v_journal_entry', 'base_name': Journal_Entry_Base}
#obj_type_li['log'] = {'table_name': 'log', 'base_name': Log_Base} #'v_log'
#obj_type_li['log_client_viewing'] = {'table_name': 'log_client_viewing', 'base_name': Log_Client_Viewing_Base}
obj_type_li['membership'] = {'table_name': 'v_membership', 'base_name': Membership_Base}
obj_type_li['membership_cfg'] = {'table_name': 'v_membership_cfg', 'base_name': Membership_Cfg_Base}
#obj_type_li['message'] = {'table_name': 'message', 'base_name': Message_Base} #'v_message'
obj_type_li['order'] = {'table_name': 'v_order', 'base_name': Order_Base}
obj_type_li['order_cart'] = {'table_name': 'v_order_cart', 'base_name': Order_Cart_Base}
obj_type_li['order_cart_line'] = {'table_name': 'v_order_cart_line', 'base_name': Order_Cart_Line_Base}
obj_type_li['order_line'] = {'table_name': 'v_order_line', 'base_name': Order_Line_Base}
#obj_type_li['order_transaction'] = {'table_name': 'order_transaction', 'base_name': Order_Transaction_Base}
obj_type_li['organization'] = {'table_name': 'v_organization', 'base_name': Organization_Base}
obj_type_li['page'] = {'table_name': 'page', 'base_name': Page_Base}
obj_type_li['person'] = {'table_name': 'v_person', 'base_name': Person_Base}
obj_type_li['post'] = {'table_name': 'v_post_detail', 'base_name': Post_Base} # NOTE check view name: *_detail?
obj_type_li['post_comment'] = {'table_name': 'v_post_comment_detail', 'base_name': Post_Comment_Base} # NOTE check view name: *_detail?
obj_type_li['product'] = {'table_name': 'v_product', 'base_name': Product_Base}
obj_type_li['site'] = {'table_name': 'site', 'base_name': Site_Base}
obj_type_li['site_domain'] = {'table_name': 'v_site_domain', 'base_name': Site_Domain_Base} # NOTE check view name: *_detail?
obj_type_li['user'] = {'table_name': 'v_user', 'base_name': User_Base}
obj_type_li['user_role'] = {'table_name': 'v_user_role', 'base_name': User_Role_Base} # NOTE check view name: *_detail?
#obj_type_li['lu_country'] = {'table_name': 'lu_country', 'base_name': Lu_Country_Base}
#obj_type_li['lu_country_subdivision'] = {'table_name': 'lu_country_subdivision', 'base_name': Lu_Country_Subdivision_Base}
#obj_type_li['lu_education_degree'] = {'table_name': 'lu_education_degree', 'base_name': Lu_Education_Degree_Base}
#obj_type_li['lu_education_level'] = {'table_name': 'lu_education_level', 'base_name': Lu_Education_Level_Base}
#obj_type_li['lu_ethnicity'] = {'table_name': 'lu_ethnicity', 'base_name': Lu_Ethnicity_Base}
#obj_type_li['lu_file_purpose'] = {'table_name': 'lu_file_purpose', 'base_name': Lu_File_Purpose_Base}
#obj_type_li['lu_gender'] = {'table_name': 'lu_gender', 'base_name': Lu_Gender_Base}
#obj_type_li['lu_html_color'] = {'table_name': 'lu_html_color', 'base_name': Lu_Html_Color_Base}
#obj_type_li['lu_media_type'] = {'table_name': 'lu_media_type', 'base_name': Lu_Media_Type_Base}
#obj_type_li['lu_membership_status'] = {'table_name': 'lu_membership_status', 'base_name': Lu_Membership_Status_Base}
#obj_type_li['lu_membership_type'] = {'table_name': 'lu_membership_type', 'base_name': Lu_Membership_Type_Base}
#obj_type_li['lu_order_status'] = {'table_name': 'lu_order_status', 'base_name': Lu_Order_Status_Base}
#obj_type_li['lu_post_topic'] = {'table_name': 'lu_post_topic', 'base_name': Lu_Post_Topic_Base}
#obj_type_li['lu_product_type'] = {'table_name': 'lu_product_type', 'base_name': Lu_Product_Type_Base}
#obj_type_li['lu_pronoun'] = {'table_name': 'lu_pronoun', 'base_name': Lu_Pronoun_Base}
#obj_type_li['lu_race'] = {'table_name': 'lu_race', 'base_name': Lu_Race_Base}
#obj_type_li['lu_time_zone'] = {'table_name': 'v_lu_time_zone', 'base_name': Lu_Time_Zone_Base}
#obj_type_li['lu_user_role'] = {'table_name': 'lu_user_role', 'base_name': Lu_User_Role_Base}
#obj_type_li['lu_user_status'] = {'table_name': 'lu_user_status', 'base_name': Lu_User_Status_Base}
#obj_type_li['stripe_customer'] = {'table_name': 'stripe_customer', 'base_name': Stripe_Customer_Base}
#obj_type_li['stripe_log'] = {'table_name': 'stripe_log', 'base_name': Stipe_Log_Base}
# obj_type_li['c_idda_membership_profile'] = {'table_name': 'c_idda_membership_profile', 'base_name': C_Idda_Membership_Profile_Base}
# obj_type_li['c_osit_demo_membership_profile'] = {'table_name': 'c_osit_demo_membership_profile', 'base_name': C_Osit_Demo_Membership_Profile_Base}
router = APIRouter()
# Working on the basic API CRUD - STI 2021-03-08
@router.get('/{obj_type_l1}/list')
@router.get('/{obj_type_l1}/{obj_type_l2}/list')
@router.get('/{obj_type_l1}/{obj_type_l2}/{obj_type_l3}/list')
async def get_obj_li(
obj_type_l1: str=None,
obj_type_l2: str=None,
obj_type_l3: str=None,
#obj_id: str=None,
for_obj_type: Optional[str] = Query(None, max_length=50),
for_obj_id: Optional[str] = Query(None, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
debug_data = {}
debug_data['obj_type_l1'] = obj_type_l1
debug_data['obj_type_l2'] = obj_type_l2
debug_data['obj_type_l3'] = obj_type_l3
#debug_data['obj_id'] = obj_id
debug_data['for_obj_type'] = for_obj_type
debug_data['for_obj_id'] = for_obj_id
log.debug(debug_data)
if obj_type_l1 and obj_type_l2 and obj_type_l3:
obj_name = f'{obj_type_l1}_{obj_type_l2}_{obj_type_l3}'
if obj_name in obj_type_li:
pass
else:
return mk_resp(data=False, status_code=400)
elif obj_type_l1 and obj_type_l2:
obj_name = f'{obj_type_l1}_{obj_type_l2}'
if obj_name in obj_type_li:
pass
else:
return mk_resp(data=False, status_code=400)
elif obj_type_l1:
obj_name = f'{obj_type_l1}'
if obj_name in obj_type_li:
pass
else:
return mk_resp(data=False, status_code=400)
else:
log.warning('We should not be here')
return mk_resp(data=False, status_code=400)
table_name = obj_type_li[obj_name]['table_name']
if for_obj_type and for_obj_id:
for_obj_id = redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type)
#data = {}
#data[f'{for_obj_type}_id'] = for_obj_id
field_name = f'{for_obj_type}_id'
sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id)
else:
sql_result = sql_select(table_name=table_name)
log.debug(sql_result)
base_name = obj_type_li[obj_name]['base_name']
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)
#@router.get('/{obj_type_l1}/{obj_id_int}')
@router.get('/{obj_type_l1}/{obj_id}')
@router.get('/{obj_type_l1}/{obj_type_l2}/{obj_id}')
@router.get('/{obj_type_l1}/{obj_type_l2}/{obj_type_l3}/{obj_id}')
async def get_obj(
obj_type_l1: str=None,
obj_type_l2: str=None,
obj_type_l3: str=None,
obj_id: str=None,
for_obj_type: Optional[str] = Query(None, max_length=50),
for_obj_id: Optional[str] = Query(None, max_length=22),
x_account_id: str = Header(...),
qry_str: Optional[str] = Query(None, max_length=50),
qry_int: Optional[int] = None,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
):
"""
Simple select object type with an ID:
- **obj_type_l1, obj_type_l2, obj_type_l3**:
- Examples:
- /account = account
- /user = user
- /user/role = user_role
- /event = event
- /event/exhibit = event_exhibit
- /order = order
- /order/cart = order_cart
- /order/cart/line = order_cart_line
- /lu/some_lookup = lu_some_lookup
"""
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
debug_data = {}
debug_data['obj_type_l1'] = obj_type_l1
debug_data['obj_type_l2'] = obj_type_l2
debug_data['obj_type_l3'] = obj_type_l3
debug_data['obj_id'] = obj_id
debug_data['for_obj_type'] = for_obj_type
debug_data['for_obj_id'] = for_obj_id
log.debug(debug_data)
if obj_type_l1 and obj_type_l2 and obj_type_l3:
obj_name = f'{obj_type_l1}_{obj_type_l2}_{obj_type_l3}'
if obj_name in obj_type_li:
#table_name = obj_type_li[obj_name]
#table_name = obj_type_li[obj_name]['table_name']
pass
else:
return mk_resp(data=False, status_code=400)
elif obj_type_l1 and obj_type_l2:
obj_name = f'{obj_type_l1}_{obj_type_l2}'
if obj_name in obj_type_li:
#table_name = obj_type_li[obj_name]['table_name']
pass
else:
return mk_resp(data=False, status_code=400)
elif obj_type_l1:
obj_name = f'{obj_type_l1}'
if obj_name in obj_type_li:
#table_name = obj_type_li[obj_name]['table_name']
pass
else:
return mk_resp(data=False, status_code=400)
else:
log.warning('We should not be here')
return mk_resp(data=False, status_code=400)
table_name = obj_type_li[obj_name]['table_name']
# NOTE: Add a check for the object ID... assuming it is a random ID string for now.
if sql_result := sql_select(table_name=table_name, record_id_random=obj_id):
log.debug(sql_result)
base_name = obj_type_li[obj_name]['base_name']
resp_data = base_name(**sql_result).dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=resp_data) #, details=debug_data)
else:
log.debug(sql_result)
return mk_resp(data=False, status_code=404)
@router.delete('/{obj_type_l1}/{obj_id}')
@router.delete('/{obj_type_l1}/{obj_type_l2}/{obj_id}')
@router.delete('/{obj_type_l1}/{obj_type_l2}/{obj_type_l3}/{obj_id}')
async def delete_obj(
obj_type_l1: str=None,
obj_type_l2: str=None,
obj_type_l3: str=None,
obj_id: str=None,
x_account_id: str = Header(...),
):
"""
Simple delete object type with an ID:
- **obj_type_l1, obj_type_l2, obj_type_l3**:
- Examples:
- /account = account
- /user = user
- /user/role = user_role
- /event = event
- /event/exhibit = event_exhibit
- /order = order
- /order/cart = order_cart
- /order/cart/line = order_cart_line
- /lu/some_lookup = lu_some_lookup
"""
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
debug_data = {}
debug_data['obj_type_l1'] = obj_type_l1
debug_data['obj_type_l2'] = obj_type_l2
debug_data['obj_type_l3'] = obj_type_l3
debug_data['obj_id'] = obj_id
log.debug(debug_data)
if obj_type_l1 and obj_type_l2 and obj_type_l3:
obj_name = f'{obj_type_l1}_{obj_type_l2}_{obj_type_l3}'
if obj_name in obj_type_li:
pass
else:
return mk_resp(data=False, status_code=400)
elif obj_type_l1 and obj_type_l2:
obj_name = f'{obj_type_l1}_{obj_type_l2}'
if obj_name in obj_type_li:
pass
else:
return mk_resp(data=False, status_code=400)
elif obj_type_l1:
obj_name = f'{obj_type_l1}'
if obj_name in obj_type_li:
pass
else:
return mk_resp(data=False, status_code=400)
else:
log.warning('We should not be here')
return mk_resp(data=False, status_code=400)
table_name = obj_name # obj_type_li[obj_name]['table_name'] # NOTE: Don't try to use the view!
# NOTE: Add a check for the object ID... assuming it is a random ID string for now.
sql_result = sql_delete(table_name=table_name, record_id_random=obj_id)
log.debug(sql_result)
resp_data = True
return mk_resp(data=resp_data) #, details=debug_data)
def post_obj_template(
obj_type:str=None,
data:dict=None,
return_obj:bool=True,
by_alias:bool=True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_data_dict = data
obj_data = lookup_id_random_pop(obj_data_dict)
table_name_insert = obj_type
table_name_select = obj_type_li[obj_type]['table_name']
base_name = obj_type_li[obj_type]['base_name']
if sql_insert_result := sql_insert(table_name=table_name_insert, data=obj_data):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(sql_insert_result)
obj_id = sql_insert_result
else:
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(sql_insert_result)
return mk_resp(data=False, status_code=400)
if sql_select_result := sql_select(table_name=table_name_select, record_id=obj_id):
log.debug(sql_select_result)
resp_data = base_name(**sql_select_result).dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=resp_data)
else:
log.debug(sql_select_result)
return mk_resp(data=False, status_code=404)
def patch_obj_template(
obj_type:str=None,
data:dict=None,
obj_id:str=None,
return_obj:bool=True,
by_alias:bool=True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_data_dict = data
#obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id # NOTE: Adding this in so the id_random is NOT updated
log.debug(obj_data_dict)
obj_data = lookup_id_random_pop(obj_data_dict)
table_name_update = obj_type
table_name_select = obj_type_li[obj_type]['table_name']
base_name = obj_type_li[obj_type]['base_name']
if sql_update_result := sql_update(table_name=table_name_update, data=obj_data):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(sql_update_result)
#obj_id = sql_update_result
obj_id = obj_data_dict['id']
else:
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(sql_update_result)
return mk_resp(data=False, status_code=400)
if sql_select_result := sql_select(table_name=table_name_select, record_id=obj_id):
log.debug(sql_select_result)
resp_data = base_name(**sql_select_result).dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=resp_data)
else:
log.debug(sql_select_result)
return mk_resp(data=False, status_code=404)
def get_obj_li_template(
obj_type: str = Query(None, max_length=50),
for_obj_type: Optional[str] = Query(None, max_length=50),
for_obj_id: Optional[Union[int,str]] = None,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if isinstance(for_obj_id, int):
pass
elif isinstance(for_obj_id, str):
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)
table_name_select = obj_type_li[obj_type]['table_name']
if for_obj_type and for_obj_id:
field_name = f'{for_obj_type}_id'
sql_result = sql_select(table_name=table_name_select, field_name=field_name, field_value=for_obj_id)
else:
sql_result = sql_select(table_name=table_name_select)
log.debug(sql_result)
base_name = obj_type_li[obj_type]['base_name']
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)
def get_obj_template(
obj_type: str = Query(None, max_length=50),
obj_id: Optional[Union[int,str]] = None,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if isinstance(obj_id, int):
pass
elif isinstance(obj_id, str):
obj_id_random = obj_id
obj_id = redis_lookup_id_random(record_id_random=obj_id_random, table_name=obj_type)
table_name_select = obj_type_li[obj_type]['table_name']
if obj_id:
sql_result = sql_select(table_name=table_name_select, record_id=obj_id)
else:
return mk_resp(data=False, status_code=400)
if sql_result:
log.debug(sql_result)
base_name = obj_type_li[obj_type]['base_name']
resp_data = base_name(**sql_result).dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=resp_data)
else:
log.debug(sql_result)
return mk_resp(data=False, status_code=404)
def delete_obj_template(
obj_type: str = Query(None, max_length=50),
obj_id: str = Query(None, max_length=22),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
debug_data = {}
debug_data['obj_type'] = obj_type
debug_data['obj_id'] = obj_id
log.debug(debug_data)
table_name_delete = obj_type # NOTE: Not using the table name from the object type list because it may be a view (v_*).
# NOTE: Add a check for the object ID... assuming it is a random ID string for now.
if sql_result := sql_delete(table_name=table_name_delete, record_id_random=obj_id):
log.debug(sql_result)
return mk_resp(data=True)
else:
log.debug(sql_result)
return mk_resp(data=False, status_code=404)