119 lines
3.9 KiB
Python
119 lines
3.9 KiB
Python
from __future__ import annotations
|
|
|
|
from .shared import *
|
|
|
|
@router.post("/experiment-sync")
|
|
async def create_experiment_sync(
|
|
request: ExperimentSyncRequest,
|
|
current_user: User = Depends(get_current_user),
|
|
tenant_id: int = Depends(get_tenant_id),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""创建实验结果同步记录,满足阈值时自动同步。"""
|
|
_ = current_user
|
|
service = ExperimentSyncService(db)
|
|
try:
|
|
data = await service.auto_sync_experiment_result(
|
|
experiment_id=request.experiment_id,
|
|
truth_node_id=request.truth_node_id,
|
|
tenant_id=tenant_id,
|
|
project_id=request.project_id,
|
|
sync_type=request.sync_type,
|
|
auto_apply_threshold=request.auto_apply_threshold,
|
|
)
|
|
return success_response(data=data)
|
|
except ValueError as exc:
|
|
return JSONResponse(
|
|
status_code=404,
|
|
content=error_response(ErrorCode.NOT_FOUND, str(exc)),
|
|
)
|
|
except Exception as exc:
|
|
return JSONResponse(
|
|
status_code=500,
|
|
content=error_response(ErrorCode.INTERNAL_ERROR, f"创建同步失败: {exc}"),
|
|
)
|
|
|
|
@router.get("/experiment-sync")
|
|
async def list_experiment_sync_records(
|
|
truth_node_id: Optional[int] = Query(default=None),
|
|
limit: int = Query(default=50, ge=1, le=200),
|
|
current_user: User = Depends(get_current_user),
|
|
tenant_id: int = Depends(get_tenant_id),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""查询实验同步记录。"""
|
|
_ = current_user
|
|
service = ExperimentSyncService(db)
|
|
try:
|
|
data = await service.list_sync_records(
|
|
tenant_id=tenant_id,
|
|
truth_node_id=truth_node_id,
|
|
limit=limit,
|
|
)
|
|
return success_response(data=data)
|
|
except Exception as exc:
|
|
return JSONResponse(
|
|
status_code=500,
|
|
content=error_response(ErrorCode.INTERNAL_ERROR, f"查询同步记录失败: {exc}"),
|
|
)
|
|
|
|
@router.post("/experiment-sync/{sync_id}/review")
|
|
async def review_experiment_sync(
|
|
sync_id: int,
|
|
request: ExperimentSyncReviewRequest,
|
|
current_user: User = Depends(get_current_user),
|
|
tenant_id: int = Depends(get_tenant_id),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""人工审核实验同步记录。"""
|
|
service = ExperimentSyncService(db)
|
|
try:
|
|
data = await service.review_sync(
|
|
sync_id=sync_id,
|
|
tenant_id=tenant_id,
|
|
reviewer_id=current_user.id,
|
|
action=request.action,
|
|
review_notes=request.review_notes,
|
|
)
|
|
return success_response(data=data)
|
|
except ValueError as exc:
|
|
return JSONResponse(
|
|
status_code=400,
|
|
content=error_response(ErrorCode.BAD_REQUEST, str(exc)),
|
|
)
|
|
except Exception as exc:
|
|
return JSONResponse(
|
|
status_code=500,
|
|
content=error_response(ErrorCode.INTERNAL_ERROR, f"审核同步失败: {exc}"),
|
|
)
|
|
|
|
@router.post("/experiment-sync/{sync_id}/rollback")
|
|
async def rollback_experiment_sync(
|
|
sync_id: int,
|
|
request: ExperimentSyncRollbackRequest,
|
|
current_user: User = Depends(get_current_user),
|
|
tenant_id: int = Depends(get_tenant_id),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""回滚已应用的实验同步。"""
|
|
service = ExperimentSyncService(db)
|
|
try:
|
|
data = await service.rollback_sync(
|
|
sync_id=sync_id,
|
|
tenant_id=tenant_id,
|
|
reviewer_id=current_user.id,
|
|
rollback_notes=request.rollback_notes,
|
|
)
|
|
return success_response(data=data)
|
|
except ValueError as exc:
|
|
return JSONResponse(
|
|
status_code=400,
|
|
content=error_response(ErrorCode.BAD_REQUEST, str(exc)),
|
|
)
|
|
except Exception as exc:
|
|
return JSONResponse(
|
|
status_code=500,
|
|
content=error_response(ErrorCode.INTERNAL_ERROR, f"回滚同步失败: {exc}"),
|
|
)
|
|
|