91 lines
3.1 KiB
Python
91 lines
3.1 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,
|
|
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),
|
|
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)
|