from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from typing import Optional from pydantic import BaseModel from app.database import get_db from app.services.team import TeamService from app.api.v1.deps import get_current_user_id router = APIRouter() class CreateTeamRequest(BaseModel): name: str description: Optional[str] = None class InviteRequest(BaseModel): user_id: str class UpdateRoleRequest(BaseModel): role: str @router.post("") async def create_team( data: CreateTeamRequest, user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) try: team = await service.create_team(user_id, data.name, data.description) return team except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.get("") async def list_teams( user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) return {"teams": await service.list_user_teams(user_id)} @router.get("/{team_id}") async def get_team( team_id: str, user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) team = await service.get_team(team_id, user_id) if not team: raise HTTPException(status_code=404, detail="Team not found") return team @router.post("/{team_id}/invite") async def invite_member( team_id: str, data: InviteRequest, user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) try: result = await service.invite_member(team_id, user_id, data.user_id) return result except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.delete("/{team_id}/members/{member_id}") async def remove_member( team_id: str, member_id: str, user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) success = await service.remove_member(team_id, user_id, member_id) if not success: raise HTTPException(status_code=404, detail="Member not found or not removable") return {"message": "Member removed"} @router.post("/{team_id}/leave") async def leave_team( team_id: str, user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) success = await service.leave_team(team_id, user_id) if not success: raise HTTPException(status_code=400, detail="Cannot leave as owner or not a member") return {"message": "Left team"} @router.patch("/{team_id}/members/{member_id}/role") async def update_member_role( team_id: str, member_id: str, data: UpdateRoleRequest, user_id: str = Depends(get_current_user_id), db: AsyncSession = Depends(get_db), ): service = TeamService(db) if data.role not in ("admin", "member", "viewer"): raise HTTPException(status_code=400, detail="Invalid role") success = await service.update_role(team_id, user_id, member_id, data.role) if not success: raise HTTPException(status_code=404, detail="Member not found or not updatable") return {"message": "Role updated"}