Files
OSIT-AE-API-FastAPI/app/routers/membership_person.py
2022-01-11 12:00:33 -05:00

525 lines
26 KiB
Python

import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging, common_route_params, Common_Route_Params
from app.config import settings
from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.membership_person_methods import create_membership_person_obj, get_membership_person_rec_list, load_membership_person_obj, update_membership_person_obj
from app.models.membership_person_models import Membership_Person_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# @router.post('/membership/person', response_model=Resp_Body_Base)
# async def post_membership_person_obj(
# obj: Membership_Person_Base,
# return_obj: Optional[bool] = True,
# commons: Common_Route_Params = Depends(common_route_params),
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# obj_type = 'membership_person'
# 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
# ### BEGIN ### API Membership Person ### post_membership_person_obj() ###
# Using create_membership_person_obj()
# Updated 2022-01-04
@router.post('/membership/person', response_model=Resp_Body_Base)
async def post_membership_person_obj(
membership_person_obj: Membership_Person_Base,
person_id: str = Query(None, min_length=11, max_length=22),
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
inc_membership_cfg: bool = False,
inc_membership_group_list: bool = False, # List of membership group for a person - 2022-01-11
inc_membership_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_type: bool = False, # Primary membership type for a person - 2022-01-11
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
person_id = membership_person_obj.person_id
person_id_random = membership_person_obj.person_id_random
log.debug(f'Person ID: {person_id}, Person ID Random: {person_id_random}')
# ### SECTION ### Secondary data validation
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
elif person_id is None: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The person ID was invalid or not found.')
# ### SECTION ### Process data
if create_membership_person_obj_result := create_membership_person_obj(
account_id = commons.x_account_id,
person_id = person_id,
membership_person_dict_obj = membership_person_obj,
): pass
else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The membership person was not created. Check the field names and data types.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_membership_person_obj_result := load_membership_person_obj(
membership_person_id = membership_person_id,
enabled = commons.enabled,
):
data = load_membership_person_obj_result
else:
data = False
return mk_resp(data=data, response=commons.response, status_message='The membership person was probably created, but there was a problem returning the data.')
else:
membership_person_id_random = get_id_random(record_id=membership_person_id, table_name='membership_person')
data = {}
data['membership_person_id'] = membership_person_id
data['membership_person_id_random'] = membership_person_id_random
return mk_resp(data=data, response=commons.response)
# if isinstance(create_membership_person_obj_result, int):
# membership_person_id = create_membership_person_obj_result
# if return_obj:
# if load_membership_person_obj_result := load_membership_person_obj(
# membership_person_id = membership_person_id,
# enabled = commons.enabled,
# ):
# data = load_membership_person_obj_result
# else:
# data = False
# return mk_resp(data=data, response=commons.response, status_message='The membership person was probably created, but there was a problem returning the data.')
# else:
# membership_person_id = create_membership_person_obj_result
# membership_person_id_random = get_id_random(record_id=membership_person_id, table_name='membership_person')
# data = {}
# data['membership_person_id'] = membership_person_id
# data['membership_person_id_random'] = membership_person_id_random
# return mk_resp(data=data, response=commons.response, status_message='The membership person was created.')
# else:
# return mk_resp(data=False, status_code=400, response=commons.response, status_message='The result from trying to create a membership person was unexpected.')
# ### BEGIN ### API Membership Person ### post_membership_person_obj() ###
# @router.patch('/membership/person/{obj_id}', response_model=Resp_Body_Base)
# async def patch_membership_person_obj(
# obj_id: str = Query(..., min_length=11, max_length=22),
# obj: Membership_Person_Base = None,
# return_obj: Optional[bool] = True,
# commons: Common_Route_Params = Depends(common_route_params),
# ):
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# obj_type = 'membership_person'
# 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
# ### BEGIN ### API Membership Person ### patch_membership_person_obj_update() ###
# Using update_membership_person_obj()
# Updated 2022-01-04
@router.patch('/membership/person/{membership_person_id}', response_model=Resp_Body_Base)
async def patch_membership_person_obj_update(
membership_person_obj: Membership_Person_Base,
membership_person_id: Optional[str] = Query(..., min_length=11, max_length=22),
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
inc_membership_cfg: bool = False,
inc_membership_group_list: bool = False, # List of membership group for a person - 2022-01-11
inc_membership_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_type: bool = False, # Primary membership type for a person - 2022-01-11
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
log.debug(f'Membership Person ID: {membership_person_id}')
membership_person_id_random = membership_person_id # This is used later for the response data
if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=False, status_code=404, response=commons.response, status_message='The membership person ID was invalid or not found.') # Not Found
# ### SECTION ### Process data
if update_membership_person_obj_result := update_membership_person_obj(
membership_person_id = membership_person_id,
membership_person_dict_obj = membership_person_obj,
): pass
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response, status_message='The membership person was not updated. Check the field names and data types.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_membership_person_obj_result := load_membership_person_obj(
membership_person_id = membership_person_id,
enabled = commons.enabled,
):
data = load_membership_person_obj_result
else:
data = False
return mk_resp(data=data, response=commons.response, status_message='The membership person was probably updated, but there was a problem returning the data.')
else:
data = {}
data['membership_person_id'] = membership_person_id
data['membership_person_id_random'] = membership_person_id_random
return mk_resp(data=data, response=commons.response, status_message='The membership person was updated.')
# ### BEGIN ### API Membership Person ### patch_membership_person_obj_update() ###
# @router.get('/membership/person/list', response_model=Resp_Body_Base)
# async def get_membership_person_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),
# commons: Common_Route_Params = Depends(common_route_params),
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# obj_type = 'membership_person'
# 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
# ### BEGIN ### API Membership Person ### get_account_obj_membership_person_list() ###
# Working well as of 2021-06-24. Using as a template for other routes.
@router.get('/account/{account_id}/membership/person/list', response_model=Resp_Body_Base)
async def get_account_obj_membership_person_list(
account_id: str = Query(..., min_length=1, max_length=22),
# inc_account_cfg: bool = False,
# inc_address: bool = False, # Under contact
# inc_contact: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False,
inc_membership_group_list: bool = False, # List of membership group for a person - 2022-01-11
# inc_membership_person: bool = False,
# inc_membership_person_list: bool = False,
# inc_membership_person_profile: bool = False,
# inc_membership_person_profile_cust: bool = False,
inc_membership_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_type: bool = False, # Primary membership type for a person - 2022-01-11
# inc_membership_type_list: bool = False,
# inc_order: bool = False,
# inc_organization: bool = False,
# inc_person: bool = False,
# inc_product: bool = False,
# inc_product_list: bool = False,
# inc_user: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
response_data = None
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-06-23
if membership_person_rec_list_result := get_membership_person_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = commons.limit,
enabled = commons.enabled,
):
membership_person_result_list = []
for membership_person_rec in membership_person_rec_list_result:
if load_membership_person_result := load_membership_person_obj(
membership_person_id = membership_person_rec.get('membership_person_id', None),
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
# model_as_dict = commons.model_as_dict,
enabled = commons.enabled,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
# inc_membership_group_person_list = inc_membership_group_person_list,
# inc_membership_person = inc_membership_person,
# inc_membership_person_list = inc_membership_person_list,
inc_membership_profile = inc_membership_profile,
inc_membership_type = inc_membership_type,
# inc_order = inc_order,
# inc_organization = inc_organization,
# inc_person = inc_person,
# inc_product = inc_product,
# inc_product_list = inc_product_list,
# inc_user = inc_user,
):
membership_person_result_list.append(load_membership_person_result)
else:
membership_person_result_list.append(None)
response_data = membership_person_result_list
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Membership Person ### get_account_obj_membership_person_list() ###
# ### BEGIN ### API Membership Person ### get_person_obj_membership_person() ###
# Updated 2022-01-10
@router.get('/person/{person_id}/membership/person', response_model=Resp_Body_Base)
async def get_person_obj_membership_person(
person_id: str = Query(..., min_length=11, max_length=22),
# inc_address: bool = False, # Per member
# inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False, # The primary membership group for a person
inc_membership_group_list: bool = False, # List of membership group for a person - 2022-01-11
# inc_membership_group_person_list: bool = False,
# inc_membership_person_profile_cust: bool = False, # Extended profile?
inc_membership_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_type: bool = False, # Primary membership type for a person - 2022-01-11
# inc_membership_type_list: bool = False, # The list of all membership types a person is a part of
# inc_membership_type_person: bool = False,
# inc_order: bool = False,
# inc_organization: bool = False,
# inc_product: bool = False, # The product the person actually purchased for a member_type or member_group
# inc_product_list: bool = False, # The list of products that give access to a member_type or member_group
# inc_user: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if membership_person_rec := sql_select(table_name='membership_person', field_name='person_id', field_value=person_id): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
log.debug(membership_person_rec)
membership_person_id = membership_person_rec.get('id') # 'membership_person_id' is using the view
log.debug(membership_person_id)
if membership_person_rec_result := load_membership_person_obj(
membership_person_id = membership_person_id,
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
enabled = commons.enabled,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list, # List of membership group for a person - 2022-01-11
inc_membership_profile = inc_membership_profile, # Membership profile for a person - 2022-01-11
inc_membership_type = Fainc_membership_typelse, # Primary membership type for a person - 2022-01-11
):
response_data = membership_person_rec_result
elif membership_person_rec_result is None: # Empty dict or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Membership Person ### get_person_obj_membership_person() ###
# Look up is only for account, person, or user records
@router.get('/membership/person/lookup', response_model=Resp_Body_Base)
async def lookup_membership_person_obj(
for_obj_id: Union[int,str],
for_obj_type: str = Query(..., min_length=2, max_length=50),
inc_membership_cfg: bool = True,
inc_membership_group_list: bool = False, # List of membership group for a person - 2022-01-11
inc_membership_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_type: bool = False, # Primary membership type for a person - 2022-01-11
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
base_name = Membership_Person_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, response=commons.response) # 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 = """`membership_person`.account_id = :account_id"""
sql_limit = ''
as_list = True
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.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 = """`membership_person`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'membership_person' and for_obj_id:
data['membership_person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.id = :membership_person_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, response=commons.response) # Bad Request
sql = f"""
SELECT id AS 'membership_person_id', id_random AS 'membership_person_id_random'
FROM `membership_person` AS `membership_person`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
membership_person_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(membership_person_obj_result, dict):
membership_person_id = membership_person_obj_result.get('membership_person_id', None)
membership_person_obj = load_membership_person_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
inc_membership_profile = inc_membership_profile,
inc_membership_type = inc_membership_type,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
data = membership_person_obj
elif isinstance(membership_person_obj_result, list):
membership_person_obj_li = []
for membership_person_obj in membership_person_obj_result:
membership_person_id = membership_person_obj.get('membership_person_id', None)
membership_person_obj_li.append(
load_membership_person_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
inc_membership_profile = inc_membership_profile,
inc_membership_type = inc_membership_type,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
)
data = membership_person_obj_li
else:
log.debug(membership_person_obj_result)
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
return mk_resp(data=data, response=commons.response)
# ### BEGIN ### API Membership Person ### get_membership_person_obj() ###
# Updated 2022-01-10
@router.get('/membership/person/{membership_person_id}', response_model=Resp_Body_Base)
async def get_membership_person_obj(
membership_person_id: str = Query(..., min_length=11, max_length=22),
# inc_address: bool = False, # Per member
# inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False, # The primary membership group for a person
inc_membership_group_list: bool = False, # List of membership group for a person - 2022-01-11
# inc_membership_person_profile: bool = False,
# inc_membership_person_profile_cust: bool = False, # Extended profile?
inc_membership_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_type: bool = False, # Primary membership type for a person - 2022-01-11
# inc_membership_type_list: bool = False, # The list of all membership types a person is a part of
# inc_membership_type_person: bool = False,
# inc_order: bool = False,
# inc_organization: bool = False,
# inc_person: bool = False,
# inc_product: bool = False, # Per member or group member belongs to
# inc_product_list: bool = False,
# inc_user: bool = False, # Per member
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if membership_person_rec_result := load_membership_person_obj(
membership_person_id = membership_person_id,
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
# model_as_dict = commons.model_as_dict,
enabled = commons.enabled,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
# inc_membership_person_profile = inc_membership_person_profile,
# inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_membership_profile = inc_membership_profile,
inc_membership_type = inc_membership_type,
# inc_membership_type_list = inc_membership_type_list, # All the membership types they are a part of.
# inc_membership_type_person = inc_membership_type_person,
# inc_membership_type_person_list = inc_membership_type_list,
# inc_order = inc_order,
# inc_organization = inc_organization,
# inc_person = inc_person,
# inc_product = inc_product,
# inc_product_list = inc_product_list,
# inc_user = inc_user,
):
response_data = membership_person_rec_result
elif membership_person_rec_result is None: # Empty dict or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Membership Person ### get_membership_person_obj() ###
@router.delete('/membership/person/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_person_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result