Files
spanish-diary/server/settings_api.py
T

95 lines
3.0 KiB
Python

import json
from flask import Blueprint, jsonify, request
from .auth import login_required
from .db import get_db, now_iso
from .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)