import datetime from sqlalchemy import Column, Integer, String, Float, DateTime, Text, JSON, Enum as SAEnum from database import Base import enum class JobStatus(str, enum.Enum): PENDING = "pending" PROCESSING = "processing" COMPLETED = "completed" FAILED = "failed" class Job(Base): """Tracks every file processing request for health monitoring.""" __tablename__ = "jobs" id = Column(Integer, primary_key=True, index=True) job_id = Column(String(64), unique=True, index=True, nullable=False) original_filename = Column(String(512), nullable=False) file_type = Column(String(10)) # "pdf" or "image" total_pages = Column(Integer, default=1) current_page = Column(Integer, default=0) status = Column(String(20), default=JobStatus.PENDING.value) # --- Results --- tables_found = Column(Integer, default=0) cells_extracted = Column(Integer, default=0) result_payload = Column(JSON, nullable=True) # full extraction data # --- Health metrics --- latency_seconds = Column(Float, nullable=True) error_message = Column(Text, nullable=True) # --- Timestamps --- created_at = Column(DateTime, default=datetime.datetime.utcnow) started_at = Column(DateTime, nullable=True) completed_at = Column(DateTime, nullable=True) def to_dict(self): return { "id": self.id, "job_id": self.job_id, "original_filename": self.original_filename, "file_type": self.file_type, "total_pages": self.total_pages, "current_page": self.current_page, "status": self.status, "tables_found": self.tables_found, "cells_extracted": self.cells_extracted, "latency_seconds": self.latency_seconds, "error_message": self.error_message, "created_at": self.created_at.isoformat() if self.created_at else None, "started_at": self.started_at.isoformat() if self.started_at else None, "completed_at": self.completed_at.isoformat() if self.completed_at else None, } class HealthLog(Base): """Aggregated health snapshots for the monitoring dashboard.""" __tablename__ = "health_logs" id = Column(Integer, primary_key=True, index=True) timestamp = Column(DateTime, default=datetime.datetime.utcnow, index=True) total_jobs = Column(Integer, default=0) successful_jobs = Column(Integer, default=0) failed_jobs = Column(Integer, default=0) avg_latency = Column(Float, default=0.0) p95_latency = Column(Float, default=0.0)