""" StoredObject SQLAlchemy ORM model for documents and images storage. """ from datetime import datetime import uuid from sqlalchemy import ( BigInteger, Boolean, Column, Index, String, Text, TIMESTAMP, UniqueConstraint, text, ) from sqlalchemy.dialects.postgresql import UUID from app.core.database import Base class StoredObject(Base): """ ORM model for trans.stored_objects table. Represents uploaded documents/images with metadata, visibility, soft delete, and legal hold support for audit compliance. """ __tablename__ = "stored_objects" __table_args__ = ( UniqueConstraint( "tenant_id", "domain", "entity_id", "object_key", "deleted_at", name="uq_stored_object_active_key", ), Index( "ix_stored_objects_active", "tenant_id", "domain", "entity_id", postgresql_where=text("deleted_at IS NULL"), ), Index( "ix_stored_objects_checksum", "tenant_id", "checksum_sha256", postgresql_where=text("deleted_at IS NULL"), ), {"schema": "trans"}, ) id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) tenant_id = Column(Text, nullable=False) domain = Column(Text, nullable=False) entity_id = Column(Text, nullable=False) bucket_name = Column(Text, nullable=False) object_key = Column(Text, nullable=False) category = Column(Text, nullable=False) file_name = Column(Text, nullable=False) mime_type = Column(Text, nullable=False) file_size = Column(BigInteger, nullable=True) checksum_sha256 = Column(Text, nullable=True) visibility = Column(String(16), nullable=False, default="private") created_by = Column(Text, nullable=False) created_at = Column(TIMESTAMP, nullable=False, default=datetime.utcnow) deleted_at = Column(TIMESTAMP, nullable=True) legal_hold = Column(Boolean, nullable=False, default=False) def __repr__(self) -> str: return f""