zcbot/db/migrations/versions/20260527_1000_0008_user_dis...

45 lines
1.4 KiB
Python

"""user_disk_usage 表(§7.5 #4 软配额).
Revision ID: 0008
Revises: 0007
Create Date: 2026-05-27
per-user 工作目录字节使用快照,lifespan 后台 task 周期(默 15min)扫描 user_root 落库;
write 前 gate(DockerExecutor / /v1/files/upload)查这表对比 yaml `quotas.disk_bytes_per_user`,
超额返 [Error] 硬阻。
扫描间隙写入轻微突破上限接受(race-tolerant,跟 image/video 配额一致);外部用户开放前
OS 层 xfs prjquota 兜底真上限(§7.5 #4)。
"""
from typing import Sequence, Union
import sqlalchemy as sa
from alembic import op
revision: str = "0008"
down_revision: Union[str, None] = "0007"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.create_table(
"user_disk_usage",
sa.Column("user_id", sa.UUID(as_uuid=True), nullable=False),
sa.Column("bytes_used", sa.BigInteger(), nullable=False,
server_default=sa.text("0")),
sa.Column("file_count", sa.Integer(), nullable=False,
server_default=sa.text("0")),
sa.Column("scanned_at", sa.DateTime(timezone=True), nullable=False,
server_default=sa.func.now()),
sa.PrimaryKeyConstraint("user_id"),
sa.ForeignKeyConstraint(
["user_id"], ["users.user_id"], ondelete="CASCADE",
),
)
def downgrade() -> None:
op.drop_table("user_disk_usage")