feat(userbot,api,frontend): file links, media downloads, story hold-pause, drop scheduled dupes
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
"""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")
|
||||
Reference in New Issue
Block a user