Bellamy Book uses a Media layer for user and content assets: avatars, wallpapers (cover images), story media, and blog images/files. Media files are stored in MinIO or Cloudflare R2 (switchable via Storage:Provider config — see Storage Configuration). The API exposes upload endpoints and URLs for reading; MediaProcessingWorker (Kafka) can process uploads (e.g. thumbnails, transcoding) asynchronously.
Overview
- Uploads: User avatar, user wallpaper, user video, story media; default avatar and default wallpaper (admin). Blog images/files are handled via
api/Blog (upload-image, upload-file, featured image).
- API:
api/media — upload (avatar, wallpaper, video, story; default avatar/wallpaper); get by ID, by user, default URLs; get processing status. api/media/performance — stats and errors (admin/monitoring).
- Storage: MinIO or Cloudflare R2 buckets (
public, temp, files, support, backups). Temp files are cleaned by TempFileCleanupJob (see Scheduled Jobs). See Storage Configuration for setup.
API Endpoints
| Method | Endpoint | Description |
|---|
| POST | /api/media/avatar/{userId} | Upload user avatar |
| POST | /api/media/wallpaper/{userId} | Upload user cover/wallpaper |
| POST | /api/media/video/{userId} | Upload user video |
| POST | /api/media/story/{userId} | Upload story media |
| POST | /api/media/default/avatar | Upload default avatar (admin) |
| POST | /api/media/default/wallpaper | Upload default wallpaper (admin) |
| Method | Endpoint | Description |
|---|
| GET | /api/media/avatar/{userId} | Get user avatar URL |
| GET | /api/media/wallpaper/{userId} | Get user wallpaper URL |
| GET | /api/media/{mediaFileId} | Get media file by ID |
| GET | /api/media/{mediaFileId}/status | Get processing status |
| GET | /api/media/user/{userId} | Get media files for user |
| GET | /api/media/default/avatar | Get default avatar URL |
| GET | /api/media/default/wallpaper | Get default wallpaper URL |
| Method | Endpoint | Description |
|---|
| GET | /api/media/performance/stats | Aggregate media stats |
| GET | /api/media/performance/errors | Processing errors |
| GET | /api/media/performance/stats/by-type | Stats by media type |
Processing
- MediaProcessingWorker (Kafka) consumes media events and can generate thumbnails, transcode video, etc. Processed URLs are stored and returned by the read endpoints.
- TempFileCleanupJob (Quartz) deletes files in the temp bucket older than 24 hours.