""" Database models for HF Uploader Dashboard """ from datetime import datetime from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean, Enum from sqlalchemy.ext.declarative import declarative_base import enum Base = declarative_base() class HFConfig(Base): """Configuration for Hugging Face API and datasets""" __tablename__ = "hf_config" id = Column(Integer, primary_key=True, index=True) hf_token = Column(Text, nullable=True) source_all_repo = Column(String(255), default="samfred2/ALL", nullable=False) source_ato_repo = Column(String(255), default="samfred2/ATO", nullable=False) target_repo = Column(String(255), default="samfred2/ALL2", nullable=False) upload_batch_size = Column(Integer, default=10, nullable=False) max_uploads_per_hour = Column(Integer, default=128, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) class UploadStatusEnum(str, enum.Enum): """Upload status enumeration""" PENDING = "pending" UPLOADING = "uploading" COMPLETED = "completed" FAILED = "failed" class UploadQueue(Base): """Upload queue tracking""" __tablename__ = "upload_queue" id = Column(Integer, primary_key=True, index=True) file_name = Column(String(255), nullable=False) file_path = Column(Text, nullable=False) file_size = Column(Integer, nullable=False) status = Column(Enum(UploadStatusEnum), default=UploadStatusEnum.PENDING, nullable=False) uploaded_at = Column(DateTime, nullable=True) failure_reason = Column(Text, nullable=True) retry_count = Column(Integer, default=0, nullable=False) max_retries = Column(Integer, default=3, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) class RateLimitLog(Base): """Rate limit tracking per hour""" __tablename__ = "rate_limit_log" id = Column(Integer, primary_key=True, index=True) upload_count = Column(Integer, default=0, nullable=False) hour_start = Column(DateTime, nullable=False) hour_end = Column(DateTime, nullable=False) limit_hit = Column(Boolean, default=False, nullable=False) resume_time = Column(DateTime, nullable=True) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) class UploadErrorLog(Base): """Error logging for uploads""" __tablename__ = "upload_error_log" id = Column(Integer, primary_key=True, index=True) file_name = Column(String(255), nullable=False) error_code = Column(String(50), nullable=True) error_message = Column(Text, nullable=True) status_code = Column(Integer, nullable=True) retryable = Column(Boolean, default=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) class ProcessingStatusEnum(str, enum.Enum): """Processing status enumeration""" IDLE = "idle" DOWNLOADING = "downloading" MATCHING = "matching" INTEGRATING = "integrating" COMPLETED = "completed" ERROR = "error" class ProcessingState(Base): """File processing state tracking""" __tablename__ = "processing_state" id = Column(Integer, primary_key=True, index=True) status = Column(Enum(ProcessingStatusEnum), default=ProcessingStatusEnum.IDLE, nullable=False) total_files = Column(Integer, default=0, nullable=False) processed_files = Column(Integer, default=0, nullable=False) matched_pairs = Column(Integer, default=0, nullable=False) error_message = Column(Text, nullable=True) started_at = Column(DateTime, nullable=True) completed_at = Column(DateTime, nullable=True) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)