feat: publication management with cover images, PDFs, and fruit images (story #04)

Full CRUD for publications; link fruits to publications; upload per-fruit
PDF descriptions and fruit images stored as BYTEA; fruit detail page shows
publication descriptions and images. ImageOverlayDrawer for cover thumbnail
full-size view.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-18 10:48:08 +02:00
co-authored by Claude Sonnet 4.6
parent 2e3f0f366c
commit fce4d67cbe
18 changed files with 3116 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
package domain
import "time"
type Publication struct {
ID int `json:"id"`
Title string `json:"title"`
Author *string `json:"author"`
OSDBPubID string `json:"osdb_pub_id"`
ImageURL *string `json:"image_url,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
type PublicationWriteDTO struct {
Title string `json:"title"`
Author *string `json:"author"`
OSDBPubID string `json:"osdb_pub_id"`
}
type PublicationFruit struct {
FruitID int `json:"fruit_id"`
Name string `json:"name"`
OSDBNumber string `json:"osdb_number"`
}
type PublicationDescription struct {
ID int `json:"id"`
PublicationID int `json:"publication_id"`
FruitID int `json:"fruit_id"`
FruitName string `json:"fruit_name"`
PublicationTitle string `json:"publication_title"`
URL string `json:"url"`
CreatedAt time.Time `json:"created_at"`
}
type PublicationFruitImage struct {
ID int `json:"id"`
PublicationID int `json:"publication_id"`
PublicationTitle string `json:"publication_title"`
PublicationAuthor *string `json:"publication_author"`
FruitID int `json:"fruit_id"`
Filename *string `json:"filename"`
ImageType string `json:"image_type"`
URL string `json:"url"`
CreatedAt time.Time `json:"created_at"`
}