UMBRA/backend/alembic/versions/035_add_performance_indexes.py
Kyle Pope cbf4663e8d Fix TS build errors and apply remaining QA fixes
Remove unused imports (UserCheck, Loader2, ShieldOff) and replace
non-existent SmartphoneOff icon with Smartphone in admin components.
Includes backend query fixes, performance indexes migration, and
admin page shared utilities extraction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 04:42:23 +08:00

65 lines
1.9 KiB
Python

"""Add performance indexes for hot query paths.
Covers:
- calendar_events range queries scoped by calendar (dashboard, notifications)
- calendar_events starred query (dashboard widget)
- calendar_events parent_event_id (recurring series DELETE)
- user_sessions lookup (auth middleware, every request)
- ntfy_sent purge query (background job, every 60s)
Revision ID: 035
Revises: 034
Create Date: 2026-02-27
"""
from alembic import op
revision = "035"
down_revision = "034"
branch_labels = None
depends_on = None
def upgrade() -> None:
# Composite index for event range queries scoped by calendar
op.create_index(
"ix_calendar_events_calendar_start_end",
"calendar_events",
["calendar_id", "start_datetime", "end_datetime"],
)
# Partial index for starred events dashboard query
op.create_index(
"ix_calendar_events_calendar_starred",
"calendar_events",
["calendar_id", "is_starred"],
)
# FK lookup index for recurring children DELETE
op.create_index(
"ix_calendar_events_parent_id",
"calendar_events",
["parent_event_id"],
)
# Composite index for session validation (runs on every authenticated request)
op.create_index(
"ix_user_sessions_lookup",
"user_sessions",
["user_id", "revoked", "expires_at"],
)
# Index for ntfy_sent purge query (DELETE WHERE sent_at < cutoff)
op.create_index(
"ix_ntfy_sent_sent_at",
"ntfy_sent",
["sent_at"],
)
def downgrade() -> None:
op.drop_index("ix_ntfy_sent_sent_at", table_name="ntfy_sent")
op.drop_index("ix_user_sessions_lookup", table_name="user_sessions")
op.drop_index("ix_calendar_events_parent_id", table_name="calendar_events")
op.drop_index("ix_calendar_events_calendar_starred", table_name="calendar_events")
op.drop_index("ix_calendar_events_calendar_start_end", table_name="calendar_events")