from __future__ import annotations from uuid import UUID from sqlalchemy.orm import Session from app.models import Metric, QualityCheck from app.schemas.qa import MetricRead, QualityCheckRead class QualityCheckService: @staticmethod def list_quality_checks( db: Session, *, project_id: UUID, limit: int = 50, offset: int = 0, ) -> tuple[list[QualityCheckRead], int]: query = ( db.query(QualityCheck) .filter(QualityCheck.project_id == project_id) .order_by(QualityCheck.created_at.desc()) ) total = query.count() rows = query.offset(offset).limit(limit).all() if not rows: return [], total quality_check_ids = [row.id for row in rows] metrics_by_quality_check: dict[UUID, list[MetricRead]] = {row.id: [] for row in rows} metrics = ( db.query(Metric) .filter(Metric.quality_check_id.in_(quality_check_ids)) .order_by(Metric.created_at.asc()) .all() ) for metric in metrics: if metric.quality_check_id in metrics_by_quality_check: metrics_by_quality_check[metric.quality_check_id].append(MetricRead.model_validate(metric)) return [ QualityCheckRead.model_validate(row).model_copy( update={"metrics": metrics_by_quality_check.get(row.id, [])} ) for row in rows ], total