104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
"""
|
|
Snapshot archive for imported external tryout payloads.
|
|
|
|
Stores each imported JSON export so the backend can trace source changes
|
|
without treating the source file itself as the system of record.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import DateTime, ForeignKey, Integer, JSON, String, func
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.database import Base
|
|
|
|
|
|
class TryoutImportSnapshot(Base):
|
|
__tablename__ = "tryout_import_snapshots"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
website_id: Mapped[int] = mapped_column(
|
|
ForeignKey("websites.id", ondelete="CASCADE", onupdate="CASCADE"),
|
|
nullable=False,
|
|
index=True,
|
|
comment="Website identifier",
|
|
)
|
|
source_tryout_id: Mapped[str] = mapped_column(
|
|
String(255),
|
|
nullable=False,
|
|
index=True,
|
|
comment="External source tryout identifier",
|
|
)
|
|
source_key: Mapped[str] = mapped_column(
|
|
String(255),
|
|
nullable=False,
|
|
comment="External tryout object key in source payload",
|
|
)
|
|
title: Mapped[str] = mapped_column(
|
|
String(255),
|
|
nullable=False,
|
|
comment="Imported tryout title",
|
|
)
|
|
source_permalink: Mapped[Optional[str]] = mapped_column(
|
|
String(1024),
|
|
nullable=True,
|
|
comment="Imported source permalink",
|
|
)
|
|
source_status: Mapped[Optional[str]] = mapped_column(
|
|
String(50),
|
|
nullable=True,
|
|
comment="Imported source status",
|
|
)
|
|
exported_at: Mapped[Optional[datetime]] = mapped_column(
|
|
DateTime(timezone=True),
|
|
nullable=True,
|
|
comment="Timestamp from source export metadata",
|
|
)
|
|
source_created_at: Mapped[Optional[datetime]] = mapped_column(
|
|
DateTime(timezone=True),
|
|
nullable=True,
|
|
comment="Source tryout created timestamp",
|
|
)
|
|
source_modified_at: Mapped[Optional[datetime]] = mapped_column(
|
|
DateTime(timezone=True),
|
|
nullable=True,
|
|
comment="Source tryout modified timestamp",
|
|
)
|
|
exported_by: Mapped[Optional[str]] = mapped_column(
|
|
String(255),
|
|
nullable=True,
|
|
comment="Source exporter identity",
|
|
)
|
|
question_count: Mapped[int] = mapped_column(
|
|
Integer,
|
|
nullable=False,
|
|
default=0,
|
|
comment="Number of questions in imported payload",
|
|
)
|
|
result_count: Mapped[int] = mapped_column(
|
|
Integer,
|
|
nullable=False,
|
|
default=0,
|
|
comment="Number of result rows in imported payload",
|
|
)
|
|
payload_checksum: Mapped[str] = mapped_column(
|
|
String(64),
|
|
nullable=False,
|
|
comment="Checksum for the imported payload",
|
|
)
|
|
raw_payload: Mapped[dict] = mapped_column(
|
|
JSON,
|
|
nullable=False,
|
|
comment="Original imported payload",
|
|
)
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True), nullable=False, server_default=func.now()
|
|
)
|
|
updated_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
nullable=False,
|
|
server_default=func.now(),
|
|
onupdate=func.now(),
|
|
)
|