feat(phase7.2): media browser with server-side filters + pagination

- Migration 052: indexes on media_assets(asset_type, created_at) and
  products(category_key, lagertyp) for efficient filter queries
- GET /api/media/assets: JOINs media_assets→products→order_lines,
  filters by asset_type / category_key / render_status / q (ILIKE),
  paginated (page/page_size), returns total+pages count
- New schemas: MediaAssetBrowseItem, MediaAssetBrowseResponse
- frontend/src/api/media.ts: getMediaAssets(filters), typed interfaces
- MediaBrowser.tsx: rewritten with sticky filter bar (debounced search,
  type/category/status dropdowns), responsive grid, image previews,
  download buttons, pagination footer with page size selector
- Renamed legacy function to listMediaAssets for backward compat

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 20:24:03 +01:00
parent 89c44b846f
commit c99976cc85
8 changed files with 482 additions and 502 deletions
@@ -0,0 +1,31 @@
"""Add indexes for media browser filtering.
Revision ID: 052
Revises: 051
"""
from alembic import op
revision = "052"
down_revision = "051"
branch_labels = None
depends_on = None
def upgrade() -> None:
# Index for filtering media_assets by asset_type + created_at ordering
op.create_index(
"ix_media_assets_asset_type_created",
"media_assets",
["asset_type", "created_at"],
)
# Index for filtering products by category + lagertyp
op.create_index(
"ix_products_category_lagertyp",
"products",
["category_key", "lagertyp"],
)
def downgrade() -> None:
op.drop_index("ix_products_category_lagertyp", table_name="products")
op.drop_index("ix_media_assets_asset_type_created", table_name="media_assets")