Files
ss-tools/backend/src/api/routes/translate/_metrics_routes.py
busya 316d97ae25 refactor: migrate translate engine to GRACE-Poly v2.6 semantic protocol
- 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
2026-05-12 14:32:28 +03:00

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