| """Demo 文件管理 API""" |
| from backend.data_utils import save_demo_payload |
| from backend.demo_folder import ( |
| list_demo_items, |
| move_demo_file, |
| rename_demo_file, |
| delete_demo_file, |
| move_folder, |
| ) |
| from backend.api.utils import ( |
| get_demo_directory, |
| handle_api_error, |
| handle_api_success, |
| require_admin, |
| validate_admin_token, |
| ) |
| from backend.access_log import log_check_admin |
|
|
|
|
| def list_demos(path: str = ""): |
| """ |
| 扫描demo目录下的文件夹和文件,返回列表 |
| 支持指定路径参数,返回指定路径下的内容 |
| 文件名(去掉.json后缀)作为demo名称 |
| 支持中文文件名和路径 |
| 从data/demo目录读取(更专业的数据目录结构) |
| |
| Args: |
| path: 可选,指定要列出的路径,默认为根目录(空字符串) |
| """ |
| demo_dir = get_demo_directory(create=False) |
| try: |
| result = list_demo_items(demo_dir, path) |
| |
| |
| |
| |
| |
| |
| |
| return result |
| except Exception as e: |
| error_result = handle_api_error("Failed to scan demo directory", e) |
| return {"path": path, "items": []} |
|
|
|
|
| @require_admin |
| def save_demo(save_request): |
| """ |
| 保存demo文件到data/demo目录 |
| 请求格式: { name: string, data: AnalyzeResponse, path?: string, overwrite?: boolean } |
| path: 可选,保存路径,默认为根目录("/") |
| overwrite: 可选,是否覆盖已存在的文件,默认为False |
| """ |
| name = save_request.get('name') |
| data = save_request.get('data') |
| path = save_request.get('path', '/') |
| overwrite = save_request.get('overwrite', False) |
| |
| if not name or not data: |
| return { |
| 'success': False, |
| 'message': 'Missing required parameters: name or data' |
| } |
| |
| try: |
| demo_dir = get_demo_directory(create=True) |
| result = save_demo_payload(demo_dir, name, data, path, overwrite) |
| if result.get('success'): |
| print(f"✓ Demo已保存: {demo_dir / result['file']}") |
| else: |
| print(f"❌ Save failed: {result.get('message')}") |
| return result |
| except Exception as e: |
| return handle_api_error('Save failed', e) |
|
|
|
|
| @require_admin |
| def delete_demo(delete_request): |
| """ |
| 将demo文件移动到deleted文件夹(软删除) |
| 请求格式: { file: string } # 文件名(包含.json后缀) |
| """ |
| file = delete_request.get('file') |
| |
| if not file: |
| return { |
| 'success': False, |
| 'message': 'Missing required parameter: file' |
| } |
| |
| try: |
| demo_dir = get_demo_directory(create=False) |
| result = delete_demo_file(demo_dir, file) |
| return handle_api_success(result) |
| except Exception as e: |
| return handle_api_error('Delete failed', e) |
|
|
|
|
| @require_admin |
| def move_demo(move_request): |
| """ |
| 移动demo文件或文件夹 |
| 请求格式: { file: string, target_path: string } 或 { path: string, target_path: string } |
| """ |
| file = move_request.get('file') |
| path = move_request.get('path') |
| target_path = move_request.get('target_path', '') |
| |
| if not target_path and target_path != '': |
| return { |
| 'success': False, |
| 'message': 'Missing required parameter: target_path' |
| } |
| |
| if not file and not path: |
| return { |
| 'success': False, |
| 'message': 'Missing required parameter: file or path' |
| } |
| |
| try: |
| demo_dir = get_demo_directory(create=False) |
| |
| if file: |
| |
| result = move_demo_file(demo_dir, file, target_path) |
| else: |
| |
| result = move_folder(demo_dir, path, target_path) |
| |
| return handle_api_success(result) |
| except Exception as e: |
| return handle_api_error('Move failed', e) |
|
|
|
|
| @require_admin |
| def rename_demo(rename_request): |
| """ |
| 重命名demo文件 |
| 请求格式: { file: string, new_name: string } |
| """ |
| file = rename_request.get('file') |
| new_name = rename_request.get('new_name') |
| |
| if not file or not new_name: |
| return { |
| 'success': False, |
| 'message': 'Missing required parameter: file or new_name' |
| } |
| |
| try: |
| demo_dir = get_demo_directory(create=False) |
| result = rename_demo_file(demo_dir, file, new_name) |
| return handle_api_success(result) |
| except Exception as e: |
| return handle_api_error('Rename failed', e) |
|
|
|
|
| def check_admin(check_request): |
| from flask import request |
|
|
| request_token = check_request.get('token') or request.headers.get('X-Admin-Token') |
| is_valid, error_message = validate_admin_token(request_token) |
| log_check_admin(is_valid, token=request_token) |
|
|
| if is_valid: |
| return {"success": True} |
| else: |
| return { |
| 'success': False, |
| 'message': error_message |
| } |
|
|
|
|