import uuid from sqlalchemy import Column, String, Text, DateTime, ForeignKey, Enum, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from app.database import Base from app.models.enums import TeamSide class Evidence(Base): """ Evidence model for storing file metadata associated with tests. Files are stored in MinIO, and this model tracks the file location, integrity hash, and upload metadata. The ``team`` field distinguishes whether this evidence was uploaded by Red Team (attack evidence) or Blue Team (detection evidence). """ __tablename__ = "evidences" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) test_id = Column(UUID(as_uuid=True), ForeignKey("tests.id"), nullable=False) file_name = Column(String, nullable=False) file_path = Column(String, nullable=False) # Path in MinIO sha256_hash = Column(String, nullable=False) uploaded_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True) uploaded_at = Column(DateTime(timezone=True), server_default=func.now()) team = Column(Enum(TeamSide, name="teamside"), nullable=False, default=TeamSide.red) notes = Column(Text, nullable=True) # Relationships test = relationship("Test", back_populates="evidences") uploader = relationship("User", foreign_keys=[uploaded_by])