from pathlib import Path from fastapi import APIRouter, HTTPException from fastapi.responses import FileResponse from app.core.files import settings_backup_root from app.schemas.common import ApiResponse from app.services.juziseo_service import get_juziseo_status, login_juziseo from app.services.settings_service import ( backup_current_settings, export_settings_snapshot, get_credentials_payload, get_settings_payload, import_settings_snapshot, list_settings_backups, update_credentials_payload, update_settings_payload, validate_settings_payload, ) router = APIRouter(tags=["settings"]) @router.get("/settings", response_model=ApiResponse) def get_settings() -> ApiResponse: return ApiResponse(data=get_settings_payload()) @router.put("/settings", response_model=ApiResponse) def update_settings(payload: dict) -> ApiResponse: return ApiResponse(message="settings updated", data=update_settings_payload(payload)) @router.get("/settings/export", response_model=ApiResponse) def export_settings() -> ApiResponse: return ApiResponse(message="settings exported", data=export_settings_snapshot()) @router.post("/settings/import", response_model=ApiResponse) def import_settings(payload: dict) -> ApiResponse: try: settings_payload = import_settings_snapshot(payload) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="settings imported", data=settings_payload) @router.post("/settings/validate-import", response_model=ApiResponse) def validate_import_settings(payload: dict) -> ApiResponse: try: validate_settings_payload(payload.get("settings", payload)) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="settings payload valid", data={"valid": True}) @router.post("/settings/backup", response_model=ApiResponse) def create_settings_backup() -> ApiResponse: return ApiResponse(message="settings backed up", data=backup_current_settings("manual")) @router.get("/settings/backups", response_model=ApiResponse) def get_settings_backups() -> ApiResponse: return ApiResponse(data=list_settings_backups()) @router.get("/settings/credentials", response_model=ApiResponse) def get_settings_credentials() -> ApiResponse: return ApiResponse(data=get_credentials_payload()) @router.put("/settings/credentials", response_model=ApiResponse) def update_settings_credentials(payload: dict) -> ApiResponse: return ApiResponse(message="credentials updated", data=update_credentials_payload(payload)) @router.get("/settings/juziseo/status", response_model=ApiResponse) def get_settings_juziseo_status() -> ApiResponse: return ApiResponse(data=get_juziseo_status()) @router.post("/settings/juziseo/login", response_model=ApiResponse) def settings_juziseo_login(payload: dict) -> ApiResponse: try: data = login_juziseo(str(payload.get("email") or ""), str(payload.get("password") or "")) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return ApiResponse(message="桔子SEO登录成功", data=data) @router.get("/settings/backups/download/{filename}") def download_settings_backup(filename: str): path = settings_backup_root() / Path(filename).name if not path.exists(): raise HTTPException(status_code=404, detail="backup not found") return FileResponse(path, filename=path.name)