74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
"""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")
|