Refine gameday bootstrap layout
This commit is contained in:
@@ -3,19 +3,16 @@ from __future__ import annotations
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from sqlalchemy import select, update
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..auth import require_session
|
||||
from ..database import get_db
|
||||
from ..models import AudioClip, GameAssignment, PlaybackSession, UserSession
|
||||
from ..models import AudioClip, GameAssignment, UserSession
|
||||
from ..schemas import (
|
||||
GameAssignmentCreate,
|
||||
GameAssignmentResponse,
|
||||
GamePrepResponse,
|
||||
PlaybackAction,
|
||||
PlaybackSessionCreate,
|
||||
PlaybackSessionResponse,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/games", tags=["games"])
|
||||
@@ -133,7 +130,6 @@ def delete_assignment(
|
||||
if external_player_id is not None and assignment.external_player_id != external_player_id:
|
||||
raise HTTPException(status_code=403, detail="Pin does not belong to that player")
|
||||
|
||||
db.execute(update(PlaybackSession).where(PlaybackSession.current_assignment_id == assignment.id).values(current_assignment_id=None))
|
||||
db.delete(assignment)
|
||||
db.commit()
|
||||
|
||||
@@ -157,61 +153,3 @@ def prepare_game(
|
||||
prepared_at=datetime.now(timezone.utc),
|
||||
assignments=[assignment_to_response(assignment) for assignment in assignments],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/{external_game_id}/gameday/session", response_model=PlaybackSessionResponse)
|
||||
def create_gameday_session(
|
||||
external_game_id: str,
|
||||
payload: PlaybackSessionCreate,
|
||||
session: UserSession = Depends(require_session),
|
||||
db: Session = Depends(get_db),
|
||||
) -> PlaybackSessionResponse:
|
||||
playback = PlaybackSession(
|
||||
external_team_id=payload.external_team_id,
|
||||
external_game_id=external_game_id,
|
||||
gameday_session_id=session.id,
|
||||
state="idle",
|
||||
)
|
||||
db.add(playback)
|
||||
db.commit()
|
||||
db.refresh(playback)
|
||||
return PlaybackSessionResponse.model_validate(playback, from_attributes=True)
|
||||
|
||||
|
||||
@router.post("/{external_game_id}/gameday/session/{playback_session_id}/trigger", response_model=PlaybackSessionResponse)
|
||||
def trigger_gameday(
|
||||
external_game_id: str,
|
||||
playback_session_id: int,
|
||||
payload: PlaybackAction,
|
||||
_: UserSession = Depends(require_session),
|
||||
db: Session = Depends(get_db),
|
||||
) -> PlaybackSessionResponse:
|
||||
playback = db.get(PlaybackSession, playback_session_id)
|
||||
if playback is None or playback.external_game_id != external_game_id:
|
||||
raise HTTPException(status_code=404, detail="Playback session not found")
|
||||
|
||||
if payload.assignment_id is None and payload.clip_id is None:
|
||||
raise HTTPException(status_code=422, detail="Provide a pin or clip to trigger")
|
||||
|
||||
if payload.assignment_id is not None:
|
||||
assignment = db.get(GameAssignment, payload.assignment_id)
|
||||
if assignment is None or assignment.external_game_id != external_game_id:
|
||||
raise HTTPException(status_code=404, detail="Pin not found")
|
||||
if assignment.clip.hidden:
|
||||
raise HTTPException(status_code=404, detail="Pin not found")
|
||||
playback.current_assignment_id = assignment.id
|
||||
else:
|
||||
clip = db.get(AudioClip, payload.clip_id)
|
||||
if clip is None or clip.asset.external_team_id != playback.external_team_id:
|
||||
raise HTTPException(status_code=404, detail="Clip not found")
|
||||
if clip.hidden:
|
||||
raise HTTPException(status_code=404, detail="Clip not found")
|
||||
if payload.external_player_id and clip.asset.owner_external_player_id != payload.external_player_id:
|
||||
raise HTTPException(status_code=403, detail="Clip does not belong to that player")
|
||||
playback.current_assignment_id = None
|
||||
|
||||
playback.state = payload.state
|
||||
playback.last_triggered_at = datetime.now(timezone.utc)
|
||||
db.commit()
|
||||
db.refresh(playback)
|
||||
return PlaybackSessionResponse.model_validate(playback, from_attributes=True)
|
||||
|
||||
Reference in New Issue
Block a user