Files
group_fqcd_jr/app/api/controllers/product_governance.py
T

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},
}