from datetime import datetime from sqlalchemy import JSON, DateTime, String, Text, func from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base class Job(Base): """Tracks a long-running admin operation (sync, import, fit recompute). Persisted (rather than kept in a module-level dict) so that any worker process/replica handling a status-poll request can see progress recorded by whichever process is actually running the job. """ __tablename__ = "jobs" id: Mapped[str] = mapped_column(String(32), primary_key=True) kind: Mapped[str] = mapped_column(String(64), nullable=False) status: Mapped[str] = mapped_column( String(16), nullable=False, default="running" ) # running | done | error message: Mapped[str] = mapped_column(Text, nullable=False, default="Working…") result: Mapped[dict | None] = mapped_column(JSON, nullable=True, default=None) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now() ) finished_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, default=None )