Upload flow
- Admin uploads files to
/api/admin/media (multipart files).
- Worker detects MIME, extracts dimensions, and tries to read EXIF taken date.
- Original is stored in R2 under
originals/<id>.<ext>.
- A thumbnail is created via Cloudflare Image Resizing (if possible) and stored as
thumbs/<id>.webp.
- 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.
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