| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- """
- 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)}")
|