import logging from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Request from src.services.user_service import UserService from src.schemas.user import UserResponse, UserListResponse, UserCreate, UserUpdate from src.utils.logging import log_request logger = logging.getLogger(__name__) router = APIRouter(tags=["Users"], prefix="/users") # Initialize service user_service = UserService() @router.get("/me", response_model=UserResponse) async def read_users_me( request: Request, user_id: str # Now requires user_id as a query parameter ): """Get user information by user ID""" log_request( {"path": request.url.path, "method": request.method, "user_id": user_id} ) try: response = await user_service.get_user_by_id(user_id) return response except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except RuntimeError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.error(f"Unexpected error getting user: {e}") raise HTTPException(status_code=500, detail="Internal server error") @router.put("/me", response_model=UserResponse) async def update_current_user( user_data: UserUpdate, request: Request, user_id: str # Now requires user_id as a query parameter ): """Update user information by user ID""" log_request( {"path": request.url.path, "method": request.method, "user_data": user_data.dict(), "user_id": user_id} ) try: response = await user_service.update_user_by_id(user_id, user_data) return response except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except RuntimeError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.error(f"Unexpected error updating user: {e}") raise HTTPException(status_code=500, detail="Internal server error") @router.post("", response_model=UserResponse, status_code=201) async def create_user( user_data: UserCreate, request: Request ): """ Create a new user This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "user_data": user_data.dict()} ) try: response = await user_service.create_user(user_data) return response except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except RuntimeError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.error(f"Unexpected error creating user: {e}") raise HTTPException(status_code=500, detail="Internal server error") @router.get("", response_model=UserListResponse) async def list_users( request: Request, team_id: Optional[str] = None ): """ List users This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "team_id": team_id} ) try: response = await user_service.list_users(team_id) return response except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except Exception as e: logger.error(f"Unexpected error listing users: {e}") raise HTTPException(status_code=500, detail="Internal server error") @router.get("/{user_id}", response_model=UserResponse) async def get_user( user_id: str, request: Request ): """ Get user by ID This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "user_id": user_id} ) try: response = await user_service.get_user(user_id) return response except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except RuntimeError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.error(f"Unexpected error getting user: {e}") raise HTTPException(status_code=500, detail="Internal server error") @router.put("/{user_id}", response_model=UserResponse) async def update_user( user_id: str, user_data: UserUpdate, request: Request ): """ Update user by ID This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "user_id": user_id, "user_data": user_data.dict()} ) try: response = await user_service.update_user(user_id, user_data) return response except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except RuntimeError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.error(f"Unexpected error updating user: {e}") raise HTTPException(status_code=500, detail="Internal server error") @router.delete("/{user_id}", status_code=204) async def delete_user( user_id: str, request: Request ): """ Delete user by ID This endpoint no longer requires authentication """ log_request( {"path": request.url.path, "method": request.method, "user_id": user_id} ) try: await user_service.delete_user(user_id) return None except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except RuntimeError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.error(f"Unexpected error deleting user: {e}") raise HTTPException(status_code=500, detail="Internal server error")