users.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """
  2. Users Router - Proxy to User Service
  3. """
  4. from fastapi import APIRouter, HTTPException, Depends
  5. from typing import List, Optional
  6. import httpx
  7. from shared.config import settings
  8. from shared.auth import get_current_user, get_current_admin
  9. from shared.models.user import User, UserCreate, UserUpdate, UserResponse
  10. router = APIRouter()
  11. # User service URL
  12. USER_SERVICE_URL = f"http://user-service:8002"
  13. @router.get("/users/me", response_model=UserResponse)
  14. async def get_current_user_info(
  15. current_user: User = Depends(get_current_user)
  16. ):
  17. """Get current user information"""
  18. try:
  19. async with httpx.AsyncClient() as client:
  20. response = await client.get(
  21. f"{USER_SERVICE_URL}/users/me",
  22. headers={"Authorization": f"Bearer {current_user.token}"}
  23. )
  24. response.raise_for_status()
  25. return response.json()
  26. except httpx.HTTPError as e:
  27. raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")
  28. @router.put("/users/me", response_model=UserResponse)
  29. async def update_current_user(
  30. user_update: UserUpdate,
  31. current_user: User = Depends(get_current_user)
  32. ):
  33. """Update current user information"""
  34. try:
  35. async with httpx.AsyncClient() as client:
  36. response = await client.put(
  37. f"{USER_SERVICE_URL}/users/me",
  38. json=user_update.dict(exclude_unset=True),
  39. headers={"Authorization": f"Bearer {current_user.token}"}
  40. )
  41. response.raise_for_status()
  42. return response.json()
  43. except httpx.HTTPError as e:
  44. raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")
  45. @router.get("/users", response_model=List[UserResponse])
  46. async def list_users(
  47. skip: int = 0,
  48. limit: int = 100,
  49. current_admin: User = Depends(get_current_admin)
  50. ):
  51. """List all users (admin only)"""
  52. try:
  53. async with httpx.AsyncClient() as client:
  54. response = await client.get(
  55. f"{USER_SERVICE_URL}/users",
  56. params={"skip": skip, "limit": limit},
  57. headers={"Authorization": f"Bearer {current_admin.token}"}
  58. )
  59. response.raise_for_status()
  60. return response.json()
  61. except httpx.HTTPError as e:
  62. raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")
  63. @router.get("/users/{user_id}", response_model=UserResponse)
  64. async def get_user(
  65. user_id: str,
  66. current_admin: User = Depends(get_current_admin)
  67. ):
  68. """Get user by ID (admin only)"""
  69. try:
  70. async with httpx.AsyncClient() as client:
  71. response = await client.get(
  72. f"{USER_SERVICE_URL}/users/{user_id}",
  73. headers={"Authorization": f"Bearer {current_admin.token}"}
  74. )
  75. response.raise_for_status()
  76. return response.json()
  77. except httpx.HTTPError as e:
  78. raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")
  79. @router.put("/users/{user_id}", response_model=UserResponse)
  80. async def update_user(
  81. user_id: str,
  82. user_update: UserUpdate,
  83. current_admin: User = Depends(get_current_admin)
  84. ):
  85. """Update user by ID (admin only)"""
  86. try:
  87. async with httpx.AsyncClient() as client:
  88. response = await client.put(
  89. f"{USER_SERVICE_URL}/users/{user_id}",
  90. json=user_update.dict(exclude_unset=True),
  91. headers={"Authorization": f"Bearer {current_admin.token}"}
  92. )
  93. response.raise_for_status()
  94. return response.json()
  95. except httpx.HTTPError as e:
  96. raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")
  97. @router.delete("/users/{user_id}")
  98. async def delete_user(
  99. user_id: str,
  100. current_admin: User = Depends(get_current_admin)
  101. ):
  102. """Delete user by ID (admin only)"""
  103. try:
  104. async with httpx.AsyncClient() as client:
  105. response = await client.delete(
  106. f"{USER_SERVICE_URL}/users/{user_id}",
  107. headers={"Authorization": f"Bearer {current_admin.token}"}
  108. )
  109. response.raise_for_status()
  110. return {"message": "User deleted successfully"}
  111. except httpx.HTTPError as e:
  112. raise HTTPException(status_code=500, detail=f"User service error: {str(e)}")