from datetime import datetime from fastapi import APIRouter, Depends, HTTPException from typing import Optional import logging import pydantic from ..db_engine import ScoutClaim, model_to_dict from ..dependencies import oauth2_scheme, valid_token router = APIRouter(prefix="/api/v2/scout_claims", tags=["scout_claims"]) class ScoutClaimModel(pydantic.BaseModel): scout_opportunity_id: int card_id: int claimed_by_team_id: int @router.get("") async def get_scout_claims( scout_opportunity_id: Optional[int] = None, claimed_by_team_id: Optional[int] = None, limit: Optional[int] = 100, ): query = ScoutClaim.select().order_by(ScoutClaim.id) if scout_opportunity_id is not None: query = query.where(ScoutClaim.scout_opportunity_id == scout_opportunity_id) if claimed_by_team_id is not None: query = query.where(ScoutClaim.claimed_by_team_id == claimed_by_team_id) total_count = query.count() if limit is not None: limit = max(0, min(limit, 500)) query = query.limit(limit) results = [model_to_dict(x, recurse=False) for x in query] return {"count": total_count, "results": results} @router.get("/{claim_id}") async def get_one_scout_claim(claim_id: int): try: claim = ScoutClaim.get_by_id(claim_id) except Exception: raise HTTPException( status_code=404, detail=f"No scout claim found with id {claim_id}" ) return model_to_dict(claim) @router.post("") async def post_scout_claim(claim: ScoutClaimModel, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f"Bad Token: {token}") raise HTTPException( status_code=401, detail="You are not authorized to post scout claims. This event has been logged.", ) claim_data = claim.dict() claim_data["created"] = int(datetime.timestamp(datetime.now()) * 1000) this_claim = ScoutClaim(**claim_data) saved = this_claim.save() if saved == 1: return model_to_dict(this_claim) else: raise HTTPException(status_code=418, detail="Could not save scout claim") @router.delete("/{claim_id}") async def delete_scout_claim(claim_id: int, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f"Bad Token: {token}") raise HTTPException( status_code=401, detail="You are not authorized to delete scout claims. This event has been logged.", ) try: claim = ScoutClaim.get_by_id(claim_id) except Exception: raise HTTPException( status_code=404, detail=f"No scout claim found with id {claim_id}" ) count = claim.delete_instance() if count == 1: raise HTTPException( status_code=200, detail=f"Scout claim {claim_id} has been deleted" ) else: raise HTTPException( status_code=500, detail=f"Scout claim {claim_id} was not deleted" )