feat: models
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
"""ORM model for download jobs (plan §6.1).
|
||||
|
||||
Tracks a queued download through its lifecycle. ``retry_count`` supports the
|
||||
exponential-backoff retries that yt-dlp needs; ``progress`` drives the UI
|
||||
download manager.
|
||||
"""
|
||||
|
||||
import uuid
|
||||
|
||||
from sqlalchemy import Float, ForeignKey, Integer, String, Text
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from app.infrastructure.db.base import Base
|
||||
from app.infrastructure.db.models.enums import DownloadStatus
|
||||
from app.infrastructure.db.models.mixins import TimestampMixin, UUIDPrimaryKeyMixin
|
||||
|
||||
|
||||
class DownloadJobModel(UUIDPrimaryKeyMixin, TimestampMixin, Base):
|
||||
__tablename__ = "download_jobs"
|
||||
|
||||
source: Mapped[str] = mapped_column(String(32), nullable=False)
|
||||
source_id: Mapped[str | None] = mapped_column(String(512), nullable=True)
|
||||
query: Mapped[str | None] = mapped_column(String(1024), nullable=True)
|
||||
requested_by: Mapped[uuid.UUID | None] = mapped_column(
|
||||
ForeignKey("users.id", ondelete="SET NULL"),
|
||||
index=True,
|
||||
nullable=True,
|
||||
)
|
||||
status: Mapped[str] = mapped_column(
|
||||
String(16),
|
||||
index=True,
|
||||
nullable=False,
|
||||
default=DownloadStatus.QUEUED.value,
|
||||
)
|
||||
progress: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)
|
||||
error_message: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
retry_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
|
||||
Reference in New Issue
Block a user