| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  | #  Copyright 2024 The InfiniFlow Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | # | 
					
						
							|  |  |  |  | #  Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  | #  you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  | #  You may obtain a copy of the License at | 
					
						
							|  |  |  |  | # | 
					
						
							|  |  |  |  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  |  | # | 
					
						
							|  |  |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  | #  limitations under the License. | 
					
						
							|  |  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  | import re | 
					
						
							| 
									
										
										
										
											2024-04-19 18:02:53 +08:00
										 |  |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-15 14:43:44 +08:00
										 |  |  |  | from flask import request, session, redirect | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | from werkzeug.security import generate_password_hash, check_password_hash | 
					
						
							|  |  |  |  | from flask_login import login_required, current_user, login_user, logout_user | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 20:20:42 +08:00
										 |  |  |  | from api.db.db_models import TenantLLM | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  | from api.db.services.llm_service import TenantLLMService, LLMService | 
					
						
							| 
									
										
										
										
											2024-01-17 20:20:42 +08:00
										 |  |  |  | from api.utils.api_utils import server_error_response, validate_request | 
					
						
							| 
									
										
										
										
											2024-04-19 18:02:53 +08:00
										 |  |  |  | from api.utils import get_uuid, get_format_time, decrypt, download_img, current_timestamp, datetime_format | 
					
						
							| 
									
										
										
										
											2024-01-17 20:20:42 +08:00
										 |  |  |  | from api.db import UserTenantRole, LLMType | 
					
						
							| 
									
										
										
										
											2024-02-19 19:22:17 +08:00
										 |  |  |  | from api.settings import RetCode, GITHUB_OAUTH, CHAT_MDL, EMBEDDING_MDL, ASR_MDL, IMAGE2TEXT_MDL, PARSERS, API_KEY, \ | 
					
						
							| 
									
										
										
										
											2024-04-07 09:04:32 +08:00
										 |  |  |  |     LLM_FACTORY, LLM_BASE_URL | 
					
						
							| 
									
										
										
										
											2024-01-17 20:20:42 +08:00
										 |  |  |  | from api.db.services.user_service import UserService, TenantService, UserTenantService | 
					
						
							| 
									
										
										
										
											2024-04-26 17:21:53 +08:00
										 |  |  |  | from api.db.services.file_service import FileService | 
					
						
							| 
									
										
										
										
											2024-01-17 20:20:42 +08:00
										 |  |  |  | from api.settings import stat_logger | 
					
						
							|  |  |  |  | from api.utils.api_utils import get_json_result, cors_reponse | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route('/login', methods=['POST', 'GET']) | 
					
						
							|  |  |  |  | def login(): | 
					
						
							|  |  |  |  |     login_channel = "password" | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |     if not request.json: | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |         return get_json_result(data=False, retcode=RetCode.AUTHENTICATION_ERROR, | 
					
						
							|  |  |  |  |                                retmsg='Unautherized!') | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |     email = request.json.get('email', "") | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     users = UserService.query(email=email) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |     if not users: | 
					
						
							|  |  |  |  |         return get_json_result( | 
					
						
							|  |  |  |  |             data=False, retcode=RetCode.AUTHENTICATION_ERROR, retmsg=f'This Email is not registered!') | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     password = request.json.get('password') | 
					
						
							|  |  |  |  |     try: | 
					
						
							|  |  |  |  |         password = decrypt(password) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |     except BaseException: | 
					
						
							|  |  |  |  |         return get_json_result( | 
					
						
							|  |  |  |  |             data=False, retcode=RetCode.SERVER_ERROR, retmsg='Fail to crypt password') | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     user = UserService.query_user(email, password) | 
					
						
							|  |  |  |  |     if user: | 
					
						
							|  |  |  |  |         response_data = user.to_json() | 
					
						
							|  |  |  |  |         user.access_token = get_uuid() | 
					
						
							|  |  |  |  |         login_user(user) | 
					
						
							| 
									
										
										
										
											2024-04-19 18:02:53 +08:00
										 |  |  |  |         user.update_time = current_timestamp(), | 
					
						
							|  |  |  |  |         user.update_date = datetime_format(datetime.now()), | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |         user.save() | 
					
						
							|  |  |  |  |         msg = "Welcome back!" | 
					
						
							|  |  |  |  |         return cors_reponse(data=response_data, auth=user.get_id(), retmsg=msg) | 
					
						
							|  |  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         return get_json_result(data=False, retcode=RetCode.AUTHENTICATION_ERROR, | 
					
						
							|  |  |  |  |                                retmsg='Email and Password do not match!') | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route('/github_callback', methods=['GET']) | 
					
						
							|  |  |  |  | def github_callback(): | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |     import requests | 
					
						
							|  |  |  |  |     res = requests.post(GITHUB_OAUTH.get("url"), data={ | 
					
						
							|  |  |  |  |         "client_id": GITHUB_OAUTH.get("client_id"), | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         "client_secret": GITHUB_OAUTH.get("secret_key"), | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |         "code": request.args.get('code') | 
					
						
							|  |  |  |  |     }, headers={"Accept": "application/json"}) | 
					
						
							|  |  |  |  |     res = res.json() | 
					
						
							|  |  |  |  |     if "error" in res: | 
					
						
							| 
									
										
										
										
											2024-02-29 18:53:02 +08:00
										 |  |  |  |         return redirect("/?error=%s" % res["error_description"]) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |     if "user:email" not in res["scope"].split(","): | 
					
						
							| 
									
										
										
										
											2024-02-29 18:53:02 +08:00
										 |  |  |  |         return redirect("/?error=user:email not in scope") | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     session["access_token"] = res["access_token"] | 
					
						
							|  |  |  |  |     session["access_token_from"] = "github" | 
					
						
							|  |  |  |  |     userinfo = user_info_from_github(session["access_token"]) | 
					
						
							|  |  |  |  |     users = UserService.query(email=userinfo["email"]) | 
					
						
							|  |  |  |  |     user_id = get_uuid() | 
					
						
							|  |  |  |  |     if not users: | 
					
						
							|  |  |  |  |         try: | 
					
						
							|  |  |  |  |             try: | 
					
						
							|  |  |  |  |                 avatar = download_img(userinfo["avatar_url"]) | 
					
						
							|  |  |  |  |             except Exception as e: | 
					
						
							|  |  |  |  |                 stat_logger.exception(e) | 
					
						
							|  |  |  |  |                 avatar = "" | 
					
						
							|  |  |  |  |             users = user_register(user_id, { | 
					
						
							|  |  |  |  |                 "access_token": session["access_token"], | 
					
						
							|  |  |  |  |                 "email": userinfo["email"], | 
					
						
							|  |  |  |  |                 "avatar": avatar, | 
					
						
							|  |  |  |  |                 "nickname": userinfo["login"], | 
					
						
							|  |  |  |  |                 "login_channel": "github", | 
					
						
							|  |  |  |  |                 "last_login_time": get_format_time(), | 
					
						
							|  |  |  |  |                 "is_superuser": False, | 
					
						
							|  |  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |             if not users: | 
					
						
							|  |  |  |  |                 raise Exception('Register user failure.') | 
					
						
							|  |  |  |  |             if len(users) > 1: | 
					
						
							|  |  |  |  |                 raise Exception('Same E-mail exist!') | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |             user = users[0] | 
					
						
							|  |  |  |  |             login_user(user) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |             return redirect("/?auth=%s" % user.get_id()) | 
					
						
							| 
									
										
										
										
											2024-02-29 14:03:07 +08:00
										 |  |  |  |         except Exception as e: | 
					
						
							|  |  |  |  |             rollback_user_registration(user_id) | 
					
						
							|  |  |  |  |             stat_logger.exception(e) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |             return redirect("/?error=%s" % str(e)) | 
					
						
							| 
									
										
										
										
											2024-03-07 16:12:01 +08:00
										 |  |  |  |     user = users[0] | 
					
						
							| 
									
										
										
										
											2024-03-19 15:31:47 +08:00
										 |  |  |  |     user.access_token = get_uuid() | 
					
						
							| 
									
										
										
										
											2024-03-07 16:12:01 +08:00
										 |  |  |  |     login_user(user) | 
					
						
							| 
									
										
										
										
											2024-03-19 15:31:47 +08:00
										 |  |  |  |     user.save() | 
					
						
							| 
									
										
										
										
											2024-03-07 16:12:01 +08:00
										 |  |  |  |     return redirect("/?auth=%s" % user.get_id()) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | def user_info_from_github(access_token): | 
					
						
							|  |  |  |  |     import requests | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |     headers = {"Accept": "application/json", | 
					
						
							|  |  |  |  |                'Authorization': f"token {access_token}"} | 
					
						
							|  |  |  |  |     res = requests.get( | 
					
						
							|  |  |  |  |         f"https://api.github.com/user?access_token={access_token}", | 
					
						
							|  |  |  |  |         headers=headers) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     user_info = res.json() | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |     email_info = requests.get( | 
					
						
							|  |  |  |  |         f"https://api.github.com/user/emails?access_token={access_token}", | 
					
						
							|  |  |  |  |         headers=headers).json() | 
					
						
							|  |  |  |  |     user_info["email"] = next( | 
					
						
							|  |  |  |  |         (email for email in email_info if email['primary'] == True), | 
					
						
							|  |  |  |  |         None)["email"] | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     return user_info | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route("/logout", methods=['GET']) | 
					
						
							|  |  |  |  | @login_required | 
					
						
							|  |  |  |  | def log_out(): | 
					
						
							|  |  |  |  |     current_user.access_token = "" | 
					
						
							|  |  |  |  |     current_user.save() | 
					
						
							|  |  |  |  |     logout_user() | 
					
						
							|  |  |  |  |     return get_json_result(data=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route("/setting", methods=["POST"]) | 
					
						
							|  |  |  |  | @login_required | 
					
						
							|  |  |  |  | def setting_user(): | 
					
						
							|  |  |  |  |     update_dict = {} | 
					
						
							|  |  |  |  |     request_data = request.json | 
					
						
							|  |  |  |  |     if request_data.get("password"): | 
					
						
							|  |  |  |  |         new_password = request_data.get("new_password") | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         if not check_password_hash( | 
					
						
							|  |  |  |  |                 current_user.password, decrypt(request_data["password"])): | 
					
						
							|  |  |  |  |             return get_json_result( | 
					
						
							|  |  |  |  |                 data=False, retcode=RetCode.AUTHENTICATION_ERROR, retmsg='Password error!') | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         if new_password: | 
					
						
							|  |  |  |  |             update_dict["password"] = generate_password_hash( | 
					
						
							|  |  |  |  |                 decrypt(new_password)) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     for k in request_data.keys(): | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         if k in ["password", "new_password"]: | 
					
						
							|  |  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |         update_dict[k] = request_data[k] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     try: | 
					
						
							|  |  |  |  |         UserService.update_by_id(current_user.id, update_dict) | 
					
						
							|  |  |  |  |         return get_json_result(data=True) | 
					
						
							|  |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         stat_logger.exception(e) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         return get_json_result( | 
					
						
							|  |  |  |  |             data=False, retmsg='Update failure!', retcode=RetCode.EXCEPTION_ERROR) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route("/info", methods=["GET"]) | 
					
						
							|  |  |  |  | @login_required | 
					
						
							|  |  |  |  | def user_info(): | 
					
						
							|  |  |  |  |     return get_json_result(data=current_user.to_dict()) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  | def rollback_user_registration(user_id): | 
					
						
							| 
									
										
										
										
											2024-04-08 19:20:57 +08:00
										 |  |  |  |     try: | 
					
						
							|  |  |  |  |         UserService.delete_by_id(user_id) | 
					
						
							|  |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         pass | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  |     try: | 
					
						
							|  |  |  |  |         TenantService.delete_by_id(user_id) | 
					
						
							|  |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         pass | 
					
						
							|  |  |  |  |     try: | 
					
						
							|  |  |  |  |         u = UserTenantService.query(tenant_id=user_id) | 
					
						
							|  |  |  |  |         if u: | 
					
						
							|  |  |  |  |             UserTenantService.delete_by_id(u[0].id) | 
					
						
							|  |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         pass | 
					
						
							|  |  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         TenantLLM.delete().where(TenantLLM.tenant_id == user_id).excute() | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         pass | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  | def user_register(user_id, user): | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     user["id"] = user_id | 
					
						
							|  |  |  |  |     tenant = { | 
					
						
							|  |  |  |  |         "id": user_id, | 
					
						
							|  |  |  |  |         "name": user["nickname"] + "‘s Kingdom", | 
					
						
							|  |  |  |  |         "llm_id": CHAT_MDL, | 
					
						
							|  |  |  |  |         "embd_id": EMBEDDING_MDL, | 
					
						
							|  |  |  |  |         "asr_id": ASR_MDL, | 
					
						
							|  |  |  |  |         "parser_ids": PARSERS, | 
					
						
							|  |  |  |  |         "img2txt_id": IMAGE2TEXT_MDL | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     usr_tenant = { | 
					
						
							|  |  |  |  |         "tenant_id": user_id, | 
					
						
							|  |  |  |  |         "user_id": user_id, | 
					
						
							|  |  |  |  |         "invited_by": user_id, | 
					
						
							|  |  |  |  |         "role": UserTenantRole.OWNER | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-04-26 17:21:53 +08:00
										 |  |  |  |     file_id = get_uuid() | 
					
						
							|  |  |  |  |     file = { | 
					
						
							|  |  |  |  |         "id": file_id, | 
					
						
							|  |  |  |  |         "parent_id": file_id, | 
					
						
							|  |  |  |  |         "tenant_id": user_id, | 
					
						
							|  |  |  |  |         "created_by": user_id, | 
					
						
							|  |  |  |  |         "name": "/", | 
					
						
							|  |  |  |  |         "type": FileType.FOLDER, | 
					
						
							|  |  |  |  |         "size": 0, | 
					
						
							|  |  |  |  |         "location": "", | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  |     tenant_llm = [] | 
					
						
							| 
									
										
										
										
											2024-02-19 19:22:17 +08:00
										 |  |  |  |     for llm in LLMService.query(fid=LLM_FACTORY): | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         tenant_llm.append({"tenant_id": user_id, | 
					
						
							|  |  |  |  |                            "llm_factory": LLM_FACTORY, | 
					
						
							|  |  |  |  |                            "llm_name": llm.llm_name, | 
					
						
							|  |  |  |  |                            "model_type": llm.model_type, | 
					
						
							| 
									
										
										
										
											2024-04-07 09:04:32 +08:00
										 |  |  |  |                            "api_key": API_KEY, | 
					
						
							| 
									
										
										
										
											2024-04-08 09:05:40 +08:00
										 |  |  |  |                            "api_base": LLM_BASE_URL | 
					
						
							| 
									
										
										
										
											2024-04-07 09:04:32 +08:00
										 |  |  |  |                            }) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     if not UserService.save(**user): | 
					
						
							|  |  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-02-27 17:51:54 +08:00
										 |  |  |  |     TenantService.insert(**tenant) | 
					
						
							|  |  |  |  |     UserTenantService.insert(**usr_tenant) | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  |     TenantLLMService.insert_many(tenant_llm) | 
					
						
							| 
									
										
										
										
											2024-04-26 17:21:53 +08:00
										 |  |  |  |     FileService.insert(file) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     return UserService.query(email=user["email"]) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route("/register", methods=["POST"]) | 
					
						
							|  |  |  |  | @validate_request("nickname", "email", "password") | 
					
						
							|  |  |  |  | def user_add(): | 
					
						
							|  |  |  |  |     req = request.json | 
					
						
							|  |  |  |  |     if UserService.query(email=req["email"]): | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         return get_json_result( | 
					
						
							|  |  |  |  |             data=False, retmsg=f'Email: {req["email"]} has already registered!', retcode=RetCode.OPERATING_ERROR) | 
					
						
							| 
									
										
										
										
											2024-01-19 19:51:57 +08:00
										 |  |  |  |     if not re.match(r"^[\w\._-]+@([\w_-]+\.)+[\w-]{2,4}$", req["email"]): | 
					
						
							|  |  |  |  |         return get_json_result(data=False, retmsg=f'Invaliad e-mail: {req["email"]}!', | 
					
						
							|  |  |  |  |                                retcode=RetCode.OPERATING_ERROR) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     user_dict = { | 
					
						
							|  |  |  |  |         "access_token": get_uuid(), | 
					
						
							|  |  |  |  |         "email": req["email"], | 
					
						
							|  |  |  |  |         "nickname": req["nickname"], | 
					
						
							|  |  |  |  |         "password": decrypt(req["password"]), | 
					
						
							|  |  |  |  |         "login_channel": "password", | 
					
						
							|  |  |  |  |         "last_login_time": get_format_time(), | 
					
						
							|  |  |  |  |         "is_superuser": False, | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     user_id = get_uuid() | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  |         users = user_register(user_id, user_dict) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         if not users: | 
					
						
							|  |  |  |  |             raise Exception('Register user failure.') | 
					
						
							|  |  |  |  |         if len(users) > 1: | 
					
						
							|  |  |  |  |             raise Exception('Same E-mail exist!') | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |         user = users[0] | 
					
						
							|  |  |  |  |         login_user(user) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         return cors_reponse(data=user.to_json(), | 
					
						
							|  |  |  |  |                             auth=user.get_id(), retmsg="Welcome aboard!") | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |     except Exception as e: | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  |         rollback_user_registration(user_id) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |         stat_logger.exception(e) | 
					
						
							| 
									
										
										
										
											2024-03-27 11:33:46 +08:00
										 |  |  |  |         return get_json_result( | 
					
						
							|  |  |  |  |             data=False, retmsg='User registration failure!', retcode=RetCode.EXCEPTION_ERROR) | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route("/tenant_info", methods=["GET"]) | 
					
						
							|  |  |  |  | @login_required | 
					
						
							|  |  |  |  | def tenant_info(): | 
					
						
							|  |  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2024-01-15 19:47:25 +08:00
										 |  |  |  |         tenants = TenantService.get_by_user_id(current_user.id)[0] | 
					
						
							| 
									
										
										
										
											2024-01-15 08:46:22 +08:00
										 |  |  |  |         return get_json_result(data=tenants) | 
					
						
							|  |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         return server_error_response(e) | 
					
						
							| 
									
										
										
										
											2024-01-17 09:43:27 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | @manager.route("/set_tenant_info", methods=["POST"]) | 
					
						
							|  |  |  |  | @login_required | 
					
						
							|  |  |  |  | @validate_request("tenant_id", "asr_id", "embd_id", "img2txt_id", "llm_id") | 
					
						
							|  |  |  |  | def set_tenant_info(): | 
					
						
							|  |  |  |  |     req = request.json | 
					
						
							|  |  |  |  |     try: | 
					
						
							|  |  |  |  |         tid = req["tenant_id"] | 
					
						
							|  |  |  |  |         del req["tenant_id"] | 
					
						
							|  |  |  |  |         TenantService.update_by_id(tid, req) | 
					
						
							|  |  |  |  |         return get_json_result(data=True) | 
					
						
							|  |  |  |  |     except Exception as e: | 
					
						
							|  |  |  |  |         return server_error_response(e) |