| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2024-08-28 06:10:27 +08:00
										 |  |  | from typing import Optional | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-10 16:54:13 +08:00
										 |  |  | from open_webui.internal.db import Base, JSONField, get_db | 
					
						
							| 
									
										
										
										
											2025-01-21 15:20:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-10 16:54:13 +08:00
										 |  |  | from open_webui.models.chats import Chats | 
					
						
							| 
									
										
										
										
											2025-01-21 15:20:47 +08:00
										 |  |  | from open_webui.models.groups import Groups | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-28 06:10:27 +08:00
										 |  |  | from pydantic import BaseModel, ConfigDict | 
					
						
							|  |  |  | from sqlalchemy import BigInteger, Column, String, Text | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  | from sqlalchemy import or_ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-29 15:02:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | #################### | 
					
						
							|  |  |  | # User DB Schema | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  | class User(Base): | 
					
						
							|  |  |  |     __tablename__ = "user" | 
					
						
							| 
									
										
										
										
											2024-04-28 07:38:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  |     id = Column(String, primary_key=True) | 
					
						
							|  |  |  |     name = Column(String) | 
					
						
							|  |  |  |     email = Column(String) | 
					
						
							|  |  |  |     role = Column(String) | 
					
						
							| 
									
										
										
										
											2024-06-24 19:21:51 +08:00
										 |  |  |     profile_image_url = Column(Text) | 
					
						
							| 
									
										
										
										
											2024-04-28 07:38:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  |     last_active_at = Column(BigInteger) | 
					
						
							|  |  |  |     updated_at = Column(BigInteger) | 
					
						
							|  |  |  |     created_at = Column(BigInteger) | 
					
						
							| 
									
										
										
										
											2023-12-26 13:44:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  |     api_key = Column(String, nullable=True, unique=True) | 
					
						
							|  |  |  |     settings = Column(JSONField, nullable=True) | 
					
						
							|  |  |  |     info = Column(JSONField, nullable=True) | 
					
						
							| 
									
										
										
										
											2024-05-26 15:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  |     oauth_sub = Column(Text, unique=True) | 
					
						
							| 
									
										
										
										
											2023-12-26 13:44:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 13:47:42 +08:00
										 |  |  | class UserSettings(BaseModel): | 
					
						
							|  |  |  |     ui: Optional[dict] = {} | 
					
						
							|  |  |  |     model_config = ConfigDict(extra="allow") | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | class UserModel(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     email: str | 
					
						
							| 
									
										
										
										
											2023-11-19 13:41:43 +08:00
										 |  |  |     role: str = "pending" | 
					
						
							| 
									
										
										
										
											2024-04-04 13:36:27 +08:00
										 |  |  |     profile_image_url: str | 
					
						
							| 
									
										
										
										
											2024-04-28 07:38:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     last_active_at: int  # timestamp in epoch | 
					
						
							|  |  |  |     updated_at: int  # timestamp in epoch | 
					
						
							|  |  |  |     created_at: int  # timestamp in epoch | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-03 00:23:55 +08:00
										 |  |  |     api_key: Optional[str] = None | 
					
						
							| 
									
										
										
										
											2024-05-27 13:47:42 +08:00
										 |  |  |     settings: Optional[UserSettings] = None | 
					
						
							| 
									
										
										
										
											2024-06-17 06:32:26 +08:00
										 |  |  |     info: Optional[dict] = None | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-26 15:37:09 +08:00
										 |  |  |     oauth_sub: Optional[str] = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |     model_config = ConfigDict(from_attributes=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | # Forms | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  | class UserListResponse(BaseModel): | 
					
						
							|  |  |  |     users: list[UserModel] | 
					
						
							|  |  |  |     total: int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-18 21:37:04 +08:00
										 |  |  | class UserResponse(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     email: str | 
					
						
							|  |  |  |     role: str | 
					
						
							|  |  |  |     profile_image_url: str | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-23 12:50:14 +08:00
										 |  |  | class UserNameResponse(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     role: str | 
					
						
							|  |  |  |     profile_image_url: str | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 16:13:59 +08:00
										 |  |  | class UserRoleUpdateForm(BaseModel): | 
					
						
							|  |  |  |     id: str | 
					
						
							|  |  |  |     role: str | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | class UserUpdateForm(BaseModel): | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     email: str | 
					
						
							|  |  |  |     profile_image_url: str | 
					
						
							|  |  |  |     password: Optional[str] = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-04 06:33:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | class UsersTable: | 
					
						
							|  |  |  |     def insert_new_user( | 
					
						
							| 
									
										
										
										
											2024-04-04 16:10:51 +08:00
										 |  |  |         self, | 
					
						
							|  |  |  |         id: str, | 
					
						
							|  |  |  |         name: str, | 
					
						
							|  |  |  |         email: str, | 
					
						
							| 
									
										
										
										
											2024-04-07 14:16:29 +08:00
										 |  |  |         profile_image_url: str = "/user.png", | 
					
						
							| 
									
										
										
										
											2024-04-04 16:10:51 +08:00
										 |  |  |         role: str = "pending", | 
					
						
							| 
									
										
										
										
											2024-05-26 15:37:09 +08:00
										 |  |  |         oauth_sub: Optional[str] = None, | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  |     ) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |         with get_db() as db: | 
					
						
							|  |  |  |             user = UserModel( | 
					
						
							|  |  |  |                 **{ | 
					
						
							|  |  |  |                     "id": id, | 
					
						
							|  |  |  |                     "name": name, | 
					
						
							|  |  |  |                     "email": email, | 
					
						
							|  |  |  |                     "role": role, | 
					
						
							|  |  |  |                     "profile_image_url": profile_image_url, | 
					
						
							|  |  |  |                     "last_active_at": int(time.time()), | 
					
						
							|  |  |  |                     "created_at": int(time.time()), | 
					
						
							|  |  |  |                     "updated_at": int(time.time()), | 
					
						
							|  |  |  |                     "oauth_sub": oauth_sub, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             result = User(**user.model_dump()) | 
					
						
							|  |  |  |             db.add(result) | 
					
						
							|  |  |  |             db.commit() | 
					
						
							|  |  |  |             db.refresh(result) | 
					
						
							|  |  |  |             if result: | 
					
						
							|  |  |  |                 return user | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return None | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_user_by_id(self, id: str) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-28 06:10:27 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_user_by_api_key(self, api_key: str) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(api_key=api_key).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_user_by_email(self, email: str) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(email=email).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-26 15:37:09 +08:00
										 |  |  |     def get_user_by_oauth_sub(self, sub: str) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(oauth_sub=sub).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-25 15:53:25 +08:00
										 |  |  |     def get_users( | 
					
						
							| 
									
										
										
										
											2025-04-28 12:11:41 +08:00
										 |  |  |         self, | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  |         filter: Optional[dict] = None, | 
					
						
							| 
									
										
										
										
											2025-04-28 12:11:41 +08:00
										 |  |  |         skip: Optional[int] = None, | 
					
						
							|  |  |  |         limit: Optional[int] = None, | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  |     ) -> UserListResponse: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |         with get_db() as db: | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  |             query = db.query(User) | 
					
						
							| 
									
										
										
										
											2024-12-25 15:53:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  |             if filter: | 
					
						
							|  |  |  |                 query_key = filter.get("query") | 
					
						
							|  |  |  |                 if query_key: | 
					
						
							|  |  |  |                     query = query.filter( | 
					
						
							| 
									
										
										
										
											2025-04-28 12:11:41 +08:00
										 |  |  |                         or_( | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  |                             User.name.ilike(f"%{query_key}%"), | 
					
						
							|  |  |  |                             User.email.ilike(f"%{query_key}%"), | 
					
						
							| 
									
										
										
										
											2025-04-28 12:11:41 +08:00
										 |  |  |                         ) | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 order_by = filter.get("order_by") | 
					
						
							|  |  |  |                 direction = filter.get("direction") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if order_by == "name": | 
					
						
							|  |  |  |                     if direction == "asc": | 
					
						
							|  |  |  |                         query = query.order_by(User.name.asc()) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         query = query.order_by(User.name.desc()) | 
					
						
							|  |  |  |                 elif order_by == "email": | 
					
						
							|  |  |  |                     if direction == "asc": | 
					
						
							|  |  |  |                         query = query.order_by(User.email.asc()) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         query = query.order_by(User.email.desc()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 elif order_by == "created_at": | 
					
						
							|  |  |  |                     if direction == "asc": | 
					
						
							|  |  |  |                         query = query.order_by(User.created_at.asc()) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         query = query.order_by(User.created_at.desc()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 elif order_by == "last_active_at": | 
					
						
							|  |  |  |                     if direction == "asc": | 
					
						
							|  |  |  |                         query = query.order_by(User.last_active_at.asc()) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         query = query.order_by(User.last_active_at.desc()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 elif order_by == "updated_at": | 
					
						
							|  |  |  |                     if direction == "asc": | 
					
						
							|  |  |  |                         query = query.order_by(User.updated_at.asc()) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         query = query.order_by(User.updated_at.desc()) | 
					
						
							|  |  |  |                 elif order_by == "role": | 
					
						
							|  |  |  |                     if direction == "asc": | 
					
						
							|  |  |  |                         query = query.order_by(User.role.asc()) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         query = query.order_by(User.role.desc()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 query = query.order_by(User.created_at.desc()) | 
					
						
							| 
									
										
										
										
											2024-12-25 15:53:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if skip: | 
					
						
							|  |  |  |                 query = query.offset(skip) | 
					
						
							|  |  |  |             if limit: | 
					
						
							|  |  |  |                 query = query.limit(limit) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             users = query.all() | 
					
						
							| 
									
										
										
										
											2025-04-30 20:49:41 +08:00
										 |  |  |             return { | 
					
						
							|  |  |  |                 "users": [UserModel.model_validate(user) for user in users], | 
					
						
							|  |  |  |                 "total": db.query(User).count(), | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-12-25 15:53:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_users_by_user_ids(self, user_ids: list[str]) -> list[UserModel]: | 
					
						
							|  |  |  |         with get_db() as db: | 
					
						
							|  |  |  |             users = db.query(User).filter(User.id.in_(user_ids)).all() | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             return [UserModel.model_validate(user) for user in users] | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_num_users(self) -> Optional[int]: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |         with get_db() as db: | 
					
						
							|  |  |  |             return db.query(User).count() | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_first_user(self) -> UserModel: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).order_by(User.created_at).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-05-02 10:59:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-21 14:54:43 +08:00
										 |  |  |     def get_user_webhook_url_by_id(self, id: str) -> Optional[str]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							| 
									
										
										
										
											2024-12-25 15:53:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 if user.settings is None: | 
					
						
							|  |  |  |                     return None | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     return ( | 
					
						
							|  |  |  |                         user.settings.get("ui", {}) | 
					
						
							|  |  |  |                         .get("notifications", {}) | 
					
						
							|  |  |  |                         .get("webhook_url", None) | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2024-12-21 14:54:43 +08:00
										 |  |  |         except Exception: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 15:57:08 +08:00
										 |  |  |     def update_user_role_by_id(self, id: str, role: str) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 db.query(User).filter_by(id=id).update({"role": role}) | 
					
						
							|  |  |  |                 db.commit() | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2023-11-19 16:13:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 12:27:45 +08:00
										 |  |  |     def update_user_profile_image_url_by_id( | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |         self, id: str, profile_image_url: str | 
					
						
							| 
									
										
										
										
											2024-01-27 12:27:45 +08:00
										 |  |  |     ) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 db.query(User).filter_by(id=id).update( | 
					
						
							|  |  |  |                     {"profile_image_url": profile_image_url} | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-01-27 12:27:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 15:57:08 +08:00
										 |  |  |     def update_user_last_active_by_id(self, id: str) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 db.query(User).filter_by(id=id).update( | 
					
						
							|  |  |  |                     {"last_active_at": int(time.time())} | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.commit() | 
					
						
							| 
									
										
										
										
											2024-04-28 07:38:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-04-28 07:38:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-28 01:07:38 +08:00
										 |  |  |     def update_user_oauth_sub_by_id( | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |         self, id: str, oauth_sub: str | 
					
						
							| 
									
										
										
										
											2024-05-28 01:07:38 +08:00
										 |  |  |     ) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 db.query(User).filter_by(id=id).update({"oauth_sub": oauth_sub}) | 
					
						
							| 
									
										
										
										
											2024-07-08 14:01:15 +08:00
										 |  |  |                 db.commit() | 
					
						
							| 
									
										
										
										
											2024-05-28 01:07:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-05-28 01:07:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 15:57:08 +08:00
										 |  |  |     def update_user_by_id(self, id: str, updated: dict) -> Optional[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 db.query(User).filter_by(id=id).update(updated) | 
					
						
							|  |  |  |                 db.commit() | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							|  |  |  |                 # return UserModel(**user.dict()) | 
					
						
							| 
									
										
										
										
											2024-08-28 06:10:27 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-12 15:42:31 +08:00
										 |  |  |     def update_user_settings_by_id(self, id: str, updated: dict) -> Optional[UserModel]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user_settings = db.query(User).filter_by(id=id).first().settings | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if user_settings is None: | 
					
						
							|  |  |  |                     user_settings = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 user_settings.update(updated) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 db.query(User).filter_by(id=id).update({"settings": user_settings}) | 
					
						
							|  |  |  |                 db.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |     def delete_user_by_id(self, id: str) -> bool: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2025-01-21 15:20:47 +08:00
										 |  |  |             # Remove User from Groups | 
					
						
							|  |  |  |             Groups.remove_user_from_all_groups(id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             # Delete User Chats | 
					
						
							|  |  |  |             result = Chats.delete_chats_by_user_id(id) | 
					
						
							|  |  |  |             if result: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |                 with get_db() as db: | 
					
						
							|  |  |  |                     # Delete User | 
					
						
							|  |  |  |                     db.query(User).filter_by(id=id).delete() | 
					
						
							|  |  |  |                     db.commit() | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |                 return False | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return False | 
					
						
							| 
									
										
										
										
											2023-12-29 15:02:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |     def update_user_api_key_by_id(self, id: str, api_key: str) -> str: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 result = db.query(User).filter_by(id=id).update({"api_key": api_key}) | 
					
						
							|  |  |  |                 db.commit() | 
					
						
							|  |  |  |                 return True if result == 1 else False | 
					
						
							| 
									
										
										
										
											2024-08-14 20:38:19 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return False | 
					
						
							| 
									
										
										
										
											2023-12-29 15:02:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  |     def get_user_api_key_by_id(self, id: str) -> Optional[str]: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |             with get_db() as db: | 
					
						
							|  |  |  |                 user = db.query(User).filter_by(id=id).first() | 
					
						
							|  |  |  |                 return user.api_key | 
					
						
							| 
									
										
										
										
											2024-08-28 06:10:27 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-06-24 19:06:15 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-04-03 00:27:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-21 15:09:55 +08:00
										 |  |  |     def get_valid_user_ids(self, user_ids: list[str]) -> list[str]: | 
					
						
							|  |  |  |         with get_db() as db: | 
					
						
							|  |  |  |             users = db.query(User).filter(User.id.in_(user_ids)).all() | 
					
						
							|  |  |  |             return [user.id for user in users] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-05 23:38:36 +08:00
										 |  |  |     def get_super_admin_user(self) -> Optional[UserModel]: | 
					
						
							|  |  |  |         with get_db() as db: | 
					
						
							|  |  |  |             user = db.query(User).filter_by(role="admin").first() | 
					
						
							|  |  |  |             if user: | 
					
						
							|  |  |  |                 return UserModel.model_validate(user) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  | Users = UsersTable() |