119 lines
4.0 KiB
Python
119 lines
4.0 KiB
Python
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()
|