import json from flask import Blueprint, jsonify, request from server.auth import login_required from server.db import get_db, now_iso from server.translate_service import perform_translate settings_bp = Blueprint("settings", __name__) def get_user_settings(user_id): conn = get_db() try: row = conn.execute( "SELECT translator, api_url, api_key, extra_config, updated_at FROM settings WHERE user_id = ?", (user_id,), ).fetchone() if row is None: return { "translator": "local", "api_url": "", "api_key": "", "extra_config": {}, "updated_at": "", } result = dict(row) try: result["extra_config"] = json.loads(result["extra_config"] or "{}") except Exception: result["extra_config"] = {} return result finally: conn.close() @settings_bp.get("/api/settings/translation") @login_required def get_translation_settings(user): return jsonify(get_user_settings(user["id"])) @settings_bp.put("/api/settings/translation") @login_required def update_translation_settings(user): data = request.get_json(silent=True) or {} translator = (data.get("translator") or "local").strip().lower() if translator not in ("local", "mymemory", "custom"): return jsonify({"error": "不支持的翻译方式"}), 400 extra_config = data.get("extra_config") or {} if not isinstance(extra_config, dict): return jsonify({"error": "extra_config 必须是对象"}), 400 conn = get_db() try: conn.execute( """ INSERT INTO settings (user_id, translator, api_url, api_key, extra_config, updated_at) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(user_id) DO UPDATE SET translator = excluded.translator, api_url = excluded.api_url, api_key = excluded.api_key, extra_config = excluded.extra_config, updated_at = excluded.updated_at """, ( user["id"], translator, (data.get("api_url") or "").strip(), (data.get("api_key") or "").strip(), json.dumps(extra_config, ensure_ascii=False), now_iso(), ), ) conn.commit() return jsonify(get_user_settings(user["id"])) finally: conn.close() @settings_bp.post("/api/translate") @login_required def translate_text(user): data = request.get_json(silent=True) or {} text = (data.get("text") or "").strip() if not text: return jsonify({"error": "翻译内容不能为空"}), 400 source = (data.get("source") or "zh").strip() target = (data.get("target") or "es").strip() settings = get_user_settings(user["id"]) result = perform_translate(text, settings, source, target) if not result.get("ok"): return jsonify({"error": result.get("error", "翻译失败")}), 502 return jsonify(result)