main
py 66 lines 2.49 KB
Raw
1 from helpers.api import ApiHandler, Request, Response
2 from werkzeug.datastructures import FileStorage
3 from helpers.backup import BackupService
4 from helpers.persist_chat import load_tmp_chats
5 import json
6
7
8 class BackupRestore(ApiHandler):
9 @classmethod
10 def requires_auth(cls) -> bool:
11 return True
12
13 @classmethod
14 def requires_loopback(cls) -> bool:
15 return False
16
17 async def process(self, input: dict, request: Request) -> dict | Response:
18 # Handle file upload
19 if 'backup_file' not in request.files:
20 return {"success": False, "error": "No backup file provided"}
21
22 backup_file: FileStorage = request.files['backup_file']
23 if backup_file.filename == '':
24 return {"success": False, "error": "No file selected"}
25
26 # Get restore configuration from form data
27 metadata_json = request.form.get('metadata', '{}')
28 overwrite_policy = request.form.get('overwrite_policy', 'overwrite') # overwrite, skip, backup
29 clean_before_restore = request.form.get('clean_before_restore', 'false').lower() == 'true'
30
31 try:
32 metadata = json.loads(metadata_json)
33 restore_include_patterns = metadata.get("include_patterns", [])
34 restore_exclude_patterns = metadata.get("exclude_patterns", [])
35 except json.JSONDecodeError:
36 return {"success": False, "error": "Invalid metadata JSON"}
37
38 try:
39 backup_service = BackupService()
40 result = await backup_service.restore_backup(
41 backup_file=backup_file,
42 restore_include_patterns=restore_include_patterns,
43 restore_exclude_patterns=restore_exclude_patterns,
44 overwrite_policy=overwrite_policy,
45 clean_before_restore=clean_before_restore,
46 user_edited_metadata=metadata
47 )
48
49 # Load all chats from the chats folder
50 load_tmp_chats()
51
52 return {
53 "success": True,
54 "restored_files": result["restored_files"],
55 "deleted_files": result.get("deleted_files", []),
56 "skipped_files": result["skipped_files"],
57 "errors": result["errors"],
58 "backup_metadata": result["backup_metadata"],
59 "clean_before_restore": result.get("clean_before_restore", False)
60 }
61
62 except Exception as e:
63 return {
64 "success": False,
65 "error": str(e)
66 }