from typing import Optional, List from uuid import UUID from datetime import datetime from sqlmodel import Session, select from app.models import ValidationJob from app.models.validation_job import ValidationJobStatus class ValidationJobRepo: def create_validation_job( self, manager_session: Session, request: dict ) -> ValidationJob: job = ValidationJob( status=ValidationJobStatus.CREATED, request=request, external_request_id=request.get("external_request_id", None), ) manager_session.add(job) manager_session.commit() return job def get_validation_job_by_external_request_id( self, session: Session, external_request_id: str ) -> Optional[ValidationJob]: return session.exec( select(ValidationJob).where( ValidationJob.external_request_id == external_request_id ) ).first() def get_validation_job_by_id( self, session: Session, job_id: UUID ) -> Optional[ValidationJob]: return session.exec( select(ValidationJob).where(ValidationJob.id == job_id) ).first() @staticmethod def get_failed_jobs( db: Session, start_date: datetime, end_date: datetime ) -> List[ValidationJob]: statement = select(ValidationJob).where( ValidationJob.status == ValidationJobStatus.FAILED, ValidationJob.started_at >= start_date, ValidationJob.started_at <= end_date, ) return db.exec(statement).all() def replay_job(self, session: Session, job_id: UUID) -> ValidationJob: job = self.get_validation_job_by_id(session, job_id) if job is None: raise ValueError(f"Validation job {job_id} not found") job.status = ValidationJobStatus.REPLAYED job.started_at = datetime.now() session.add(job) session.commit() return job