From 5283ab9b514a6c9eaa1ce3dafaeb1bdc818db01f Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 18 Apr 2026 21:39:54 +0200 Subject: [PATCH] feat(recipe): Bild manuell hochladen / ersetzen / entfernen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neuer Endpoint POST/DELETE /api/recipes/:id/image. * Multipart-Upload mit Feld "file". * Whitelist: JPG, PNG, WebP, GIF, AVIF. Max 10 MB. * Dedupe per SHA-256-Filename analog zu downloadImage(). - updateImagePath()-Repo-Funktion ergänzt. - RecipeEditor: neuer Block "Bild" ganz oben. Preview + Buttons "Hochladen"/"Ersetzen"/"Entfernen". Upload passiert direkt beim Auswählen, nicht erst bei "Speichern" — das Bild ist eigene Ressource, Abbrechen rollt es nicht zurück (okay, da dedupliziert). - onimagechange-Callback informiert die Detail-Ansicht, damit die Preview im RecipeView auch nach Abbrechen aktuell bleibt. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/components/RecipeEditor.svelte | 185 ++++++++++++++++++- src/lib/server/recipes/repository.ts | 11 ++ src/routes/api/recipes/[id]/image/+server.ts | 61 ++++++ src/routes/recipes/[id]/+page.svelte | 1 + 4 files changed, 256 insertions(+), 2 deletions(-) create mode 100644 src/routes/api/recipes/[id]/image/+server.ts diff --git a/src/lib/components/RecipeEditor.svelte b/src/lib/components/RecipeEditor.svelte index 1f5c063..9aee916 100644 --- a/src/lib/components/RecipeEditor.svelte +++ b/src/lib/components/RecipeEditor.svelte @@ -1,6 +1,8 @@
+
+

Bild

+
+
+ {#if imageSrc} + + {:else} + Kein Bild + {/if} +
+
+ + {#if imagePath} + + {/if} + {#if uploading} + Lade … + {/if} +
+ +
+

Max. 10 MB. JPG, PNG, WebP, GIF oder AVIF.

+
+