"""audit log Revision ID: 0003_audit_log Revises: 0002_asset_ingest_jobs Create Date: 2026-06-15 """ from __future__ import annotations from collections.abc import Sequence import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql revision: str = "0003_audit_log" down_revision: str | None = "0002_asset_ingest_jobs" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.create_table( "audit_log", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), sa.Column("actor", sa.Text, nullable=True), sa.Column("actor_id", sa.Text, nullable=True), sa.Column("app_code", sa.Text, nullable=True), sa.Column("action", sa.Text, nullable=False), sa.Column("entity_type", sa.Text, nullable=True), sa.Column("entity_id", sa.Text, nullable=True), sa.Column( "details", postgresql.JSONB, nullable=False, server_default=sa.text("'{}'::jsonb"), ), ) op.create_index("ix_audit_entity", "audit_log", ["entity_type", "entity_id"]) op.create_index("ix_audit_action", "audit_log", ["action"]) op.create_index("ix_audit_created", "audit_log", ["created_at"]) def downgrade() -> None: op.drop_index("ix_audit_created", table_name="audit_log") op.drop_index("ix_audit_action", table_name="audit_log") op.drop_index("ix_audit_entity", table_name="audit_log") op.drop_table("audit_log")