init
This commit is contained in:
118
app/routers/teams.py
Normal file
118
app/routers/teams.py
Normal file
@@ -0,0 +1,118 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user