File size: 5,446 Bytes
494c9e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12617a9
494c9e4
 
 
 
 
12617a9
494c9e4
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
"""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)
        # if not result.get("items"):
        #     print(f"⚠️  路径 '{path}' 下没有内容: {demo_dir}")
        # else:
        #     items_count = len(result["items"])
        #     folders_count = sum(1 for item in result["items"] if item["type"] == "folder")
        #     files_count = sum(1 for item in result["items"] if item["type"] == "file")
        #     print(f"✓ 路径 '{path}': {folders_count} 个文件夹, {files_count} 个文件 (共 {items_count} 项)")
        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)  # 默认为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
        }