上传素材管控-历史素材success

This commit is contained in:
2026-07-08 16:25:03 +08:00
parent 657505e63b
commit d085a6d2ec
47 changed files with 5424 additions and 447 deletions
@@ -0,0 +1,133 @@
"""add upload resource physical delete status
Revision ID: 1475d11b1d74
Revises: cd7688999204
Create Date: 2026-07-08 15:14:13.995718
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '1475d11b1d74'
down_revision: Union[str, None] = 'cd7688999204'
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('upload_resources',
sa.Column('id', sa.String(length=32), nullable=False),
sa.Column('user_id', sa.String(length=32), nullable=False),
sa.Column('module', sa.String(length=64), nullable=False),
sa.Column('resource_type', sa.String(length=32), nullable=False),
sa.Column('resource_url', sa.Text(), nullable=False),
sa.Column('storage_path', sa.Text(), nullable=False),
sa.Column('file_name', sa.String(length=255), nullable=True),
sa.Column('file_ext', sa.String(length=32), nullable=True),
sa.Column('mime_type', sa.String(length=128), nullable=True),
sa.Column('file_size_bytes', sa.BigInteger(), server_default='0', nullable=False),
sa.Column('duration_seconds', sa.Float(), nullable=True),
sa.Column('duration_source', sa.String(length=32), nullable=True),
sa.Column('width', sa.BigInteger(), nullable=True),
sa.Column('height', sa.BigInteger(), nullable=True),
sa.Column('source_model', sa.String(length=64), nullable=True),
sa.Column('source_id', sa.String(length=32), nullable=True),
sa.Column('source_module', sa.String(length=64), nullable=True),
sa.Column('bind_status', sa.String(length=32), server_default='pending', nullable=False),
sa.Column('delete_policy', sa.String(length=32), server_default='user_deletable', nullable=False),
sa.Column('created_by', sa.String(length=32), server_default='api', nullable=False),
sa.Column('metadata_json', sa.Text(), nullable=True),
sa.Column('capacity_released_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('physical_deleted_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('file_delete_status', sa.String(length=32), server_default='active', nullable=False),
sa.Column('file_delete_error', sa.Text(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('storage_path', name='uq_upload_resources_storage_path')
)
op.create_index(op.f('ix_upload_resources_bind_status'), 'upload_resources', ['bind_status'], unique=False)
op.create_index(op.f('ix_upload_resources_capacity_released_at'), 'upload_resources', ['capacity_released_at'], unique=False)
op.create_index('ix_upload_resources_created', 'upload_resources', ['created_at'], unique=False)
op.create_index(op.f('ix_upload_resources_created_by'), 'upload_resources', ['created_by'], unique=False)
op.create_index(op.f('ix_upload_resources_delete_policy'), 'upload_resources', ['delete_policy'], unique=False)
op.create_index(op.f('ix_upload_resources_deleted_at'), 'upload_resources', ['deleted_at'], unique=False)
op.create_index('ix_upload_resources_file_delete_status', 'upload_resources', ['file_delete_status'], unique=False)
op.create_index(op.f('ix_upload_resources_module'), 'upload_resources', ['module'], unique=False)
op.create_index('ix_upload_resources_physical_deleted', 'upload_resources', ['physical_deleted_at'], unique=False)
op.create_index(op.f('ix_upload_resources_resource_type'), 'upload_resources', ['resource_type'], unique=False)
op.create_index('ix_upload_resources_source', 'upload_resources', ['source_model', 'source_id', 'deleted_at'], unique=False)
op.create_index(op.f('ix_upload_resources_source_id'), 'upload_resources', ['source_id'], unique=False)
op.create_index(op.f('ix_upload_resources_source_model'), 'upload_resources', ['source_model'], unique=False)
op.create_index('ix_upload_resources_url', 'upload_resources', ['resource_url'], unique=False)
op.create_index('ix_upload_resources_user_bind', 'upload_resources', ['user_id', 'bind_status', 'deleted_at'], unique=False)
op.create_index(op.f('ix_upload_resources_user_id'), 'upload_resources', ['user_id'], unique=False)
op.create_index('ix_upload_resources_user_module_type', 'upload_resources', ['user_id', 'module', 'resource_type', 'deleted_at'], unique=False)
op.create_index(
'ix_upload_resources_history_lookup',
'upload_resources',
['user_id', 'resource_type', sa.text('created_at DESC')],
unique=False,
postgresql_where=sa.text(
"deleted_at IS NULL "
"AND bind_status = 'pending' "
"AND delete_policy = 'user_deletable' "
"AND source_model IS NULL "
"AND source_id IS NULL"
),
)
op.add_column('user_resource_month_stats', sa.Column('upload_size_bytes', sa.BigInteger(), server_default='0', nullable=False))
op.add_column('user_resource_month_stats', sa.Column('audio_size_bytes', sa.BigInteger(), server_default='0', nullable=False))
op.add_column('user_resource_month_stats', sa.Column('shot_segment_size_bytes', sa.BigInteger(), server_default='0', nullable=False))
op.add_column('user_resource_month_stats', sa.Column('upload_count', sa.Integer(), server_default='0', nullable=False))
op.add_column('user_resource_month_stats', sa.Column('audio_count', sa.Integer(), server_default='0', nullable=False))
op.add_column('user_resource_month_stats', sa.Column('shot_segment_count', sa.Integer(), server_default='0', nullable=False))
op.add_column('user_resource_total_stats', sa.Column('upload_size_bytes', sa.BigInteger(), server_default='0', nullable=False))
op.add_column('user_resource_total_stats', sa.Column('audio_size_bytes', sa.BigInteger(), server_default='0', nullable=False))
op.add_column('user_resource_total_stats', sa.Column('shot_segment_size_bytes', sa.BigInteger(), server_default='0', nullable=False))
op.add_column('user_resource_total_stats', sa.Column('upload_count', sa.Integer(), server_default='0', nullable=False))
op.add_column('user_resource_total_stats', sa.Column('audio_count', sa.Integer(), server_default='0', nullable=False))
op.add_column('user_resource_total_stats', sa.Column('shot_segment_count', sa.Integer(), server_default='0', nullable=False))
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('user_resource_total_stats', 'shot_segment_count')
op.drop_column('user_resource_total_stats', 'audio_count')
op.drop_column('user_resource_total_stats', 'upload_count')
op.drop_column('user_resource_total_stats', 'shot_segment_size_bytes')
op.drop_column('user_resource_total_stats', 'audio_size_bytes')
op.drop_column('user_resource_total_stats', 'upload_size_bytes')
op.drop_column('user_resource_month_stats', 'shot_segment_count')
op.drop_column('user_resource_month_stats', 'audio_count')
op.drop_column('user_resource_month_stats', 'upload_count')
op.drop_column('user_resource_month_stats', 'shot_segment_size_bytes')
op.drop_column('user_resource_month_stats', 'audio_size_bytes')
op.drop_column('user_resource_month_stats', 'upload_size_bytes')
op.drop_index('ix_upload_resources_history_lookup', table_name='upload_resources')
op.drop_index('ix_upload_resources_user_module_type', table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_user_id'), table_name='upload_resources')
op.drop_index('ix_upload_resources_user_bind', table_name='upload_resources')
op.drop_index('ix_upload_resources_url', table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_source_model'), table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_source_id'), table_name='upload_resources')
op.drop_index('ix_upload_resources_source', table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_resource_type'), table_name='upload_resources')
op.drop_index('ix_upload_resources_physical_deleted', table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_module'), table_name='upload_resources')
op.drop_index('ix_upload_resources_file_delete_status', table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_deleted_at'), table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_delete_policy'), table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_created_by'), table_name='upload_resources')
op.drop_index('ix_upload_resources_created', table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_capacity_released_at'), table_name='upload_resources')
op.drop_index(op.f('ix_upload_resources_bind_status'), table_name='upload_resources')
op.drop_table('upload_resources')
# ### end Alembic commands ###