users.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. from fastapi import Response, Request
  2. from fastapi import Depends, FastAPI, HTTPException, status
  3. from datetime import datetime, timedelta
  4. from typing import List, Union, Optional
  5. from fastapi import APIRouter
  6. from pydantic import BaseModel
  7. import time
  8. import uuid
  9. import logging
  10. from apps.webui.models.users import (
  11. UserModel,
  12. UserUpdateForm,
  13. UserRoleUpdateForm,
  14. UserSettings,
  15. Users,
  16. )
  17. from apps.webui.models.auths import Auths
  18. from apps.webui.models.chats import Chats
  19. from utils.utils import (
  20. get_verified_user,
  21. get_password_hash,
  22. get_current_user,
  23. get_admin_user,
  24. )
  25. from constants import ERROR_MESSAGES
  26. from config import SRC_LOG_LEVELS
  27. log = logging.getLogger(__name__)
  28. log.setLevel(SRC_LOG_LEVELS["MODELS"])
  29. router = APIRouter()
  30. ############################
  31. # GetUsers
  32. ############################
  33. @router.get("/", response_model=List[UserModel])
  34. async def get_users(skip: int = 0, limit: int = 50, user=Depends(get_admin_user)):
  35. return Users.get_users(skip, limit)
  36. ############################
  37. # User Permissions
  38. ############################
  39. @router.get("/permissions/user")
  40. async def get_user_permissions(request: Request, user=Depends(get_admin_user)):
  41. return request.app.state.config.USER_PERMISSIONS
  42. @router.post("/permissions/user")
  43. async def update_user_permissions(
  44. request: Request, form_data: dict, user=Depends(get_admin_user)
  45. ):
  46. request.app.state.config.USER_PERMISSIONS = form_data
  47. return request.app.state.config.USER_PERMISSIONS
  48. ############################
  49. # UpdateUserRole
  50. ############################
  51. @router.post("/update/role", response_model=Optional[UserModel])
  52. async def update_user_role(form_data: UserRoleUpdateForm, user=Depends(get_admin_user)):
  53. if user.id != form_data.id and form_data.id != Users.get_first_user().id:
  54. return Users.update_user_role_by_id(form_data.id, form_data.role)
  55. raise HTTPException(
  56. status_code=status.HTTP_403_FORBIDDEN,
  57. detail=ERROR_MESSAGES.ACTION_PROHIBITED,
  58. )
  59. ############################
  60. # GetUserSettingsBySessionUser
  61. ############################
  62. @router.get("/user/settings", response_model=Optional[UserSettings])
  63. async def get_user_settings_by_session_user(user=Depends(get_verified_user)):
  64. user = Users.get_user_by_id(user.id)
  65. if user:
  66. return user.settings
  67. else:
  68. raise HTTPException(
  69. status_code=status.HTTP_400_BAD_REQUEST,
  70. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  71. )
  72. ############################
  73. # UpdateUserSettingsBySessionUser
  74. ############################
  75. @router.post("/user/settings/update", response_model=UserSettings)
  76. async def update_user_settings_by_session_user(
  77. form_data: UserSettings, user=Depends(get_verified_user)
  78. ):
  79. user = Users.update_user_by_id(user.id, {"settings": form_data.model_dump()})
  80. if user:
  81. return user.settings
  82. else:
  83. raise HTTPException(
  84. status_code=status.HTTP_400_BAD_REQUEST,
  85. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  86. )
  87. ############################
  88. # GetUserById
  89. ############################
  90. class UserResponse(BaseModel):
  91. name: str
  92. profile_image_url: str
  93. @router.get("/{user_id}", response_model=UserResponse)
  94. async def get_user_by_id(user_id: str, user=Depends(get_verified_user)):
  95. # Check if user_id is a shared chat
  96. # If it is, get the user_id from the chat
  97. if user_id.startswith("shared-"):
  98. chat_id = user_id.replace("shared-", "")
  99. chat = Chats.get_chat_by_id(chat_id)
  100. if chat:
  101. user_id = chat.user_id
  102. else:
  103. raise HTTPException(
  104. status_code=status.HTTP_400_BAD_REQUEST,
  105. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  106. )
  107. user = Users.get_user_by_id(user_id)
  108. if user:
  109. return UserResponse(name=user.name, profile_image_url=user.profile_image_url)
  110. else:
  111. raise HTTPException(
  112. status_code=status.HTTP_400_BAD_REQUEST,
  113. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  114. )
  115. ############################
  116. # UpdateUserById
  117. ############################
  118. @router.post("/{user_id}/update", response_model=Optional[UserModel])
  119. async def update_user_by_id(
  120. user_id: str, form_data: UserUpdateForm, session_user=Depends(get_admin_user)
  121. ):
  122. user = Users.get_user_by_id(user_id)
  123. if user:
  124. if form_data.email.lower() != user.email:
  125. email_user = Users.get_user_by_email(form_data.email.lower())
  126. if email_user:
  127. raise HTTPException(
  128. status_code=status.HTTP_400_BAD_REQUEST,
  129. detail=ERROR_MESSAGES.EMAIL_TAKEN,
  130. )
  131. if form_data.password:
  132. hashed = get_password_hash(form_data.password)
  133. log.debug(f"hashed: {hashed}")
  134. Auths.update_user_password_by_id(user_id, hashed)
  135. Auths.update_email_by_id(user_id, form_data.email.lower())
  136. updated_user = Users.update_user_by_id(
  137. user_id,
  138. {
  139. "name": form_data.name,
  140. "email": form_data.email.lower(),
  141. "profile_image_url": form_data.profile_image_url,
  142. },
  143. )
  144. if updated_user:
  145. return updated_user
  146. raise HTTPException(
  147. status_code=status.HTTP_400_BAD_REQUEST,
  148. detail=ERROR_MESSAGES.DEFAULT(),
  149. )
  150. raise HTTPException(
  151. status_code=status.HTTP_400_BAD_REQUEST,
  152. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  153. )
  154. ############################
  155. # DeleteUserById
  156. ############################
  157. @router.delete("/{user_id}", response_model=bool)
  158. async def delete_user_by_id(user_id: str, user=Depends(get_admin_user)):
  159. if user.id != user_id:
  160. result = Auths.delete_auth_by_id(user_id)
  161. if result:
  162. return True
  163. raise HTTPException(
  164. status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
  165. detail=ERROR_MESSAGES.DELETE_USER_ERROR,
  166. )
  167. raise HTTPException(
  168. status_code=status.HTTP_403_FORBIDDEN,
  169. detail=ERROR_MESSAGES.ACTION_PROHIBITED,
  170. )