# backend/app/crud.py from uuid import uuid4 from sqlalchemy.orm import Session from . import logic, models, schemas def _rebuild_structure(db: Session, t: models.Tournament): for m in t.matches: db.delete(m) db.flush() logic.generate_bracket(db, t) db.flush() db.refresh(t) logic.update_schedule_times(db, t) def create_tournament(db: Session, data: schemas.TournamentCreate): t_id = str(uuid4())[:8] new_t = models.Tournament( id=t_id, name=data.name, code=data.code, timestamp=data.timestamp, duration=data.duration, type=data.type, ) new_t.teams = [models.Team(name=n) for n in data.teams] new_t.courts = [models.Court(name=n) for n in data.courts] db.add(new_t) db.commit() # Generate Bracket logic.generate_bracket(db, new_t) logic.update_schedule_times(db, new_t) db.commit() db.refresh(new_t) return new_t def get_tournaments(db: Session): return db.query(models.Tournament).all() def get_tournament(db: Session, tournament_id: str): return ( db.query(models.Tournament) .filter(models.Tournament.id == tournament_id) .first() ) def delete_tournament(db: Session, tournament_id: str) -> bool: t = get_tournament(db, tournament_id) if not t: return False db.delete(t) db.commit() return True def update_tournament_details( db: Session, tournament_id: str, data: schemas.TournamentUpdate ): t = get_tournament(db, tournament_id) if not t: return None update_data = data.model_dump(exclude_unset=True) incoming_type = update_data.get("type") type_changed = incoming_type and incoming_type != t.type for key, value in update_data.items(): setattr(t, key, value) if type_changed: _rebuild_structure(db, t) else: logic.update_schedule_times(db, t) db.commit() db.refresh(t) return t def get_teams(db: Session, tournament_id: str): return ( db.query(models.Team).filter(models.Team.tournament_id == tournament_id).all() ) def create_team(db: Session, tournament_id: str, team_data: schemas.TeamCreate): t = get_tournament(db, tournament_id) if not t: return None new_team = models.Team(name=team_data.name, tournament_id=tournament_id) db.add(new_team) db.flush() _rebuild_structure(db, t) db.commit() db.refresh(new_team) return new_team def update_tournament_teams(db: Session, tournament_id: str, new_team_names: list[str]): t = get_tournament(db, tournament_id) if not t: return None t.teams = [models.Team(name=n, tournament_id=t.id) for n in new_team_names] db.flush() _rebuild_structure(db, t) db.commit() db.refresh(t) return t def delete_team(db: Session, tournament_id: str, team_id: int): t = get_tournament(db, tournament_id) if not t: return None team = db.get(models.Team, team_id) if not team or team.tournament_id != tournament_id: return None db.delete(team) db.flush() _rebuild_structure(db, t) db.commit() return True def get_courts(db: Session, tournament_id: str): return ( db.query(models.Court).filter(models.Court.tournament_id == tournament_id).all() ) def create_court(db: Session, tournament_id: str, court_data: schemas.CourtCreate): t = get_tournament(db, tournament_id) if not t: return None new_court = models.Court(name=court_data.name, tournament_id=tournament_id) db.add(new_court) db.flush() logic.update_schedule_times(db, t) db.commit() db.refresh(new_court) return new_court def delete_court(db: Session, tournament_id: str, court_id: int): t = get_tournament(db, tournament_id) if not t: return None court = db.get(models.Court, court_id) if not court or court.tournament_id != tournament_id: return None db.delete(court) db.flush() logic.update_schedule_times(db, t) db.commit() return True def update_tournament_courts( db: Session, tournament_id: str, new_court_names: list[str] ): t = get_tournament(db, tournament_id) if not t: return None t.courts = [models.Court(name=c, tournament_id=t.id) for c in new_court_names] db.flush() logic.update_schedule_times(db, t) db.commit() db.refresh(t) return t def get_tournament_matches(db: Session, tournament_id: str): return ( db.query(models.Match).filter(models.Match.tournament_id == tournament_id).all() ) def get_match(db: Session, tournament_id: str, match_id: str): return ( db.query(models.Match) .filter(models.Match.tournament_id == tournament_id) .filter(models.Match.id == match_id) .first() )