import uuid from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, String from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from api.models.base import Base, new_uuid class SBOMSnapshot(Base): """Container entity for a point-in-time SBOM scan of a repository (GEMS Complex).""" __tablename__ = "sbom_snapshots" id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=new_uuid ) repo_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("managed_repos.id", ondelete="RESTRICT"), nullable=False, index=True, ) snapshot_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) source: Mapped[str | None] = mapped_column(String(200), nullable=True) entry_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) repo: Mapped["ManagedRepo"] = relationship("ManagedRepo", lazy="selectin") # noqa: F821 entries: Mapped[list["SBOMEntry"]] = relationship( # noqa: F821 "SBOMEntry", lazy="select", back_populates="snapshot" )