| 
					
				 | 
			
			
				@@ -1,5 +1,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import base64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import json 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import secrets 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from typing import Optional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -12,6 +13,7 @@ from core.rag.datasource.vdb.vector_factory import Vector 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.rag.datasource.vdb.vector_type import VectorType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.rag.models.document import Document 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from extensions.ext_database import db 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from extensions.ext_redis import redis_client 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from libs.helper import email as email_validate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from libs.password import hash_password, password_pattern, valid_password 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from libs.rsa import generate_key_pair 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -553,6 +555,28 @@ def create_tenant(email: str, language: Optional[str] = None): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            'Account: {}\nPassword: {}'.format(email, new_password), fg='green')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@click.command('upgrade-db', help='upgrade the database') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def upgrade_db(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    click.echo('Preparing database migration...') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    lock = redis_client.lock(name='db_upgrade_lock', timeout=60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if lock.acquire(blocking=False): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            click.echo(click.style('Start database migration.', fg='green')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # run db migration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import flask_migrate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flask_migrate.upgrade() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            click.echo(click.style('Database migration successful!', fg='green')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logging.exception(f'Database migration failed, error: {e}') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        finally: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            lock.release() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        click.echo('Database migration skipped') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def register_commands(app): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(reset_password) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(reset_email) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -561,4 +585,4 @@ def register_commands(app): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(convert_to_agent_apps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(add_qdrant_doc_id_index) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     app.cli.add_command(create_tenant) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    app.cli.add_command(upgrade_db) 
			 |