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)