"""initial licensing authority schema

Revision ID: 33a7f1574350
Revises:
Create Date: 2026-08-15 15:14:09.469230
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


revision: str = '33a7f1574350'
down_revision: Union[str, Sequence[str], None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('audit_events',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('occurred_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('actor_type', sa.String(length=32), nullable=False),
    sa.Column('actor_id', sa.String(length=128), nullable=True),
    sa.Column('action', sa.String(length=128), nullable=False),
    sa.Column('target_type', sa.String(length=64), nullable=False),
    sa.Column('target_id', sa.String(length=128), nullable=True),
    sa.Column('reason', sa.String(length=512), nullable=True),
    sa.Column('correlation_id', sa.String(length=128), nullable=False),
    sa.Column('source_address_digest', sa.LargeBinary(length=32), nullable=True),
    sa.Column('metadata_json', sa.JSON(), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index('ix_audit_events_actor', 'audit_events', ['actor_type', 'actor_id', 'occurred_at'], unique=False)
    op.create_index('ix_audit_events_target', 'audit_events', ['target_type', 'target_id', 'occurred_at'], unique=False)
    op.create_table('idempotency_records',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('scope', sa.String(length=128), nullable=False),
    sa.Column('subject_key', sa.String(length=256), nullable=False),
    sa.Column('idempotency_key', sa.String(length=128), nullable=False),
    sa.Column('request_digest', sa.LargeBinary(length=32), nullable=False),
    sa.Column('response_status', sa.Integer(), nullable=False),
    sa.Column('response_json', sa.JSON(), nullable=False),
    sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('scope', 'subject_key', 'idempotency_key', name='uq_idempotency_scope_subject_key')
    )
    op.create_table('organizations',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('display_name', sa.String(length=256), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('outbox_events',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('event_type', sa.String(length=128), nullable=False),
    sa.Column('aggregate_type', sa.String(length=64), nullable=False),
    sa.Column('aggregate_id', sa.String(length=128), nullable=False),
    sa.Column('payload_json', sa.JSON(), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('available_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('attempts', sa.Integer(), nullable=False),
    sa.Column('processed_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('attempts >= 0', name='ck_outbox_attempts'),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index('ix_outbox_delivery', 'outbox_events', ['status', 'available_at'], unique=False)
    op.create_table('signing_key_metadata',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('key_id', sa.String(length=128), nullable=False),
    sa.Column('purpose', sa.String(length=64), nullable=False),
    sa.Column('public_key_bytes', sa.LargeBinary(), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('not_before', sa.DateTime(timezone=True), nullable=False),
    sa.Column('expires_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('key_id')
    )
    op.create_table('users',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('external_issuer', sa.String(length=256), nullable=False),
    sa.Column('external_subject', sa.String(length=256), nullable=False),
    sa.Column('verified_email', sa.String(length=256), nullable=True),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('is_server_admin', sa.Boolean(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('external_issuer', 'external_subject', name='uq_users_external_identity')
    )
    op.create_table('webhook_events',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('provider', sa.String(length=32), nullable=False),
    sa.Column('provider_event_id', sa.String(length=256), nullable=False),
    sa.Column('provider_object_id', sa.String(length=256), nullable=True),
    sa.Column('signature_valid', sa.Boolean(), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('payload_digest', sa.LargeBinary(length=32), nullable=False),
    sa.Column('processed_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('error_code', sa.String(length=64), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('provider', 'provider_event_id', name='uq_webhook_events_provider_event')
    )
    op.create_table('devices',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('owner_user_id', sa.String(length=128), nullable=True),
    sa.Column('owner_organization_id', sa.String(length=128), nullable=True),
    sa.Column('friendly_name', sa.String(length=128), nullable=False),
    sa.Column('device_type', sa.String(length=32), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('evidence_schema_version', sa.Integer(), nullable=False),
    sa.Column('evidence_digests', sa.JSON(), nullable=False),
    sa.Column('last_seen_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.ForeignKeyConstraint(['owner_organization_id'], ['organizations.id'], ),
    sa.ForeignKeyConstraint(['owner_user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('licenses',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('product_id', sa.String(length=128), nullable=False),
    sa.Column('owner_user_id', sa.String(length=128), nullable=True),
    sa.Column('owner_organization_id', sa.String(length=128), nullable=True),
    sa.Column('anonymous_subject_digest', sa.LargeBinary(length=32), nullable=True),
    sa.Column('subject_type', sa.String(length=32), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('device_policy_id', sa.String(length=128), nullable=False),
    sa.Column('revocation_generation', sa.Integer(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('(CASE WHEN owner_user_id IS NULL THEN 0 ELSE 1 END + CASE WHEN owner_organization_id IS NULL THEN 0 ELSE 1 END + CASE WHEN anonymous_subject_digest IS NULL THEN 0 ELSE 1 END) = 1', name='ck_licenses_exactly_one_owner'),
    sa.ForeignKeyConstraint(['owner_organization_id'], ['organizations.id'], ),
    sa.ForeignKeyConstraint(['owner_user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index('ix_licenses_anonymous_subject', 'licenses', ['anonymous_subject_digest'], unique=False)
    op.create_index('ix_licenses_owner_organization', 'licenses', ['owner_organization_id'], unique=False)
    op.create_index('ix_licenses_owner_user', 'licenses', ['owner_user_id'], unique=False)
    op.create_table('memberships',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('organization_id', sa.String(length=128), nullable=False),
    sa.Column('user_id', sa.String(length=128), nullable=False),
    sa.Column('role', sa.String(length=32), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('valid_until', sa.DateTime(timezone=True), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('organization_id', 'user_id', name='uq_memberships_organization_user')
    )
    op.create_table('serial_batches',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('sku_id', sa.String(length=128), nullable=False),
    sa.Column('quantity', sa.Integer(), nullable=False),
    sa.Column('campaign', sa.String(length=256), nullable=True),
    sa.Column('reason', sa.String(length=512), nullable=False),
    sa.Column('created_by_user_id', sa.String(length=128), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('redemption_deadline', sa.DateTime(timezone=True), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('quantity > 0', name='ck_serial_batches_quantity'),
    sa.ForeignKeyConstraint(['created_by_user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('device_installations',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('installation_id', sa.String(length=128), nullable=False),
    sa.Column('device_id', sa.String(length=128), nullable=False),
    sa.Column('public_key_der', sa.LargeBinary(), nullable=False),
    sa.Column('key_thumbprint', sa.String(length=128), nullable=False),
    sa.Column('key_provider', sa.String(length=64), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('last_seen_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.ForeignKeyConstraint(['device_id'], ['devices.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('installation_id'),
    sa.UniqueConstraint('key_thumbprint')
    )
    op.create_table('grants',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('license_id', sa.String(length=128), nullable=False),
    sa.Column('sku_id', sa.String(length=128), nullable=False),
    sa.Column('source_type', sa.String(length=64), nullable=False),
    sa.Column('source_reference', sa.String(length=256), nullable=False),
    sa.Column('catalog_revision', sa.Integer(), nullable=False),
    sa.Column('starts_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('ends_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('metadata_json', sa.JSON(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('ends_at IS NULL OR ends_at > starts_at', name='ck_grants_validity'),
    sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('source_type', 'source_reference', name='uq_grants_source')
    )
    op.create_index('ix_grants_license_validity', 'grants', ['license_id', 'status', 'starts_at', 'ends_at'], unique=False)
    op.create_table('serials',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('batch_id', sa.String(length=128), nullable=False),
    sa.Column('lookup_id', sa.String(length=16), nullable=False),
    sa.Column('secret_digest', sa.LargeBinary(length=32), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('reserved_user_id', sa.String(length=128), nullable=True),
    sa.Column('redeemed_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('redeemed_by_user_id', sa.String(length=128), nullable=True),
    sa.Column('redeemed_license_id', sa.String(length=128), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.ForeignKeyConstraint(['batch_id'], ['serial_batches.id'], ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['redeemed_by_user_id'], ['users.id'], ),
    sa.ForeignKeyConstraint(['redeemed_license_id'], ['licenses.id'], ),
    sa.ForeignKeyConstraint(['reserved_user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('lookup_id')
    )
    op.create_table('subscriptions',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('license_id', sa.String(length=128), nullable=False),
    sa.Column('provider', sa.String(length=32), nullable=False),
    sa.Column('provider_subscription_id', sa.String(length=256), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('current_period_start', sa.DateTime(timezone=True), nullable=False),
    sa.Column('current_period_end', sa.DateTime(timezone=True), nullable=False),
    sa.Column('cancel_at_period_end', sa.Boolean(), nullable=False),
    sa.Column('grace_ends_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('current_period_end > current_period_start', name='ck_subscriptions_period'),
    sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('provider', 'provider_subscription_id', name='uq_subscriptions_provider_id')
    )
    op.create_table('activations',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('license_id', sa.String(length=128), nullable=False),
    sa.Column('device_id', sa.String(length=128), nullable=False),
    sa.Column('installation_id', sa.String(length=128), nullable=False),
    sa.Column('seat_id', sa.String(length=128), nullable=True),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('activated_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('deactivated_at', sa.DateTime(timezone=True), nullable=True),
    sa.Column('release_reason', sa.String(length=512), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint("(status = 'active' AND deactivated_at IS NULL) OR (status <> 'active' AND deactivated_at IS NOT NULL)", name='ck_activations_lifecycle'),
    sa.ForeignKeyConstraint(['device_id'], ['devices.id'], ),
    sa.ForeignKeyConstraint(['installation_id'], ['device_installations.id'], ),
    sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index('ix_activations_device_status', 'activations', ['device_id', 'status'], unique=False)
    op.create_index('ix_activations_license_status', 'activations', ['license_id', 'status'], unique=False)
    op.create_table('subscription_items',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('subscription_id', sa.String(length=128), nullable=False),
    sa.Column('sku_id', sa.String(length=128), nullable=False),
    sa.Column('quantity', sa.Integer(), nullable=False),
    sa.Column('provider_item_id', sa.String(length=256), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('quantity > 0', name='ck_subscription_items_quantity'),
    sa.ForeignKeyConstraint(['subscription_id'], ['subscriptions.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('subscription_id', 'sku_id', name='uq_subscription_items_sku')
    )
    op.create_table('trials',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('license_id', sa.String(length=128), nullable=False),
    sa.Column('grant_id', sa.String(length=128), nullable=False),
    sa.Column('subject_digest', sa.LargeBinary(length=32), nullable=False),
    sa.Column('starts_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('ends_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('status', sa.String(length=32), nullable=False),
    sa.Column('extension_count', sa.Integer(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('ends_at > starts_at', name='ck_trials_validity'),
    sa.CheckConstraint('extension_count >= 0', name='ck_trials_extension_count'),
    sa.ForeignKeyConstraint(['grant_id'], ['grants.id'], ),
    sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('subject_digest', name='uq_trials_subject_digest')
    )
    op.create_table('leases',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('snapshot_id', sa.String(length=128), nullable=False),
    sa.Column('license_id', sa.String(length=128), nullable=False),
    sa.Column('activation_id', sa.String(length=128), nullable=False),
    sa.Column('signing_key_id', sa.String(length=128), nullable=False),
    sa.Column('snapshot_digest', sa.LargeBinary(length=32), nullable=False),
    sa.Column('issued_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('revocation_generation', sa.Integer(), nullable=False),
    sa.Column('document_json', sa.JSON(), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.CheckConstraint('expires_at > issued_at', name='ck_leases_validity'),
    sa.ForeignKeyConstraint(['activation_id'], ['activations.id'], ),
    sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('snapshot_id')
    )
    op.create_table('serial_redemptions',
    sa.Column('id', sa.String(length=128), nullable=False),
    sa.Column('serial_id', sa.String(length=128), nullable=False),
    sa.Column('license_id', sa.String(length=128), nullable=False),
    sa.Column('grant_id', sa.String(length=128), nullable=False),
    sa.Column('activation_id', sa.String(length=128), nullable=False),
    sa.Column('actor_user_id', sa.String(length=128), nullable=True),
    sa.Column('idempotency_key', sa.String(length=128), nullable=False),
    sa.Column('snapshot_id', sa.String(length=128), nullable=False),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
    sa.ForeignKeyConstraint(['activation_id'], ['activations.id'], ),
    sa.ForeignKeyConstraint(['actor_user_id'], ['users.id'], ),
    sa.ForeignKeyConstraint(['grant_id'], ['grants.id'], ),
    sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], ),
    sa.ForeignKeyConstraint(['serial_id'], ['serials.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('actor_user_id', 'idempotency_key', name='uq_serial_redemptions_actor_idempotency'),
    sa.UniqueConstraint('serial_id', name='uq_serial_redemptions_serial')
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('serial_redemptions')
    op.drop_table('leases')
    op.drop_table('trials')
    op.drop_table('subscription_items')
    op.drop_index('ix_activations_license_status', table_name='activations')
    op.drop_index('ix_activations_device_status', table_name='activations')
    op.drop_table('activations')
    op.drop_table('subscriptions')
    op.drop_table('serials')
    op.drop_index('ix_grants_license_validity', table_name='grants')
    op.drop_table('grants')
    op.drop_table('device_installations')
    op.drop_table('serial_batches')
    op.drop_table('memberships')
    op.drop_index('ix_licenses_owner_user', table_name='licenses')
    op.drop_index('ix_licenses_owner_organization', table_name='licenses')
    op.drop_index('ix_licenses_anonymous_subject', table_name='licenses')
    op.drop_table('licenses')
    op.drop_table('devices')
    op.drop_table('webhook_events')
    op.drop_table('users')
    op.drop_table('signing_key_metadata')
    op.drop_index('ix_outbox_delivery', table_name='outbox_events')
    op.drop_table('outbox_events')
    op.drop_table('organizations')
    op.drop_table('idempotency_records')
    op.drop_index('ix_audit_events_target', table_name='audit_events')
    op.drop_index('ix_audit_events_actor', table_name='audit_events')
    op.drop_table('audit_events')
    # ### end Alembic commands ###

