from __future__ import annotations from datetime import datetime, timezone from uuid import UUID, uuid4 from app.models import Metric, QualityCheck class QualityService: @staticmethod def persist_quality_check( db, project_id: UUID, reference_dataset_id: UUID, check_type: str, status: str, score: float | None, parameters: dict | None, findings: dict | None, *, job_id: UUID | None = None, analysis_run_id: UUID | None = None, candidate_dataset_id: UUID | None = None, metrics: dict[str, float | int | None] | None = None, commit: bool = True, ) -> QualityCheck: quality_check = QualityCheck( id=uuid4(), project_id=project_id, job_id=job_id, analysis_run_id=analysis_run_id, candidate_dataset_id=candidate_dataset_id, reference_dataset_id=reference_dataset_id, check_type=check_type, status=status, score=score, parameters_json=parameters or {}, findings_json=findings or {}, completed_at=datetime.now(timezone.utc), ) db.add(quality_check) if hasattr(db, "flush"): db.flush() for key, value in (metrics or {}).items(): db.add( Metric( id=uuid4(), quality_check_id=quality_check.id, analysis_run_id=analysis_run_id, metric_key=key, metric_value=float(value) if value is not None else None, metadata_json={}, ) ) if commit: db.commit() db.refresh(quality_check) return quality_check