Added admin, gamerewards, gauntletrewards, gauntletruns, notifications, paperdex
This commit is contained in:
parent
177ca2c585
commit
144ced6875
@ -5,7 +5,7 @@ import os
|
||||
from fastapi import FastAPI
|
||||
|
||||
from.routers_v2 import current, teams, rarity, cardsets, players, packtypes, packs, cards, events, results, rewards, \
|
||||
batstats, pitstats
|
||||
batstats, pitstats, notifications, paperdex, gamerewards, gauntletrewards, gauntletruns
|
||||
|
||||
app = FastAPI(
|
||||
responses={404: {'description': 'Not found'}}
|
||||
@ -24,3 +24,8 @@ app.include_router(results.router)
|
||||
app.include_router(rewards.router)
|
||||
app.include_router(batstats.router)
|
||||
app.include_router(pitstats.router)
|
||||
app.include_router(notifications.router)
|
||||
app.include_router(paperdex.router)
|
||||
app.include_router(gamerewards.router)
|
||||
app.include_router(gauntletrewards.router)
|
||||
app.include_router(gauntletruns.router)
|
||||
|
||||
40
app/routers_v2/admin.py
Normal file
40
app/routers_v2/admin.py
Normal file
@ -0,0 +1,40 @@
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response
|
||||
from typing import Optional
|
||||
import logging
|
||||
import pydantic
|
||||
from pandas import DataFrame
|
||||
|
||||
from ..db_engine import db, Player, model_to_dict, fn
|
||||
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/admin',
|
||||
tags=['admin']
|
||||
)
|
||||
|
||||
|
||||
@router.post('/stl-fix')
|
||||
async def stl_cardinals_fix(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. This event has been logged.'
|
||||
)
|
||||
|
||||
p_query = Player.update(mlbclub='St Louis Cardinals', franchise='St Louis Cardinals').where(
|
||||
Player.mlbclub == 'St. Louis Cardinals'
|
||||
).execute()
|
||||
db.close()
|
||||
|
||||
return {'detail': f'Removed the period from St Louis'}
|
||||
|
||||
194
app/routers_v2/gamerewards.py
Normal file
194
app/routers_v2/gamerewards.py
Normal file
@ -0,0 +1,194 @@
|
||||
from datetime import datetime
|
||||
|
||||
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, fn
|
||||
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')
|
||||
|
||||
139
app/routers_v2/gauntletrewards.py
Normal file
139
app/routers_v2/gauntletrewards.py
Normal file
@ -0,0 +1,139 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from typing import Optional, List
|
||||
import logging
|
||||
import pydantic
|
||||
|
||||
from ..db_engine import db, GauntletReward, model_to_dict, chunked, DatabaseError
|
||||
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/gauntletrewards',
|
||||
tags=['gauntletrewards']
|
||||
)
|
||||
|
||||
|
||||
class GauntletRewardModel(pydantic.BaseModel):
|
||||
name: str
|
||||
gauntlet_id: Optional[int] = 0
|
||||
reward_id: Optional[int] = 0
|
||||
win_num: Optional[int] = 0
|
||||
loss_max: Optional[int] = 1
|
||||
|
||||
|
||||
class GauntletRewardList(pydantic.BaseModel):
|
||||
rewards: List[GauntletRewardModel]
|
||||
|
||||
|
||||
@router.get('/api/v1/gauntletrewards')
|
||||
async def v1_gauntletreward_get(
|
||||
name: Optional[str] = None, gauntlet_id: Optional[int] = None, reward_id: list = Query(default=None),
|
||||
win_num: Optional[int] = None, loss_max: Optional[int] = None):
|
||||
all_rewards = GauntletReward.select()
|
||||
|
||||
if name is not None:
|
||||
all_rewards = all_rewards.where(GauntletReward.name == name)
|
||||
if gauntlet_id is not None:
|
||||
all_rewards = all_rewards.where(GauntletReward.gauntlet_id == gauntlet_id)
|
||||
if reward_id is not None:
|
||||
all_rewards = all_rewards.where(GauntletReward.reward_id << reward_id)
|
||||
if win_num is not None:
|
||||
all_rewards = all_rewards.where(GauntletReward.win_num == win_num)
|
||||
if loss_max is not None:
|
||||
all_rewards = all_rewards.where(GauntletReward.loss_max >= loss_max)
|
||||
|
||||
all_rewards = all_rewards.order_by(-GauntletReward.loss_max, GauntletReward.win_num)
|
||||
|
||||
return_val = {'count': all_rewards.count(), 'rewards': []}
|
||||
for x in all_rewards:
|
||||
return_val['rewards'].append(model_to_dict(x))
|
||||
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.get('/api/v1/gauntletrewards/{gauntletreward_id}')
|
||||
async def v1_gauntletreward_get_one(gauntletreward_id):
|
||||
try:
|
||||
this_reward = GauntletReward.get_by_id(gauntletreward_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No gauntlet reward found with id {gauntletreward_id}')
|
||||
|
||||
return_val = model_to_dict(this_reward)
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.patch('/api/v1/gauntletrewards/{gauntletreward_id}')
|
||||
async def v1_gauntletreward_patch(
|
||||
gauntletreward_id, name: Optional[str] = None, gauntlet_id: Optional[int] = None,
|
||||
reward_id: Optional[int] = None, win_num: Optional[int] = None, loss_max: 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 gauntlet rewards. This event has been logged.'
|
||||
)
|
||||
|
||||
this_reward = GauntletReward.get_or_none(GauntletReward.id == gauntletreward_id)
|
||||
if this_reward is None:
|
||||
db.close()
|
||||
raise KeyError(f'Gauntlet Reward ID {gauntletreward_id} not found')
|
||||
|
||||
if gauntlet_id is not None:
|
||||
this_reward.gauntlet_id = gauntlet_id
|
||||
if reward_id is not None:
|
||||
this_reward.reward_id = reward_id
|
||||
if win_num is not None:
|
||||
this_reward.win_num = win_num
|
||||
if loss_max is not None:
|
||||
this_reward.loss_max = loss_max
|
||||
if name is not None:
|
||||
this_reward.name = name
|
||||
|
||||
if this_reward.save():
|
||||
r_curr = model_to_dict(this_reward)
|
||||
db.close()
|
||||
return r_curr
|
||||
else:
|
||||
db.close()
|
||||
raise DatabaseError(f'Unable to patch gauntlet reward {gauntletreward_id}')
|
||||
|
||||
|
||||
@router.post('/api/v1/gauntletrewards')
|
||||
async def v1_gauntletreward_post(gauntletreward: GauntletRewardList, 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 gauntlets. This event has been logged.'
|
||||
)
|
||||
|
||||
all_rewards = []
|
||||
for x in gauntletreward.rewards:
|
||||
all_rewards.append(x.dict())
|
||||
|
||||
with db.atomic():
|
||||
for batch in chunked(all_rewards, 15):
|
||||
GauntletReward.insert_many(batch).on_conflict_replace().execute()
|
||||
db.close()
|
||||
|
||||
return f'Inserted {len(all_rewards)} gauntlet rewards'
|
||||
|
||||
|
||||
@router.delete('/api/v1/gauntletrewards/{gauntletreward_id}')
|
||||
async def v1_gauntletreward_delete(gauntletreward_id):
|
||||
if GauntletReward.delete_by_id(gauntletreward_id) == 1:
|
||||
return f'Deleted gauntlet reward ID {gauntletreward_id}'
|
||||
|
||||
raise DatabaseError(f'Unable to delete gauntlet run {gauntletreward_id}')
|
||||
|
||||
170
app/routers_v2/gauntletruns.py
Normal file
170
app/routers_v2/gauntletruns.py
Normal file
@ -0,0 +1,170 @@
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from typing import Optional
|
||||
import logging
|
||||
import pydantic
|
||||
|
||||
from ..db_engine import db, GauntletRun, model_to_dict, DatabaseError
|
||||
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/gauntletruns',
|
||||
tags=['notifs']
|
||||
)
|
||||
|
||||
|
||||
class GauntletRunModel(pydantic.BaseModel):
|
||||
team_id: int
|
||||
gauntlet_id: int
|
||||
wins: Optional[int] = 0
|
||||
losses: Optional[int] = 0
|
||||
gsheet: Optional[str] = None
|
||||
created: Optional[int] = int(datetime.timestamp(datetime.now())*1000)
|
||||
ended: Optional[int] = 0
|
||||
|
||||
|
||||
@router.get('')
|
||||
async def get_gauntletruns(
|
||||
team_id: list = Query(default=None), wins: Optional[int] = None, wins_min: Optional[int] = None,
|
||||
wins_max: Optional[int] = None, losses: Optional[int] = None, losses_min: Optional[int] = None,
|
||||
losses_max: Optional[int] = None, gsheet: Optional[str] = None, created_after: Optional[int] = None,
|
||||
created_before: Optional[int] = None, ended_after: Optional[int] = None, ended_before: Optional[int] = None,
|
||||
is_active: Optional[bool] = None, gauntlet_id: list = Query(default=None), season: list = Query(default=None)):
|
||||
all_gauntlets = GauntletRun.select()
|
||||
|
||||
if team_id is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.team_id << team_id)
|
||||
if wins is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.wins == wins)
|
||||
if wins_min is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.wins >= wins_min)
|
||||
if wins_max is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.wins <= wins_max)
|
||||
if losses is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.losses == losses)
|
||||
if losses_min is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.losses >= losses_min)
|
||||
if losses_max is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.losses <= losses_max)
|
||||
if gsheet is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.gsheet == gsheet)
|
||||
if created_after is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.created >= created_after)
|
||||
if created_before is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.created <= created_before)
|
||||
if ended_after is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.ended >= ended_after)
|
||||
if ended_before is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.ended <= ended_before)
|
||||
if is_active is not None:
|
||||
if is_active is True:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.ended == 0)
|
||||
else:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.ended != 0)
|
||||
if gauntlet_id is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.gauntlet_id << gauntlet_id)
|
||||
if season is not None:
|
||||
all_gauntlets = all_gauntlets.where(GauntletRun.team.season << season)
|
||||
|
||||
return_val = {'count': all_gauntlets.count(), 'runs': []}
|
||||
for x in all_gauntlets:
|
||||
return_val['runs'].append(model_to_dict(x))
|
||||
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.get('/{gauntletrun_id}')
|
||||
async def get_one_gauntletrun(gauntletrun_id):
|
||||
try:
|
||||
this_gauntlet = GauntletRun.get_by_id(gauntletrun_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No gauntlet found with id {gauntletrun_id}')
|
||||
|
||||
return_val = model_to_dict(this_gauntlet)
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.patch('/{gauntletrun_id}')
|
||||
async def patch_gauntletrun(
|
||||
gauntletrun_id, team_id: Optional[int] = None, wins: Optional[int] = None, losses: Optional[int] = None,
|
||||
gsheet: Optional[str] = None, created: Optional[bool] = None, ended: Optional[bool] = 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 gauntlet runs. This event has been logged.'
|
||||
)
|
||||
|
||||
this_run = GauntletRun.get_or_none(GauntletRun.id == gauntletrun_id)
|
||||
if this_run is None:
|
||||
db.close()
|
||||
raise KeyError(f'Gauntlet Run ID {gauntletrun_id} not found')
|
||||
|
||||
if team_id is not None:
|
||||
this_run.team_id = team_id
|
||||
if wins is not None:
|
||||
this_run.wins = wins
|
||||
if losses is not None:
|
||||
this_run.losses = losses
|
||||
if gsheet is not None:
|
||||
this_run.gsheet = gsheet
|
||||
if created is not None:
|
||||
if created is True:
|
||||
this_run.created = int(datetime.timestamp(datetime.now())*1000)
|
||||
else:
|
||||
this_run.created = None
|
||||
if ended is not None:
|
||||
if ended is True:
|
||||
this_run.ended = int(datetime.timestamp(datetime.now())*1000)
|
||||
else:
|
||||
this_run.ended = 0
|
||||
|
||||
if this_run.save():
|
||||
r_curr = model_to_dict(this_run)
|
||||
db.close()
|
||||
return r_curr
|
||||
else:
|
||||
db.close()
|
||||
raise DatabaseError(f'Unable to patch gauntlet run {gauntletrun_id}')
|
||||
|
||||
|
||||
@router.post('')
|
||||
async def post_gauntletrun(gauntletrun: GauntletRunModel, 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 gauntlets. This event has been logged.'
|
||||
)
|
||||
|
||||
this_run = GauntletRun(**gauntletrun.dict())
|
||||
|
||||
if this_run.save():
|
||||
r_run = model_to_dict(this_run)
|
||||
db.close()
|
||||
return r_run
|
||||
else:
|
||||
db.close()
|
||||
raise DatabaseError(f'Unable to post gauntlet run')
|
||||
|
||||
|
||||
@router.delete('/{gauntletrun_id}')
|
||||
async def delete_gauntletrun(gauntletrun_id):
|
||||
if GauntletRun.delete_by_id(gauntletrun_id) == 1:
|
||||
return f'Deleted gauntlet run ID {gauntletrun_id}'
|
||||
|
||||
raise DatabaseError(f'Unable to delete gauntlet run {gauntletrun_id}')
|
||||
|
||||
203
app/routers_v2/notifications.py
Normal file
203
app/routers_v2/notifications.py
Normal file
@ -0,0 +1,203 @@
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response
|
||||
from typing import Optional
|
||||
import logging
|
||||
import pydantic
|
||||
from pandas import DataFrame
|
||||
|
||||
from ..db_engine import db, Notification, model_to_dict, fn
|
||||
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/notifs',
|
||||
tags=['notifs']
|
||||
)
|
||||
|
||||
|
||||
class NotifModel(pydantic.BaseModel):
|
||||
created: int
|
||||
title: str
|
||||
desc: Optional[str] = None
|
||||
field_name: str
|
||||
message: str
|
||||
about: Optional[str] = 'blank'
|
||||
ack: Optional[bool] = False
|
||||
|
||||
|
||||
@router.get('')
|
||||
async def get_notifs(
|
||||
created_after: Optional[int] = None, title: Optional[str] = None, desc: Optional[str] = None,
|
||||
field_name: Optional[str] = None, in_desc: Optional[str] = None, about: Optional[str] = None,
|
||||
ack: Optional[bool] = None, csv: Optional[bool] = None):
|
||||
all_notif = Notification.select()
|
||||
|
||||
if all_notif.count() == 0:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'There are no notifications to filter')
|
||||
|
||||
if created_after is not None:
|
||||
all_notif = all_notif.where(Notification.created < created_after)
|
||||
if title is not None:
|
||||
all_notif = all_notif.where(Notification.title == title)
|
||||
if desc is not None:
|
||||
all_notif = all_notif.where(Notification.desc == desc)
|
||||
if field_name is not None:
|
||||
all_notif = all_notif.where(Notification.field_name == field_name)
|
||||
if in_desc is not None:
|
||||
all_notif = all_notif.where(fn.Lower(Notification.desc).contains(in_desc.lower()))
|
||||
if about is not None:
|
||||
all_notif = all_notif.where(Notification.about == about)
|
||||
if ack is not None:
|
||||
all_notif = all_notif.where(Notification.ack == ack)
|
||||
|
||||
if csv:
|
||||
data_list = [['id', 'created', 'title', 'desc', 'field_name', 'message', 'about', 'ack']]
|
||||
for line in all_notif:
|
||||
data_list.append([
|
||||
line.id, line.created, line.title, line.desc, line.field_name, line.message, line.about, line.ack
|
||||
])
|
||||
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_notif.count(), 'notifs': []}
|
||||
for x in all_notif:
|
||||
return_val['notifs'].append(model_to_dict(x))
|
||||
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.get('/{notif_id}')
|
||||
async def get_one_notif(notif_id, csv: Optional[bool] = None):
|
||||
try:
|
||||
this_notif = Notification.get_by_id(notif_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No notification found with id {notif_id}')
|
||||
|
||||
if csv:
|
||||
data_list = [
|
||||
['id', 'created', 'title', 'desc', 'field_name', 'message', 'about', 'ack'],
|
||||
[this_notif.id, this_notif.created, this_notif.title, this_notif.desc, this_notif.field_name,
|
||||
this_notif.message, this_notif.about, this_notif.ack]
|
||||
]
|
||||
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_notif)
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.post('')
|
||||
async def post_notif(notif: NotifModel, 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 notifications. This event has been logged.'
|
||||
)
|
||||
|
||||
logging.info(f'new notif: {notif}')
|
||||
this_notif = Notification(
|
||||
created=notif.created,
|
||||
title=notif.title,
|
||||
desc=notif.desc,
|
||||
field_name=notif.field_name,
|
||||
message=notif.message,
|
||||
about=notif.about,
|
||||
)
|
||||
|
||||
saved = this_notif.save()
|
||||
if saved == 1:
|
||||
return_val = model_to_dict(this_notif)
|
||||
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 notification'
|
||||
)
|
||||
|
||||
|
||||
@router.patch('/{notif_id}')
|
||||
async def patch_notif(
|
||||
notif_id, created: Optional[int] = None, title: Optional[str] = None, desc: Optional[str] = None,
|
||||
field_name: Optional[str] = None, message: Optional[str] = None, about: Optional[str] = None,
|
||||
ack: Optional[bool] = 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 notifications. This event has been logged.'
|
||||
)
|
||||
try:
|
||||
this_notif = Notification.get_by_id(notif_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No notification found with id {notif_id}')
|
||||
|
||||
if title is not None:
|
||||
this_notif.title = title
|
||||
if desc is not None:
|
||||
this_notif.desc = desc
|
||||
if field_name is not None:
|
||||
this_notif.field_name = field_name
|
||||
if message is not None:
|
||||
this_notif.message = message
|
||||
if about is not None:
|
||||
this_notif.about = about
|
||||
if ack is not None:
|
||||
this_notif.ack = ack
|
||||
if created is not None:
|
||||
this_notif.created = created
|
||||
|
||||
if this_notif.save() == 1:
|
||||
return_val = model_to_dict(this_notif)
|
||||
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('/{notif_id}')
|
||||
async def delete_notif(notif_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 notifications. This event has been logged.'
|
||||
)
|
||||
try:
|
||||
this_notif = Notification.get_by_id(notif_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No notification found with id {notif_id}')
|
||||
|
||||
count = this_notif.delete_instance()
|
||||
db.close()
|
||||
|
||||
if count == 1:
|
||||
raise HTTPException(status_code=200, detail=f'Notification {notif_id} has been deleted')
|
||||
else:
|
||||
raise HTTPException(status_code=500, detail=f'Notification {notif_id} was not deleted')
|
||||
208
app/routers_v2/paperdex.py
Normal file
208
app/routers_v2/paperdex.py
Normal file
@ -0,0 +1,208 @@
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response
|
||||
from typing import Optional
|
||||
import logging
|
||||
import pydantic
|
||||
from pandas import DataFrame
|
||||
|
||||
from ..db_engine import db, Paperdex, model_to_dict, fn, Player, Cardset, Team
|
||||
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/paperdex',
|
||||
tags=['paperdex']
|
||||
)
|
||||
|
||||
|
||||
class PaperdexModel(pydantic.BaseModel):
|
||||
team_id: int
|
||||
player_id: int
|
||||
created: Optional[int] = int(datetime.timestamp(datetime.now())*1000)
|
||||
|
||||
|
||||
@router.get('')
|
||||
async def get_paperdex(
|
||||
team_id: Optional[int] = None, player_id: Optional[int] = None, created_after: Optional[int] = None,
|
||||
cardset_id: Optional[int] = None, created_before: Optional[int] = None, flat: Optional[bool] = False,
|
||||
csv: Optional[bool] = None):
|
||||
all_dex = Paperdex.select().join(Player).join(Cardset)
|
||||
|
||||
if all_dex.count() == 0:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'There are no paperdex to filter')
|
||||
|
||||
if team_id is not None:
|
||||
all_dex = all_dex.where(Paperdex.team_id == team_id)
|
||||
if player_id is not None:
|
||||
all_dex = all_dex.where(Paperdex.player_id == player_id)
|
||||
if cardset_id is not None:
|
||||
all_sets = Cardset.select().where(Cardset.id == cardset_id)
|
||||
all_dex = all_dex.where(Paperdex.player.cardset.id == cardset_id)
|
||||
if created_after is not None:
|
||||
all_dex = all_dex.where(Paperdex.created >= created_after)
|
||||
if created_before is not None:
|
||||
all_dex = all_dex.where(Paperdex.created <= created_before)
|
||||
|
||||
# if all_dex.count() == 0:
|
||||
# db.close()
|
||||
# raise HTTPException(status_code=404, detail=f'No paperdex found')
|
||||
|
||||
if csv:
|
||||
data_list = [['id', 'team_id', 'player_id', 'created']]
|
||||
for line in all_dex:
|
||||
data_list.append(
|
||||
[
|
||||
line.id, line.team.id, line.player.player_id, line.created
|
||||
]
|
||||
)
|
||||
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_dex.count(), 'paperdex': []}
|
||||
for x in all_dex:
|
||||
return_val['paperdex'].append(model_to_dict(x, recurse=not flat))
|
||||
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.get('/{paperdex_id}')
|
||||
async def get_one_paperdex(paperdex_id, csv: Optional[bool] = False):
|
||||
try:
|
||||
this_dex = Paperdex.get_by_id(paperdex_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No paperdex found with id {paperdex_id}')
|
||||
|
||||
if csv:
|
||||
data_list = [
|
||||
['id', 'team_id', 'player_id', 'created'],
|
||||
[this_dex.id, this_dex.team.id, this_dex.player.id, this_dex.created]
|
||||
]
|
||||
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_dex)
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
|
||||
@router.post('')
|
||||
async def post_paperdex(paperdex: PaperdexModel, 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 paperdex. This event has been logged.'
|
||||
)
|
||||
|
||||
dupe_dex = Paperdex.get_or_none(Paperdex.team_id == paperdex.team_id, Paperdex.player_id == paperdex.player_id)
|
||||
if dupe_dex:
|
||||
return_val = model_to_dict(dupe_dex)
|
||||
db.close()
|
||||
return return_val
|
||||
|
||||
this_dex = Paperdex(
|
||||
team_id=paperdex.team_id,
|
||||
player_id=paperdex.player_id,
|
||||
created=paperdex.created
|
||||
)
|
||||
|
||||
saved = this_dex.save()
|
||||
if saved == 1:
|
||||
return_val = model_to_dict(this_dex)
|
||||
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 dex'
|
||||
)
|
||||
|
||||
|
||||
@router.patch('/{paperdex_id}')
|
||||
async def patch_paperdex(
|
||||
paperdex_id, team_id: Optional[int] = None, player_id: Optional[int] = None, created: 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 paperdex. This event has been logged.'
|
||||
)
|
||||
try:
|
||||
this_dex = Paperdex.get_by_id(paperdex_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No paperdex found with id {paperdex_id}')
|
||||
|
||||
if team_id is not None:
|
||||
this_dex.team_id = team_id
|
||||
if player_id is not None:
|
||||
this_dex.player_id = player_id
|
||||
if created is not None:
|
||||
this_dex.created = created
|
||||
|
||||
if this_dex.save() == 1:
|
||||
return_val = model_to_dict(this_dex)
|
||||
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('/{paperdex_id}')
|
||||
async def delete_paperdex(paperdex_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 rewards. This event has been logged.'
|
||||
)
|
||||
try:
|
||||
this_dex = Paperdex.get_by_id(paperdex_id)
|
||||
except Exception:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'No paperdex found with id {paperdex_id}')
|
||||
|
||||
count = this_dex.delete_instance()
|
||||
db.close()
|
||||
|
||||
if count == 1:
|
||||
raise HTTPException(status_code=200, detail=f'Paperdex {this_dex} has been deleted')
|
||||
else:
|
||||
raise HTTPException(status_code=500, detail=f'Paperdex {this_dex} was not deleted')
|
||||
|
||||
|
||||
@router.post('/wipe-ai')
|
||||
async def wipe_ai_paperdex(token: str = Depends(oauth2_scheme)):
|
||||
if not valid_token(token):
|
||||
logging.warning(f'Bad Token: {token}')
|
||||
db.close()
|
||||
raise HTTPException(
|
||||
status_code=401,
|
||||
detail='Unauthorized'
|
||||
)
|
||||
|
||||
g_teams = Team.select().where(Team.abbrev.contains('Gauntlet'))
|
||||
count = Paperdex.delete().where(Paperdex.team << g_teams).execute()
|
||||
return f'Deleted {count} records'
|
||||
Loading…
Reference in New Issue
Block a user