File size: 7,548 Bytes
2887ce2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
use super::{
    constant::AUTHORIZATION_BEARER_PREFIX,
    lazy::AUTH_TOKEN,
    model::AppConfig,
};
use crate::common::models::{
    config::{ConfigData, ConfigUpdateRequest},
    ApiStatus, ErrorResponse, NormalResponse,
};
use axum::{
    http::{header::AUTHORIZATION, HeaderMap, StatusCode},
    Json,
};

// 定义处理更新操作的宏
macro_rules! handle_update {
    ($request:expr, $field:ident, $update_fn:expr, $field_name:expr) => {
        if let Some($field) = $request.$field {
            if let Err(e) = $update_fn($field) {
                return Err((
                    StatusCode::INTERNAL_SERVER_ERROR,
                    Json(ErrorResponse {
                        status: ApiStatus::Failed,
                        code: Some(500),
                        error: Some(format!("更新 {} 失败: {}", $field_name, e)),
                        message: None,
                    }),
                ));
            }
        }
    };
}

// 定义处理重置操作的宏
macro_rules! handle_reset {
    ($request:expr, $field:ident, $reset_fn:expr, $field_name:expr) => {
        if $request.$field.is_some() {
            if let Err(e) = $reset_fn() {
                return Err((
                    StatusCode::INTERNAL_SERVER_ERROR,
                    Json(ErrorResponse {
                        status: ApiStatus::Failed,
                        code: Some(500),
                        error: Some(format!("重置 {} 失败: {}", $field_name, e)),
                        message: None,
                    }),
                ));
            }
        }
    };
}

pub async fn handle_config_update(
    headers: HeaderMap,
    Json(request): Json<ConfigUpdateRequest>,
) -> Result<Json<NormalResponse<ConfigData>>, (StatusCode, Json<ErrorResponse>)> {
    let auth_header = headers
        .get(AUTHORIZATION)
        .and_then(|h| h.to_str().ok())
        .and_then(|h| h.strip_prefix(AUTHORIZATION_BEARER_PREFIX))
        .ok_or((
            StatusCode::UNAUTHORIZED,
            Json(ErrorResponse {
                status: ApiStatus::Failed,
                code: Some(401),
                error: Some("未提供认证令牌".to_string()),
                message: None,
            }),
        ))?;

    if auth_header != AUTH_TOKEN.as_str() {
        return Err((
            StatusCode::UNAUTHORIZED,
            Json(ErrorResponse {
                status: ApiStatus::Failed,
                code: Some(401),
                error: Some("无效的认证令牌".to_string()),
                message: None,
            }),
        ));
    }

    match request.action.as_str() {
        "get" => Ok(Json(NormalResponse {
            status: ApiStatus::Success,
            data: Some(ConfigData {
                page_content: AppConfig::get_page_content(&request.path),
                enable_stream_check: AppConfig::get_stream_check(),
                include_stop_stream: AppConfig::get_stop_stream(),
                vision_ability: AppConfig::get_vision_ability(),
                enable_slow_pool: AppConfig::get_slow_pool(),
                enable_all_claude: AppConfig::get_allow_claude(),
                check_usage_models: AppConfig::get_usage_check(),
            }),
            message: None,
        })),

        "update" => {
            // 处理页面内容更新
            if !request.path.is_empty() && request.content.is_some() {
                let content = request.content.unwrap();
                if let Err(e) = AppConfig::update_page_content(&request.path, content) {
                    return Err((
                        StatusCode::INTERNAL_SERVER_ERROR,
                        Json(ErrorResponse {
                            status: ApiStatus::Failed,
                            code: Some(500),
                            error: Some(format!("更新页面内容失败: {}", e)),
                            message: None,
                        }),
                    ));
                }
            }

            handle_update!(
                request,
                enable_stream_check,
                AppConfig::update_stream_check,
                "enable_stream_check"
            );
            handle_update!(
                request,
                include_stop_stream,
                AppConfig::update_stop_stream,
                "include_stop_stream"
            );
            handle_update!(
                request,
                vision_ability,
                AppConfig::update_vision_ability,
                "vision_ability"
            );
            handle_update!(
                request,
                enable_slow_pool,
                AppConfig::update_slow_pool,
                "enable_slow_pool"
            );
            handle_update!(
                request,
                enable_all_claude,
                AppConfig::update_allow_claude,
                "enable_all_claude"
            );
            handle_update!(
                request,
                check_usage_models,
                AppConfig::update_usage_check,
                "check_usage_models"
            );

            Ok(Json(NormalResponse {
                status: ApiStatus::Success,
                data: None,
                message: Some("配置已更新".to_string()),
            }))
        }

        "reset" => {
            // 重置页面内容
            if !request.path.is_empty() {
                if let Err(e) = AppConfig::reset_page_content(&request.path) {
                    return Err((
                        StatusCode::INTERNAL_SERVER_ERROR,
                        Json(ErrorResponse {
                            status: ApiStatus::Failed,
                            code: Some(500),
                            error: Some(format!("重置页面内容失败: {}", e)),
                            message: None,
                        }),
                    ));
                }
            }

            handle_reset!(
                request,
                enable_stream_check,
                AppConfig::reset_stream_check,
                "enable_stream_check"
            );
            handle_reset!(
                request,
                include_stop_stream,
                AppConfig::reset_stop_stream,
                "include_stop_stream"
            );
            handle_reset!(
                request,
                vision_ability,
                AppConfig::reset_vision_ability,
                "vision_ability"
            );
            handle_reset!(
                request,
                enable_slow_pool,
                AppConfig::reset_slow_pool,
                "enable_slow_pool"
            );
            handle_reset!(
                request,
                enable_all_claude,
                AppConfig::reset_allow_claude,
                "enable_all_claude"
            );
            handle_reset!(
                request,
                check_usage_models,
                AppConfig::reset_usage_check,
                "check_usage_models"
            );

            Ok(Json(NormalResponse {
                status: ApiStatus::Success,
                data: None,
                message: Some("配置已重置".to_string()),
            }))
        }

        _ => Err((
            StatusCode::BAD_REQUEST,
            Json(ErrorResponse {
                status: ApiStatus::Failed,
                code: Some(400),
                error: Some("无效的操作类型".to_string()),
                message: None,
            }),
        )),
    }
}