Files
getDomain/domain-api/app/api/routes/settings.py
Your Name 32efff1670 dev
2026-04-16 13:05:07 +08:00

70 lines
2.4 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.settings_service import (
backup_current_settings,
export_settings_snapshot,
get_settings_payload,
import_settings_snapshot,
list_settings_backups,
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/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)