feat: fruit overview with thumbnails and card layout (story #07)
- Auto-crop thumbnails on image upload (Go stdlib, no external deps): find non-background bounding box, pad 5px, scale to ≤300px, encode JPEG - Add thumbnail_data BYTEA column to fruit_images and publication_fruit_images - New GET /api/v1/fruits/:id/images/:imageId/thumbnail endpoint (fallback to full data) - New GET /api/v1/publications/:id/fruit-images/:imgId/thumbnail endpoint - New POST /api/v1/admin/backfill-thumbnails to retroactively generate thumbnails - ListFruits response now includes synonyms and thumbnail_url per fruit - Replace FruitList table with responsive FruitCard grid (thumbnail + name + OSDB ID + type + synonyms) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -265,6 +265,14 @@ func (r *fakePubRepo) GetFruitImageData(_ context.Context, pubID, imgID int) ([]
|
||||
return r.fruitImgData[imgID], nil
|
||||
}
|
||||
|
||||
func (r *fakePubRepo) GetFruitImageThumbnailData(_ context.Context, pubID, imgID int) ([]byte, error) {
|
||||
img, ok := r.fruitImages[imgID]
|
||||
if !ok || img.PublicationID != pubID {
|
||||
return nil, handler.ErrNotFound
|
||||
}
|
||||
return r.fruitImgData[imgID], nil
|
||||
}
|
||||
|
||||
func (r *fakePubRepo) DeleteFruitImage(_ context.Context, pubID, imgID int) error {
|
||||
img, ok := r.fruitImages[imgID]
|
||||
if !ok || img.PublicationID != pubID {
|
||||
|
||||
Reference in New Issue
Block a user