import json from fastapi import APIRouter, Depends from fastapi import Response from app.api.dependencies import get_backend_service from app.core.secret_codec import list_secret_fields from app.models.entities import Backend from app.schemas.backend import ( BackendCheckResponse, BackendListResponse, BackendMutationResponse, BackendSummary, CreateBackendRequest, CreateBackendResponse, UpdateBackendRequest, ) from app.services.backend_service import BackendService router = APIRouter() def summarize_backend(backend: Backend) -> BackendSummary: summary = BackendSummary.model_validate(backend, from_attributes=True) public_config = json.loads(backend.public_config_json) summary.config = public_config summary.secret_fields = list_secret_fields(backend.secret_config_json) return summary @router.get("", response_model=BackendListResponse) async def list_backends( service: BackendService = Depends(get_backend_service), ) -> BackendListResponse: items = await service.list_backends() return BackendListResponse( items=[summarize_backend(item) for item in items] ) @router.post("", response_model=CreateBackendResponse) async def create_backend( payload: CreateBackendRequest, service: BackendService = Depends(get_backend_service), ) -> CreateBackendResponse: backend = await service.create_backend( name=payload.name, backend_type=payload.type, stability_class=payload.stability_class, read_priority=payload.read_priority, write_priority=payload.write_priority, config=payload.config, ) return CreateBackendResponse(backend=summarize_backend(backend)) @router.post("/{backend_id}/check", response_model=BackendCheckResponse) async def check_backend( backend_id: str, service: BackendService = Depends(get_backend_service), ) -> BackendCheckResponse: backend, status, detail = await service.check_backend(backend_id) return BackendCheckResponse( backend_id=backend.id, status=status, checked_at=backend.last_health_checked_at, detail=detail, ) @router.patch("/{backend_id}", response_model=BackendMutationResponse) async def update_backend( backend_id: str, payload: UpdateBackendRequest, service: BackendService = Depends(get_backend_service), ) -> BackendMutationResponse: backend = await service.update_backend( backend_id, name=payload.name, stability_class=payload.stability_class, read_priority=payload.read_priority, write_priority=payload.write_priority, config=payload.config, ) return BackendMutationResponse(backend=summarize_backend(backend)) @router.post("/{backend_id}/disable", response_model=BackendMutationResponse) async def disable_backend( backend_id: str, service: BackendService = Depends(get_backend_service), ) -> BackendMutationResponse: backend = await service.disable_backend(backend_id) return BackendMutationResponse(backend=summarize_backend(backend)) @router.post("/{backend_id}/enable", response_model=BackendMutationResponse) async def enable_backend( backend_id: str, service: BackendService = Depends(get_backend_service), ) -> BackendMutationResponse: backend = await service.enable_backend(backend_id) return BackendMutationResponse(backend=summarize_backend(backend)) @router.delete("/{backend_id}", status_code=204) async def delete_backend( backend_id: str, service: BackendService = Depends(get_backend_service), ) -> Response: await service.delete_backend(backend_id) return Response(status_code=204)