"""Create content documents, versions, artifacts and chunks.""" from __future__ import annotations import sqlalchemy as sa from alembic import op revision = "0009_content_publication" down_revision = "0008_jobs" branch_labels = None depends_on = None def upgrade() -> None: op.execute(sa.text("CREATE SCHEMA IF NOT EXISTS content")) op.create_table( "documents", sa.Column("id", sa.Uuid(), primary_key=True), sa.Column("workspace_id", sa.Uuid(), nullable=False), sa.Column("source_key", sa.String(256), nullable=False), sa.Column("external_id", sa.String(512), nullable=False), sa.Column("title", sa.String(512), nullable=False), sa.Column( "source_deleted", sa.Boolean(), nullable=False, server_default=sa.false() ), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False), sa.UniqueConstraint( "workspace_id", "source_key", "external_id", name="uq_content_document_source", ), schema="content", ) op.create_index( "ix_content_documents_searchable", "documents", ["workspace_id", "source_deleted"], schema="content", ) op.create_table( "document_versions", sa.Column("id", sa.Uuid(), primary_key=True), sa.Column("document_id", sa.Uuid(), nullable=False), sa.Column("source_fingerprint", sa.String(64), nullable=False), sa.Column("content_hash", sa.String(64), nullable=False), sa.Column("parser_version", sa.String(128), nullable=False), sa.Column("chunk_profile_version", sa.String(128), nullable=False), sa.Column("state", sa.String(32), nullable=False), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint( ["document_id"], ["content.documents.id"], ondelete="CASCADE" ), sa.UniqueConstraint( "document_id", "source_fingerprint", "content_hash", "parser_version", "chunk_profile_version", name="uq_content_version_identity", ), schema="content", ) op.create_index( "uq_content_one_published_version", "document_versions", ["document_id"], unique=True, schema="content", postgresql_where=sa.text("state = 'published'"), ) op.create_index( "ix_content_versions_document_state", "document_versions", ["document_id", "state"], schema="content", ) op.create_table( "artifacts", sa.Column("id", sa.Uuid(), primary_key=True), sa.Column("document_version_id", sa.Uuid(), nullable=False), sa.Column("kind", sa.String(64), nullable=False), sa.Column("content_hash", sa.String(64), nullable=False), sa.Column("storage_key", sa.String(512), nullable=False), sa.Column("size_bytes", sa.Integer(), nullable=False), sa.Column("metadata", sa.JSON(), nullable=False), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint( ["document_version_id"], ["content.document_versions.id"], ondelete="CASCADE", ), sa.UniqueConstraint( "document_version_id", "kind", name="uq_content_artifact_kind" ), schema="content", ) op.create_table( "chunks", sa.Column("id", sa.Uuid(), primary_key=True), sa.Column("document_version_id", sa.Uuid(), nullable=False), sa.Column("parent_id", sa.Uuid(), nullable=True), sa.Column("structure_path", sa.String(512), nullable=False), sa.Column("content_hash", sa.String(64), nullable=False), sa.Column("chunk_profile_version", sa.String(128), nullable=False), sa.Column("content", sa.Text(), nullable=False), sa.Column("token_count", sa.Integer(), nullable=False), sa.Column("metadata", sa.JSON(), nullable=False), sa.ForeignKeyConstraint( ["document_version_id"], ["content.document_versions.id"], ondelete="CASCADE", ), sa.ForeignKeyConstraint( ["parent_id"], ["content.chunks.id"], ondelete="RESTRICT" ), sa.UniqueConstraint( "document_version_id", "structure_path", "content_hash", "chunk_profile_version", name="uq_content_chunk_identity", ), schema="content", ) op.create_index( "ix_content_chunks_version_profile", "chunks", ["document_version_id", "chunk_profile_version"], schema="content", ) def downgrade() -> None: op.drop_index( "ix_content_chunks_version_profile", table_name="chunks", schema="content" ) op.drop_table("chunks", schema="content") op.drop_table("artifacts", schema="content") op.drop_index( "ix_content_versions_document_state", table_name="document_versions", schema="content", ) op.drop_index( "uq_content_one_published_version", table_name="document_versions", schema="content", ) op.drop_table("document_versions", schema="content") op.drop_index( "ix_content_documents_searchable", table_name="documents", schema="content" ) op.drop_table("documents", schema="content") op.execute(sa.text("DROP SCHEMA IF EXISTS content"))