65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
"""Administrative product-governance monitoring and compliance review APIs."""
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from app.api.dependencies.auth import build_request_context
|
|
from app.api.schemas.product_governance import ProductGovernanceReview
|
|
from app.core.contracts import RequestContext
|
|
from app.service.product_governance_monitor_service import ProductGovernanceMonitorService
|
|
|
|
router = APIRouter(prefix="/api/v1/admin/product-governance", tags=["product-governance"])
|
|
|
|
|
|
@router.post("/sync-runs")
|
|
async def run_official_source_monitor(
|
|
context: RequestContext = Depends(build_request_context), # noqa: B008
|
|
) -> dict[str, object]:
|
|
result = await ProductGovernanceMonitorService().run_manually(context)
|
|
return {
|
|
"data": {
|
|
"run_no": result.run_no,
|
|
"product_count": result.product_count,
|
|
"change_count": result.change_count,
|
|
"error_count": result.error_count,
|
|
},
|
|
"meta": {"trace_id": context.trace_id},
|
|
}
|
|
|
|
|
|
@router.get("/sync-runs")
|
|
async def list_sync_runs(
|
|
limit: int = Query(default=30, ge=1, le=100),
|
|
context: RequestContext = Depends(build_request_context), # noqa: B008
|
|
) -> dict[str, Any]:
|
|
return {
|
|
"data": await ProductGovernanceMonitorService().runs(context, limit=limit),
|
|
"meta": {"trace_id": context.trace_id},
|
|
}
|
|
|
|
|
|
@router.get("/review-queue")
|
|
async def review_queue(
|
|
limit: int = Query(default=100, ge=1, le=100),
|
|
context: RequestContext = Depends(build_request_context), # noqa: B008
|
|
) -> dict[str, Any]:
|
|
return {
|
|
"data": await ProductGovernanceMonitorService().pending(context, limit=limit),
|
|
"meta": {"trace_id": context.trace_id},
|
|
}
|
|
|
|
|
|
@router.post("/candidates/{candidate_id}/reviews")
|
|
async def review_candidate(
|
|
candidate_id: int,
|
|
payload: ProductGovernanceReview,
|
|
context: RequestContext = Depends(build_request_context), # noqa: B008
|
|
) -> dict[str, object]:
|
|
return {
|
|
"data": await ProductGovernanceMonitorService().review(
|
|
candidate_id, payload.decision, payload.comment, context
|
|
),
|
|
"meta": {"trace_id": context.trace_id},
|
|
}
|