import logging from fastapi import APIRouter, Depends, HTTPException, Request from bson import ObjectId from src.db.repositories.team_repository import team_repository from src.schemas.team import TeamCreate, TeamUpdate, TeamResponse, TeamListResponse from src.models.team import TeamModel from src.utils.logging import log_request logger = logging.getLogger(__name__) router = APIRouter(tags=["Teams"], prefix="/teams") @router.post("", response_model=TeamResponse, status_code=201) async def create_team(team_data: TeamCreate, request: Request): """ Create a new team This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "team_data": team_data.dict()} ) # Create team team = TeamModel( name=team_data.name, description=team_data.description ) created_team = await team_repository.create(team) # Convert to response model response = TeamResponse( id=str(created_team.id), name=created_team.name, description=created_team.description, created_at=created_team.created_at, updated_at=created_team.updated_at ) return response @router.get("", response_model=TeamListResponse) async def list_teams(request: Request): """ List all teams This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method} ) # Get all teams teams = await team_repository.get_all() # Convert to response models response_teams = [] for team in teams: response_teams.append(TeamResponse( id=str(team.id), name=team.name, description=team.description, created_at=team.created_at, updated_at=team.updated_at )) return TeamListResponse(teams=response_teams, total=len(response_teams)) @router.get("/{team_id}", response_model=TeamResponse) async def get_team(team_id: str, request: Request): """ Get a team by ID This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "team_id": team_id} ) try: # Convert string ID to ObjectId obj_id = ObjectId(team_id) except: raise HTTPException(status_code=400, detail="Invalid team ID") # Get the team team = await team_repository.get_by_id(obj_id) if not team: raise HTTPException(status_code=404, detail="Team not found") # Convert to response model response = TeamResponse( id=str(team.id), name=team.name, description=team.description, created_at=team.created_at, updated_at=team.updated_at ) return response @router.put("/{team_id}", response_model=TeamResponse) async def update_team(team_id: str, team_data: TeamUpdate, request: Request): """ Update a team This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "team_id": team_id, "team_data": team_data.dict()} ) try: # Convert string ID to ObjectId obj_id = ObjectId(team_id) except: raise HTTPException(status_code=400, detail="Invalid team ID") # Get the team team = await team_repository.get_by_id(obj_id) if not team: raise HTTPException(status_code=404, detail="Team not found") # Update the team update_data = team_data.dict(exclude_unset=True) if not update_data: # No fields to update return TeamResponse( id=str(team.id), name=team.name, description=team.description, created_at=team.created_at, updated_at=team.updated_at ) updated_team = await team_repository.update(obj_id, update_data) if not updated_team: raise HTTPException(status_code=500, detail="Failed to update team") # Convert to response model response = TeamResponse( id=str(updated_team.id), name=updated_team.name, description=updated_team.description, created_at=updated_team.created_at, updated_at=updated_team.updated_at ) return response @router.delete("/{team_id}", status_code=204) async def delete_team(team_id: str, request: Request): """ Delete a team This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "team_id": team_id} ) try: # Convert string ID to ObjectId obj_id = ObjectId(team_id) except: raise HTTPException(status_code=400, detail="Invalid team ID") # Get the team team = await team_repository.get_by_id(obj_id) if not team: raise HTTPException(status_code=404, detail="Team not found") # Delete the team success = await team_repository.delete(obj_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete team")