Files
HartOMat/backend/app/domains/media/schemas.py
T
Hartmut c99976cc85 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>
2026-03-08 20:24:03 +01:00

56 lines
1.4 KiB
Python

import uuid
from datetime import datetime
from pydantic import BaseModel
from app.domains.media.models import MediaAssetType
class MediaAssetOut(BaseModel):
id: uuid.UUID
tenant_id: uuid.UUID | None
product_id: uuid.UUID | None
cad_file_id: uuid.UUID | None
order_line_id: uuid.UUID | None
workflow_run_id: uuid.UUID | None
asset_type: MediaAssetType
storage_key: str
file_size_bytes: int | None
mime_type: str | None
width: int | None
height: int | None
duration_s: float | None
render_config: dict | None
is_archived: bool
created_at: datetime
download_url: str | None = None
thumbnail_url: str | None = None
model_config = {"from_attributes": True}
class MediaAssetBrowseItem(BaseModel):
"""Enriched asset item for the media browser endpoint."""
id: uuid.UUID
asset_type: MediaAssetType
file_path: str
file_size_bytes: int | None
mime_type: str | None
created_at: datetime
order_line_id: uuid.UUID | None
product_id: uuid.UUID | None
product_name: str | None
product_pim_id: str | None
category_key: str | None
render_status: str | None
download_url: str | None = None
thumbnail_url: str | None = None
model_config = {"from_attributes": True}
class MediaAssetBrowseResponse(BaseModel):
items: list[MediaAssetBrowseItem]
total: int
page: int
page_size: int
pages: int