Files
OSIT-AE-API-FastAPI/app/routers/membership_group.py
2021-08-10 19:06:40 -04:00

321 lines
13 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
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_group_methods import get_membership_group_rec_list, load_membership_group_obj
from app.models.membership_group_models import Membership_Group_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/group', response_model=Resp_Body_Base)
async def post_membership_group_obj(
obj: Membership_Group_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
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('/membership/group/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_group_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
obj: Membership_Group_Base = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
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('/membership/group/list', response_model=Resp_Body_Base)
async def get_membership_group_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),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
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 Group Methods ### get_account_membership_group_obj_li() ###
# Updated 2021-07-01
@router.get('/account/{account_id}/membership/group/list', response_model=Resp_Body_Base)
async def get_account_membership_group_obj_li(
account_id: str = Query(..., min_length=1, max_length=22),
# product_id: Optional[str] = Query(None, min_length=1, max_length=22),
# type_level: Optional[int] = None,
enabled: str = 'enabled',
limit: int = 1000,
inc_address: bool = False,
inc_contact: bool = False,
inc_membership_cfg: bool = False,
inc_membership_group_person_list: bool = False,
inc_organization: bool = False,
inc_person: bool = False,
inc_product_list: bool = False,
inc_user: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # 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)
# Updated 2021-07-01
if membership_group_rec_list_result := get_membership_group_rec_list(
account_id = account_id,
# product_id = product_id,
# type_level = type_level,
limit = limit,
enabled = enabled,
):
membership_group_result_list = []
for membership_group_rec in membership_group_rec_list_result:
if load_membership_group_result := load_membership_group_obj(
membership_group_id = membership_group_rec.get('membership_group_id', None),
enabled = enabled,
limit = limit,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_person_list = inc_membership_group_person_list,
inc_organization = inc_organization,
inc_person = inc_person,
inc_product_list = inc_product_list,
inc_user = inc_user,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
membership_group_result_list.append(load_membership_group_result)
else:
membership_group_result_list.append(None)
response_data = membership_group_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Group Methods ### get_account_membership_group_obj_li() ###
# Look up is only for account, person, or user records
@router.get('/membership/group/lookup', response_model=Resp_Body_Base)
async def lookup_membership_group_obj(
for_obj_id: Union[int,str],
for_obj_type: str = Query(..., min_length=2, max_length=50),
x_account_id: str = Header(...),
inc_membership_person_profile: bool = True,
inc_membership_cfg: bool = True,
inc_extended_profile: bool = True,
inc_person: bool = True,
inc_user: bool = True,
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
base_name = Membership_Group_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=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_group`.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_group`.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_group`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'membership_group' and for_obj_id:
data['membership_group_id'] = for_obj_id
sql_where_for_obj_type = """`membership_group`.id = :membership_group_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=response) # Bad Request
sql = f"""
SELECT id AS 'membership_group_id', id_random AS 'membership_group_id_random'
FROM `membership_group` AS `membership_group`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
membership_group_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(membership_group_obj_result, dict):
membership_group_id = membership_group_obj_result.get('membership_group_id', None)
membership_group_obj = load_membership_group_obj(
membership_group_id = membership_group_id,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_cfg = inc_membership_cfg,
inc_extended_profile = inc_extended_profile,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
data = membership_group_obj
elif isinstance(membership_group_obj_result, list):
membership_group_obj_li = []
for membership_group_obj in membership_group_obj_result:
membership_group_id = membership_group_obj.get('membership_group_id', None)
membership_group_obj_li.append(
load_membership_group_obj(
membership_group_id = membership_group_id,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_cfg = inc_membership_cfg,
inc_extended_profile = inc_extended_profile,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
)
data = membership_group_obj_li
else:
log.debug(membership_group_obj_result)
return mk_resp(data=None, status_code=404) # Not Found
return mk_resp(data=data)
# ### BEGIN ### API Membership Group ### get_membership_group_obj() ###
# Working well as of 2021-06-21. Using as a template for other routes.
@router.get('/membership/group/{membership_group_id}', response_model=Resp_Body_Base)
async def get_membership_group_obj(
membership_group_id: str = Query(..., min_length=1, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
inc_address: bool = False, # Per member
inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
inc_membership_group_list: bool = False, # List of groups per member
inc_membership_group_person_list: bool = False, # List of members belonging to this group
inc_membership_person_profile: bool = False, # Per member
inc_organization: bool = False, # Per member
inc_person: bool = False, # Per member
inc_product: bool = False, # Per member
inc_product_list: bool = False,
inc_user: bool = False, # Per member
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_group_id := redis_lookup_id_random(record_id_random=membership_group_id, table_name='membership_group'): pass
else:
return mk_resp(data=None, status_code=404)
if membership_group_result := load_membership_group_obj(
membership_group_id = membership_group_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict, # NOTE: returning model as a dict
enabled = 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_profile = inc_membership_person_profile,
inc_organization = inc_organization,
inc_person = inc_person,
# inc_product = inc_product,
inc_product_list = inc_product_list,
inc_user = inc_user,
):
pass
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=membership_group_result)
# ### END ### API Membership ### get_membership_group_obj() ###
@router.delete('/membership/group/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_group_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result