Upload flow

  1. Admin uploads files to /api/admin/media (multipart files).
  2. Worker detects MIME, extracts dimensions, and tries to read EXIF taken date.
  3. Original is stored in R2 under originals/<id>.<ext>.
  4. A thumbnail is created via Cloudflare Image Resizing (if possible) and stored as thumbs/<id>.webp.
  5. KV record and indexes are updated; cache invalidation runs.

Upload flow (Mermaid)

flowchart LR
  Admin[Admin UI] -->|POST /api/admin/media| Worker[Gallery Worker]
  Worker -->|detect mime + EXIF| Proc[Image Processing]
  Proc -->|put originals/*| R2[R2 GALLERY_MEDIA]
  Proc -->|resize -> thumbs/*| R2
  Worker -->|media:<id>| KV[KV GALLERY_META]
  Worker -->|update indexes| KV
  Worker -->|invalidate cache| Cache[Cache API]

Thumbnail generation

  • Uses PUBLIC_MEDIA_BASE_URL to fetch the original through Image Resizing.
  • On failure, thumb is not stored; UI falls back to on-demand variants.

Public URLs

  • public_url uses /media/<key>?variant=display for lightbox.
  • thumb_url uses stored thumbs when available, otherwise /media/<key>?variant=thumb.

Media variants

  • variant=thumb: scaled to ~480px wide
  • variant=display: scaled to ~1600px wide
  • variant=original: raw bytes

Repair flow (Mermaid)

flowchart LR
  Admin[Admin UI] -->|POST /api/admin/repair/orphans| Worker[Gallery Worker]
  Worker -->|list originals + thumbs| R2[R2 GALLERY_MEDIA]
  Worker -->|list media:<id>| KV[KV GALLERY_META]
  Worker -->|delete orphans| R2
  Worker -->|delete orphaned records| KV
  Worker -->|rebuild indexes| KV