"""file shares Revision ID: f2b8d3c9a51e Revises: e1c7a4b62d90 Create Date: 2026-08-13 10:30:00.000000 """ from collections.abc import Sequence from alembic import op revision: str = "f2b8d3c9a51e" down_revision: str | None = "e1c7a4b62d90" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None _SHARES = """ CREATE TABLE file_shares ( id serial PRIMARY KEY, account_id integer NOT NULL, token text NOT NULL UNIQUE, kind text NOT NULL, storage_key text NOT NULL, file_name text NOT NULL, mime text, file_size bigint, title text, chat_id bigint, message_id bigint, peer_id bigint, story_id bigint, expires_at timestamptz, max_downloads integer, download_count integer NOT NULL DEFAULT 0, last_download_at timestamptz, revoked_at timestamptz, created_at timestamptz NOT NULL DEFAULT now() ) """ _HITS = """ CREATE TABLE file_share_hits ( id bigserial PRIMARY KEY, share_id integer NOT NULL REFERENCES file_shares (id) ON DELETE CASCADE, ts timestamptz NOT NULL DEFAULT now(), method text NOT NULL, ip text, user_agent text, counted boolean NOT NULL DEFAULT false ) """ def upgrade() -> None: op.execute(_SHARES) op.execute( "CREATE INDEX ix_file_shares_account ON file_shares " "(account_id, created_at DESC)" ) op.execute( "CREATE INDEX ix_file_shares_subject ON file_shares " "(account_id, storage_key) WHERE revoked_at IS NULL" ) op.execute(_HITS) op.execute( "CREATE INDEX ix_file_share_hits_share ON file_share_hits (share_id, ts DESC)" ) def downgrade() -> None: op.execute("DROP TABLE IF EXISTS file_share_hits") op.execute("DROP TABLE IF EXISTS file_shares")