- Add soft delete (deleted_at column) to preserve task records for statistics - Implement cleanup service to delete old files while keeping DB records - Add automatic cleanup scheduler (configurable interval, default 24h) - Add admin endpoints: storage stats, cleanup trigger, scheduler status - Update task service with admin views (include deleted/files_deleted) - Add frontend storage management UI in admin dashboard - Add i18n translations for storage management 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
35 lines
982 B
Python
35 lines
982 B
Python
"""add_deleted_at_to_tasks
|
|
|
|
Revision ID: f3d499f5d0cf
|
|
Revises: g2b3c4d5e6f7
|
|
Create Date: 2025-12-14 12:17:25.176482
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = 'f3d499f5d0cf'
|
|
down_revision: Union[str, None] = 'g2b3c4d5e6f7'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Add deleted_at column for soft delete support."""
|
|
op.add_column(
|
|
'tool_ocr_tasks',
|
|
sa.Column('deleted_at', sa.DateTime(), nullable=True,
|
|
comment='Soft delete timestamp - NULL means not deleted')
|
|
)
|
|
op.create_index('ix_tool_ocr_tasks_deleted_at', 'tool_ocr_tasks', ['deleted_at'])
|
|
|
|
|
|
def downgrade() -> None:
|
|
"""Remove deleted_at column."""
|
|
op.drop_index('ix_tool_ocr_tasks_deleted_at', table_name='tool_ocr_tasks')
|
|
op.drop_column('tool_ocr_tasks', 'deleted_at')
|