97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
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)
|