from datetime import datetime from sqlalchemy import Boolean, Integer, JSON, String from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base class ScheduleTask(Base): """ Персистентная метадата пользовательских расписаний. APScheduler остаётся рантайм-движком исполнения, а эта таблица служит источником истины для CRUD, восстановления и миграции задач. """ __tablename__ = "schedules" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) job_id: Mapped[str] = mapped_column(String, unique=True, index=True) trigger_type: Mapped[str] = mapped_column(String) # once | cron target_id: Mapped[str] = mapped_column(String) target_type: Mapped[str] = mapped_column(String) # group | device trigger_args: Mapped[dict] = mapped_column(JSON) action_params: Mapped[dict] = mapped_column(JSON) is_active: Mapped[bool] = mapped_column(Boolean, default=True) created_at: Mapped[str] = mapped_column( String, default=lambda: datetime.now().isoformat() )