""" Users Router - Proxy to User Service """ from fastapi import APIRouter, HTTPException, Depends from typing import List, Optional import httpx from shared.config import settings from shared.auth import get_current_user, get_current_admin from shared.models.user import User, UserCreate, UserUpdate, UserResponse router = APIRouter() # User service URL USER_SERVICE_URL = f"http://user-service:8002" @router.get("/users/me", response_model=UserResponse) async def get_current_user_info( current_user: User = Depends(get_current_user) ): """Get current user information""" try: async with httpx.AsyncClient() as client: response = await client.get( f"{USER_SERVICE_URL}/users/me", headers={"Authorization": f"Bearer {current_user.token}"} ) response.raise_for_status() return response.json() except httpx.HTTPError as e: raise HTTPException(status_code=500, detail=f"User service error: {str(e)}") @router.put("/users/me", response_model=UserResponse) async def update_current_user( user_update: UserUpdate, current_user: User = Depends(get_current_user) ): """Update current user information""" try: async with httpx.AsyncClient() as client: response = await client.put( f"{USER_SERVICE_URL}/users/me", json=user_update.dict(exclude_unset=True), headers={"Authorization": f"Bearer {current_user.token}"} ) response.raise_for_status() return response.json() except httpx.HTTPError as e: raise HTTPException(status_code=500, detail=f"User service error: {str(e)}") @router.get("/users", response_model=List[UserResponse]) async def list_users( skip: int = 0, limit: int = 100, current_admin: User = Depends(get_current_admin) ): """List all users (admin only)""" try: async with httpx.AsyncClient() as client: response = await client.get( f"{USER_SERVICE_URL}/users", params={"skip": skip, "limit": limit}, headers={"Authorization": f"Bearer {current_admin.token}"} ) response.raise_for_status() return response.json() except httpx.HTTPError as e: raise HTTPException(status_code=500, detail=f"User service error: {str(e)}") @router.get("/users/{user_id}", response_model=UserResponse) async def get_user( user_id: str, current_admin: User = Depends(get_current_admin) ): """Get user by ID (admin only)""" try: async with httpx.AsyncClient() as client: response = await client.get( f"{USER_SERVICE_URL}/users/{user_id}", headers={"Authorization": f"Bearer {current_admin.token}"} ) response.raise_for_status() return response.json() except httpx.HTTPError as e: raise HTTPException(status_code=500, detail=f"User service error: {str(e)}") @router.put("/users/{user_id}", response_model=UserResponse) async def update_user( user_id: str, user_update: UserUpdate, current_admin: User = Depends(get_current_admin) ): """Update user by ID (admin only)""" try: async with httpx.AsyncClient() as client: response = await client.put( f"{USER_SERVICE_URL}/users/{user_id}", json=user_update.dict(exclude_unset=True), headers={"Authorization": f"Bearer {current_admin.token}"} ) response.raise_for_status() return response.json() except httpx.HTTPError as e: raise HTTPException(status_code=500, detail=f"User service error: {str(e)}") @router.delete("/users/{user_id}") async def delete_user( user_id: str, current_admin: User = Depends(get_current_admin) ): """Delete user by ID (admin only)""" try: async with httpx.AsyncClient() as client: response = await client.delete( f"{USER_SERVICE_URL}/users/{user_id}", headers={"Authorization": f"Bearer {current_admin.token}"} ) response.raise_for_status() return {"message": "User deleted successfully"} except httpx.HTTPError as e: raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")