- Convert all 84 contracts from legacy [DEF:] to #region/#endregion syntax - Fix complexity tiers: 14 modules re-tiered (6 C4 route modules, 7 C4→C5 plugin services) - Remove forbidden tags: @RATIONALE/@REJECTED stripped from C1–C4 contracts - Add required tags: @PRE/@POST/@SIDE_EFFECT on C4, @RELATION on C3, @DATA_CONTRACT/@INVARIANT on C5 - Add belief runtime markers (reason/reflect/explore) to 7 service.py functions - Fix @LAYER: route files → UI, plugins → Domain, superset_executor → Infra - Fix pre-existing test mock_service fixture in test_orchestrator.py - 196/196 translation tests pass, zero regressions
67 lines
2.6 KiB
Python
67 lines
2.6 KiB
Python
# #region TranslateMetricsRoutesModule [C:3] [TYPE Module] [SEMANTICS api,routes,translate,metrics]
|
|
# @BRIEF Translation Metrics endpoints providing aggregated stats on runs and corrections.
|
|
# @LAYER UI
|
|
# @RELATION DEPENDS_ON -> [TranslationMetrics]
|
|
# @RELATION DEPENDS_ON -> [get_current_user]
|
|
# @RELATION DEPENDS_ON -> [get_db]
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status, Query
|
|
from typing import Any, Dict, List, Optional
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ....core.database import get_db
|
|
from ....core.logger import logger, belief_scope
|
|
from ....schemas.auth import User
|
|
from ....dependencies import get_current_user, has_permission
|
|
from ....plugins.translate.metrics import TranslationMetrics
|
|
|
|
from ._router import router
|
|
|
|
|
|
# ============================================================
|
|
# Metrics
|
|
# ============================================================
|
|
|
|
# #region get_metrics [C:3] [TYPE Function] [SEMANTICS api,translate,metrics]
|
|
# @BRIEF Get translation metrics across all jobs, optionally filtered by job.
|
|
# @RELATION DEPENDS_ON -> [TranslationMetrics]
|
|
@router.get("/metrics")
|
|
async def get_metrics(
|
|
job_id: Optional[str] = Query(None),
|
|
current_user: User = Depends(get_current_user),
|
|
_ = Depends(has_permission("translate.metrics", "VIEW")),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Get translation metrics."""
|
|
logger.info(f"[translate_routes][get_metrics] User: {current_user.username}")
|
|
try:
|
|
metrics_svc = TranslationMetrics(db)
|
|
if job_id:
|
|
return metrics_svc.get_job_metrics(job_id)
|
|
return metrics_svc.get_all_metrics()
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e))
|
|
# #endregion get_metrics
|
|
|
|
|
|
# #region get_job_metrics [C:3] [TYPE Function] [SEMANTICS api,translate,metrics]
|
|
# @BRIEF Get aggregated metrics for a specific translation job.
|
|
# @RELATION DEPENDS_ON -> [TranslationMetrics]
|
|
@router.get("/jobs/{job_id}/metrics")
|
|
async def get_job_metrics(
|
|
job_id: str,
|
|
current_user: User = Depends(get_current_user),
|
|
_ = Depends(has_permission("translate.metrics", "VIEW")),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Get aggregated metrics for a specific job."""
|
|
logger.info(f"[translate_routes][get_job_metrics] Job: {job_id}, User: {current_user.username}")
|
|
try:
|
|
metrics_svc = TranslationMetrics(db)
|
|
return metrics_svc.get_job_metrics(job_id)
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e))
|
|
# #endregion get_job_metrics
|
|
|
|
# #endregion TranslateMetricsRoutesModule
|