from __future__ import annotations import uuid from datetime import datetime from enum import Enum from sqlalchemy import DateTime, String, Text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column from core.db.base import Base, SoftDeleteMixin, TimestampMixin class AutomationJobStatus(str, Enum): ACTIVE = "active" DISABLED = "disabled" class ScheduleType(str, Enum): DAILY = "daily" WEEKLY = "weekly" class AutomationJob(TimestampMixin, SoftDeleteMixin, Base): __tablename__: str = "automation_jobs" __table_args__ = {"extend_existing": True} id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=uuid.uuid4 ) owner_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), nullable=False, ) title: Mapped[str] = mapped_column( String(255), nullable=False, ) prompt: Mapped[str] = mapped_column( Text, nullable=False, ) schedule_type: Mapped[ScheduleType] = mapped_column( String(20), nullable=False, ) run_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, ) next_run_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, ) timezone: Mapped[str] = mapped_column( String(50), nullable=False, default="UTC", ) last_run_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, ) status: Mapped[AutomationJobStatus] = mapped_column( String(20), nullable=False, default=AutomationJobStatus.ACTIVE, ) created_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, )