# backend/app/models.py from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.sql import func from .database import Base class Category(Base): __tablename__ = "categories" id = Column(Integer, primary_key=True, index=True) name = Column(String(100), unique=True, nullable=False, index=True) description = Column(Text, nullable=True) color = Column(String(20), nullable=True, default="#3498DB") icon = Column(String(50), nullable=True, default="el-icon-DataBoard") created_at = Column(DateTime, default=func.now()) spiders = relationship("Spider", back_populates="category", cascade="all, delete-orphan") class Spider(Base): __tablename__ = "spiders" id = Column(Integer, primary_key=True, index=True) name = Column(String(100), nullable=False, index=True) description = Column(Text, nullable=True) filename = Column(String(255), nullable=False) file_path = Column(String(500), nullable=False) code_content = Column(Text, nullable=True) cron_expression = Column(String(50), nullable=False, default="0 0 * * *") enabled = Column(Boolean, default=True) timeout = Column(Integer, default=300) created_at = Column(DateTime, default=func.now()) category_id = Column(Integer, ForeignKey("categories.id"), nullable=False) category = relationship("Category", back_populates="spiders") executions = relationship("TaskExecutionLog", back_populates="spider") class TaskExecutionLog(Base): __tablename__ = "task_execution_logs" id = Column(Integer, primary_key=True, index=True) spider_id = Column(Integer, ForeignKey("spiders.id"), nullable=False) status = Column(String(20), nullable=False) started_at = Column(DateTime, default=func.now()) finished_at = Column(DateTime, nullable=True) log_content = Column(Text, nullable=True) trigger_method = Column(String(20), nullable=False) spider = relationship("Spider", back_populates="executions")