"""Mission report (PDF / JSON / Markdown bundle).""" from __future__ import annotations from datetime import datetime from typing import TYPE_CHECKING, Any from uuid import UUID from sqlalchemy import ( JSON, DateTime, ForeignKey, Integer, String, ) from sqlalchemy.orm import Mapped, mapped_column, relationship from mimic.db.base import Base, TimestampsMixin, UuidPkMixin if TYPE_CHECKING: from mimic.db.models.engagement import Engagement class Report(UuidPkMixin, TimestampsMixin, Base): __tablename__ = "report" engagement_id: Mapped[UUID] = mapped_column( ForeignKey("engagement.id", ondelete="CASCADE"), nullable=False, ) version: Mapped[int] = mapped_column(Integer, default=1, nullable=False) content_json: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False, default=dict) content_sha256: Mapped[str] = mapped_column(String(64), nullable=False) # SHA-256 of canonical JSON. Identical hash referenced in PDF footer, JSON # export and Markdown export (spec H19 / F9 / F14). pdf_path: Mapped[str | None] = mapped_column(String(512)) md_path: Mapped[str | None] = mapped_column(String(512)) generated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) generated_by_id: Mapped[UUID | None] = mapped_column(ForeignKey("user.id", ondelete="SET NULL")) engagement: Mapped[Engagement] = relationship()