zcbot/web/routers/external_systems.py

93 lines
3.2 KiB
Python

"""外部系统连接管理 API(DESIGN §8.14)。"""
from __future__ import annotations
from uuid import UUID
from fastapi import Depends, HTTPException, Response, status
from core.external_systems.service import (
ExternalSystemError,
create_external_system,
delete_external_system,
list_external_systems,
provider_catalog,
test_external_system,
update_external_system_credentials,
)
from ..schemas import ExternalSystemCreateRequest, ExternalSystemCredentialsRequest
def _uuid(raw: str) -> UUID:
try:
return UUID(raw)
except (ValueError, TypeError) as exc:
raise HTTPException(404, "external system not found") from exc
def _bad_request(exc: ExternalSystemError) -> HTTPException:
message = str(exc)
code = 404 if message == "external system not found" else 400
return HTTPException(code, message)
def register_external_system_routes(app, *, require_user) -> None:
@app.get("/v1/external-system-providers", tags=["external-systems"])
def external_system_providers(user_id: UUID = Depends(require_user)):
return {"providers": provider_catalog(user_id)}
@app.get("/v1/external-systems", tags=["external-systems"])
def external_system_list(user_id: UUID = Depends(require_user)):
return {"results": list_external_systems(user_id)}
@app.post(
"/v1/external-systems",
tags=["external-systems"],
status_code=status.HTTP_201_CREATED,
)
def external_system_create(
body: ExternalSystemCreateRequest,
user_id: UUID = Depends(require_user),
):
try:
return create_external_system(
user_id,
definition_id=body.definition_id,
name=body.name,
credentials=body.credentials or None,
username=body.username,
password=body.password,
)
except ExternalSystemError as exc:
raise _bad_request(exc)
@app.put("/v1/external-systems/{system_id}/credentials", tags=["external-systems"])
def external_system_credentials(
system_id: str,
body: ExternalSystemCredentialsRequest,
user_id: UUID = Depends(require_user),
):
try:
return update_external_system_credentials(
user_id,
_uuid(system_id),
credentials=body.credentials or None,
username=body.username,
password=body.password,
)
except ExternalSystemError as exc:
raise _bad_request(exc)
@app.post("/v1/external-systems/{system_id}/test", tags=["external-systems"])
def external_system_test(system_id: str, user_id: UUID = Depends(require_user)):
try:
return test_external_system(user_id, _uuid(system_id))
except ExternalSystemError as exc:
raise _bad_request(exc)
@app.delete("/v1/external-systems/{system_id}", tags=["external-systems"])
def external_system_delete(system_id: str, user_id: UUID = Depends(require_user)):
if not delete_external_system(user_id, _uuid(system_id)):
raise HTTPException(404, "external system not found")
return Response(status_code=204)