from fastapi import APIRouter, Depends, HTTPException, Response from typing import Optional import logging import pydantic from pandas import DataFrame from ..db_engine import db, GameRewards, model_to_dict from ..dependencies import oauth2_scheme, valid_token, LOG_DATA logging.basicConfig( filename=LOG_DATA['filename'], format=LOG_DATA['format'], level=LOG_DATA['log_level'] ) router = APIRouter( prefix='/api/v2/gamerewards', tags=['gamerewards'] ) class GameRewardModel(pydantic.BaseModel): name: str pack_type_id: Optional[int] = None player_id: Optional[int] = None money: Optional[int] = None @router.get('') async def v1_gamerewards_get( name: Optional[str] = None, pack_type_id: Optional[int] = None, player_id: Optional[int] = None, money: Optional[int] = None, csv: Optional[bool] = None): all_rewards = GameRewards.select() # if all_rewards.count() == 0: # db.close() # raise HTTPException(status_code=404, detail=f'There are no awards to filter') if name is not None: all_rewards = all_rewards.where(GameRewards.name == name) if pack_type_id is not None: all_rewards = all_rewards.where(GameRewards.pack_type_id == pack_type_id) if player_id is not None: all_rewards = all_rewards.where(GameRewards.player_id == player_id) if money is not None: all_rewards = all_rewards.where(GameRewards.money == money) if csv: data_list = [['id', 'pack_type_id', 'player_id', 'money']] for line in all_rewards: data_list.append([ line.id, line.pack_type_id if line.pack_type else None, line.player_id if line.player else None, line.money ]) return_val = DataFrame(data_list).to_csv(header=False, index=False) db.close() return Response(content=return_val, media_type='text/csv') else: return_val = {'count': all_rewards.count(), 'gamerewards': []} for x in all_rewards: return_val['gamerewards'].append(model_to_dict(x)) db.close() return return_val @router.get('/{gameaward_id}') async def v1_gamerewards_get_one(gamereward_id, csv: Optional[bool] = None): try: this_game_reward = GameRewards.get_by_id(gamereward_id) except Exception: db.close() raise HTTPException(status_code=404, detail=f'No game reward found with id {gamereward_id}') if csv: data_list = [ ['id', 'pack_type_id', 'player_id', 'money'], [this_game_reward.id, this_game_reward.pack_type_id if this_game_reward.pack_type else None, this_game_reward.player_id if this_game_reward.player else None, this_game_reward.money] ] return_val = DataFrame(data_list).to_csv(header=False, index=False) db.close() return Response(content=return_val, media_type='text/csv') else: return_val = model_to_dict(this_game_reward) db.close() return return_val @router.post('') async def v1_gamerewards_post(game_reward: GameRewardModel, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f'Bad Token: {token}') db.close() raise HTTPException( status_code=401, detail='You are not authorized to post game rewards. This event has been logged.' ) this_award = GameRewards( name=game_reward.name, pack_type_id=game_reward.pack_type_id, player_id=game_reward.player_id, money=game_reward.money ) saved = this_award.save() if saved == 1: return_val = model_to_dict(this_award) db.close() return return_val else: db.close() raise HTTPException( status_code=418, detail='Well slap my ass and call me a teapot; I could not save that roster' ) @router.patch('/{game_reward_id}') async def v1_gamerewards_patch( game_reward_id: int, name: Optional[str] = None, pack_type_id: Optional[int] = None, player_id: Optional[int] = None, money: Optional[int] = None, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f'Bad Token: {token}') db.close() raise HTTPException( status_code=401, detail='You are not authorized to patch gamerewards. This event has been logged.' ) try: this_game_reward = GameRewards.get_by_id(game_reward_id) except Exception: db.close() raise HTTPException(status_code=404, detail=f'No game reward found with id {game_reward_id}') if name is not None: this_game_reward.name = name if pack_type_id is not None: if not pack_type_id: this_game_reward.pack_type_id = None else: this_game_reward.pack_type_id = pack_type_id if player_id is not None: if not player_id: this_game_reward.player_id = None else: this_game_reward.player_id = player_id if money is not None: if not money: this_game_reward.money = None else: this_game_reward.money = money if this_game_reward.save() == 1: return_val = model_to_dict(this_game_reward) db.close() return return_val else: raise HTTPException( status_code=418, detail='Well slap my ass and call me a teapot; I could not save that rarity' ) @router.delete('/{gamereward_id}') async def v1_gamerewards_delete(gamereward_id, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f'Bad Token: {token}') db.close() raise HTTPException( status_code=401, detail='You are not authorized to delete awards. This event has been logged.' ) try: this_award = GameRewards.get_by_id(gamereward_id) except Exception: db.close() raise HTTPException(status_code=404, detail=f'No award found with id {gamereward_id}') count = this_award.delete_instance() db.close() if count == 1: raise HTTPException(status_code=200, detail=f'Game Reward {gamereward_id} has been deleted') else: raise HTTPException(status_code=500, detail=f'Game Reward {gamereward_id} was not deleted')