from fastapi import APIRouter, Depends, HTTPException, status from sqlmodel import Session, select from app.connection import get_session from app.models.team import Team from app.models.team_member import TeamMember from app.models.user import User from app.schemas.team import ( TeamCreate, TeamRead, TeamReadWithMembers, TeamMemberAdd, TeamMemberRead, ) from app.auth.dependencies import get_current_user router = APIRouter(prefix="/teams", tags=["Teams"]) @router.post("/", response_model=TeamRead, status_code=status.HTTP_201_CREATED) def create_team( data: TeamCreate, session: Session = Depends(get_session), current_user: User = Depends(get_current_user), ) -> Team: team = Team(**data.model_dump()) session.add(team) session.commit() session.refresh(team) # Создатель автоматически становится участником команды member = TeamMember(user_id=current_user.id, team_id=team.id, role="captain") session.add(member) session.commit() session.refresh(team) return team @router.get("/", response_model=list[TeamRead]) def list_teams( hackathon_id: int | None = None, session: Session = Depends(get_session), ) -> list[Team]: query = select(Team) if hackathon_id is not None: query = query.where(Team.hackathon_id == hackathon_id) return list(session.exec(query).all()) @router.get("/{team_id}", response_model=TeamReadWithMembers) def get_team(team_id: int, session: Session = Depends(get_session)) -> Team: """Возвращает команду с вложенным списком участников (one-to-many).""" team = session.get(Team, team_id) if not team: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Команда не найдена") return team @router.delete("/{team_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_team( team_id: int, session: Session = Depends(get_session), current_user: User = Depends(get_current_user), ) -> None: team = session.get(Team, team_id) if not team: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Команда не найдена") session.delete(team) session.commit() # ── Участники команды ─────────────────────────────────────────────────────── @router.post("/{team_id}/members", response_model=TeamMemberRead, status_code=status.HTTP_201_CREATED) def add_member( team_id: int, data: TeamMemberAdd, session: Session = Depends(get_session), current_user: User = Depends(get_current_user), ) -> TeamMember: team = session.get(Team, team_id) if not team: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Команда не найдена") existing = session.exec( select(TeamMember).where( TeamMember.user_id == data.user_id, TeamMember.team_id == team_id, ) ).first() if existing: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Пользователь уже в команде") member = TeamMember(user_id=data.user_id, team_id=team_id, role=data.role) session.add(member) session.commit() session.refresh(member) return member @router.delete("/{team_id}/members/{user_id}", status_code=status.HTTP_204_NO_CONTENT) def remove_member( team_id: int, user_id: int, session: Session = Depends(get_session), current_user: User = Depends(get_current_user), ) -> None: member = session.exec( select(TeamMember).where( TeamMember.user_id == user_id, TeamMember.team_id == team_id, ) ).first() if not member: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Участник не найден") session.delete(member) session.commit()