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.membership_models import Membership_Base from ..methods.membership_methods import load_membership_obj from ..models.response_model import * router = APIRouter() @router.post('', response_model=Resp_Body_Base) async def post_membership_obj( obj: Membership_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 = 'membership' 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_membership_obj( obj_id: str = Query(..., min_length=1, max_length=22), obj: Membership_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.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'membership' 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_membership_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, ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'membership' 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 # Look up is only for account, person, or user records @router.get('/lookup', response_model=Resp_Body_Base) async def lookup_membership_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_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, ): log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) obj_type = 'membership' base_name = Membership_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 = """`membership`.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_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`.user_id = :user_id""" sql_limit = 'LIMIT 1' elif for_obj_type == 'membership' and for_obj_id: data['membership_id'] = for_obj_id sql_where_for_obj_type = """`membership`.id = :membership_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 'membership_id', id_random AS 'membership_id_random' FROM `membership` AS `membership` WHERE {sql_where_for_obj_type} {sql_limit} """ # This will return a list if selecting by account ID membership_obj_result = sql_select(data=data, sql=sql, as_list=as_list) if isinstance(membership_obj_result, dict): membership_id = membership_obj_result.get('membership_id', None) membership_obj = load_membership_obj( membership_id=membership_id, inc_membership_profile=inc_membership_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_obj elif isinstance(membership_obj_result, list): membership_obj_li = [] for membership_obj in membership_obj_result: membership_id = membership_obj.get('membership_id', None) membership_obj_li.append( load_membership_obj( membership_id=membership_id, inc_membership_profile=inc_membership_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_obj_li else: log.debug(membership_obj_result) return mk_resp(data=None, status_code=404) # Not Found return mk_resp(data=data) @router.get('/{obj_id}', response_model=Resp_Body_Base) async def get_membership_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 = 'membership' 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_membership_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 = 'membership' result = delete_obj_template( obj_type=obj_type, obj_id=obj_id, ) return result