Files
OCR/backend/alembic/versions/f3d499f5d0cf_add_deleted_at_to_tasks.py
egg 73112db055 feat: add storage cleanup mechanism with soft delete and auto scheduler
- 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>
2025-12-14 12:41:01 +08:00

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')