Add image infrastructure, API, and detail page integration:
- EntityImage domain model with ImageRepository trait
- SQLite storage for images and thumbnails as BLOBs
- Image processing with data URL decoding and thumbnail generation
- REST API: upload, get, delete, thumbnail at /{entity_type}/{id}/image
- resolve_image_url helper for image fallback chains
- image-upload web component for direct upload on detail pages
- Image display with vignette overlay and lightbox viewer
- Template macros: image_thumbnail, readonly_image, lightbox_script
- All 7 detail pages updated with image thumbnails
- Brew images fall back to roast; cup images fall back to cafe then roast
- Delete handler macro extended with optional image cleanup
12 lines
489 B
SQL
12 lines
489 B
SQL
CREATE TABLE entity_images (
|
|
id INTEGER PRIMARY KEY,
|
|
entity_type TEXT NOT NULL CHECK (entity_type IN ('roaster', 'roast', 'gear', 'cafe', 'brew', 'cup')),
|
|
entity_id INTEGER NOT NULL,
|
|
content_type TEXT NOT NULL,
|
|
image_data BLOB NOT NULL,
|
|
thumbnail_data BLOB NOT NULL,
|
|
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
|
UNIQUE(entity_type, entity_id)
|
|
);
|
|
|
|
CREATE INDEX idx_entity_images_lookup ON entity_images (entity_type, entity_id);
|