users.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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. # GetUserInfoBySessionUser
  89. ############################
  90. @router.get("/user/info", response_model=Optional[dict])
  91. async def get_user_info_by_session_user(user=Depends(get_verified_user)):
  92. user = Users.get_user_by_id(user.id)
  93. if user:
  94. return user.info
  95. else:
  96. raise HTTPException(
  97. status_code=status.HTTP_400_BAD_REQUEST,
  98. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  99. )
  100. ############################
  101. # UpdateUserInfoBySessionUser
  102. ############################
  103. @router.post("/user/info/update", response_model=Optional[dict])
  104. async def update_user_info_by_session_user(
  105. form_data: dict, user=Depends(get_verified_user)
  106. ):
  107. user = Users.get_user_by_id(user.id)
  108. if user:
  109. if user.info is None:
  110. user.info = {}
  111. user = Users.update_user_by_id(user.id, {"info": {**user.info, **form_data}})
  112. if user:
  113. return user.info
  114. else:
  115. raise HTTPException(
  116. status_code=status.HTTP_400_BAD_REQUEST,
  117. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  118. )
  119. else:
  120. raise HTTPException(
  121. status_code=status.HTTP_400_BAD_REQUEST,
  122. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  123. )
  124. ############################
  125. # GetUserById
  126. ############################
  127. class UserResponse(BaseModel):
  128. name: str
  129. profile_image_url: str
  130. @router.get("/{user_id}", response_model=UserResponse)
  131. async def get_user_by_id(user_id: str, user=Depends(get_verified_user)):
  132. # Check if user_id is a shared chat
  133. # If it is, get the user_id from the chat
  134. if user_id.startswith("shared-"):
  135. chat_id = user_id.replace("shared-", "")
  136. chat = Chats.get_chat_by_id(chat_id)
  137. if chat:
  138. user_id = chat.user_id
  139. else:
  140. raise HTTPException(
  141. status_code=status.HTTP_400_BAD_REQUEST,
  142. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  143. )
  144. user = Users.get_user_by_id(user_id)
  145. if user:
  146. return UserResponse(name=user.name, profile_image_url=user.profile_image_url)
  147. else:
  148. raise HTTPException(
  149. status_code=status.HTTP_400_BAD_REQUEST,
  150. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  151. )
  152. ############################
  153. # UpdateUserById
  154. ############################
  155. @router.post("/{user_id}/update", response_model=Optional[UserModel])
  156. async def update_user_by_id(
  157. user_id: str,
  158. form_data: UserUpdateForm,
  159. session_user=Depends(get_admin_user),
  160. ):
  161. user = Users.get_user_by_id(user_id)
  162. if user:
  163. if form_data.email.lower() != user.email:
  164. email_user = Users.get_user_by_email(form_data.email.lower())
  165. if email_user:
  166. raise HTTPException(
  167. status_code=status.HTTP_400_BAD_REQUEST,
  168. detail=ERROR_MESSAGES.EMAIL_TAKEN,
  169. )
  170. if form_data.password:
  171. hashed = get_password_hash(form_data.password)
  172. log.debug(f"hashed: {hashed}")
  173. Auths.update_user_password_by_id(user_id, hashed)
  174. Auths.update_email_by_id(user_id, form_data.email.lower())
  175. updated_user = Users.update_user_by_id(
  176. user_id,
  177. {
  178. "name": form_data.name,
  179. "email": form_data.email.lower(),
  180. "profile_image_url": form_data.profile_image_url,
  181. },
  182. )
  183. if updated_user:
  184. return updated_user
  185. raise HTTPException(
  186. status_code=status.HTTP_400_BAD_REQUEST,
  187. detail=ERROR_MESSAGES.DEFAULT(),
  188. )
  189. raise HTTPException(
  190. status_code=status.HTTP_400_BAD_REQUEST,
  191. detail=ERROR_MESSAGES.USER_NOT_FOUND,
  192. )
  193. ############################
  194. # DeleteUserById
  195. ############################
  196. @router.delete("/{user_id}", response_model=bool)
  197. async def delete_user_by_id(user_id: str, user=Depends(get_admin_user)):
  198. if user.id != user_id:
  199. result = Auths.delete_auth_by_id(user_id)
  200. if result:
  201. return True
  202. raise HTTPException(
  203. status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
  204. detail=ERROR_MESSAGES.DELETE_USER_ERROR,
  205. )
  206. raise HTTPException(
  207. status_code=status.HTTP_403_FORBIDDEN,
  208. detail=ERROR_MESSAGES.ACTION_PROHIBITED,
  209. )