feat(03-01): add storage and thumbnail utilities

- Add storage.ts with directory management and file I/O
- Add thumbnails.ts with EXIF-aware thumbnail generation
- Thumbnails always output as JPEG with 80% quality
This commit is contained in:
Thomas Richter
2026-01-29 15:23:08 +01:00
parent f5b5034f07
commit 0987d16dc0
2 changed files with 84 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
import sharp from 'sharp';
/**
* Generate a thumbnail from an image buffer
*
* CRITICAL: Uses sharp.rotate() first to handle EXIF orientation from mobile photos.
* Without this, photos taken in portrait mode may appear rotated.
*
* @param buffer - Original image buffer
* @param size - Thumbnail size (default 150px)
* @returns Thumbnail buffer as JPEG
*/
export async function generateThumbnail(buffer: Buffer, size: number = 150): Promise<Buffer> {
return sharp(buffer)
.rotate() // Auto-rotate based on EXIF orientation
.resize(size, size, {
fit: 'cover',
position: 'center',
withoutEnlargement: true
})
.jpeg({ quality: 80 })
.toBuffer();
}