| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  | from pydantic import BaseModel, ConfigDict, parse_obj_as | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | from typing import List, Union, Optional | 
					
						
							|  |  |  | import time | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | from sqlalchemy import String, Column, BigInteger, Text | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 13:41:43 +08:00
										 |  |  | from utils.misc import get_gravatar_url | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  | from apps.webui.internal.db import Base, JSONField, Session, get_db | 
					
						
							| 
									
										
										
										
											2024-05-26 16:15:48 +08:00
										 |  |  | from apps.webui.models.chats import Chats | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | #################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  |     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-06-24 19:06:15 +08:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-06-21 20:58:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_users(self, skip: int = 0, limit: int = 50) -> List[UserModel]: | 
					
						
							| 
									
										
										
										
											2024-07-04 14:32:39 +08:00
										 |  |  |         with get_db() as db: | 
					
						
							|  |  |  |             users = ( | 
					
						
							|  |  |  |                 db.query(User) | 
					
						
							|  |  |  |                 # .offset(skip).limit(limit) | 
					
						
							|  |  |  |                 .all() | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-05-02 10:59:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             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: | 
					
						
							|  |  |  |             # 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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             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-06-24 19:06:15 +08:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-04-03 00:27:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-19 08:47:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 21:03:31 +08:00
										 |  |  | Users = UsersTable() |