diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e03225..0ad176d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ die Versionierung [Semantic Versioning](https://semver.org/lang/de/). ## [Unreleased] +### Hinzugefügt + +- **Set aus einem Link übernehmen**, für alle Hersteller: Amazon, idealo, + geizhals, Hersteller-Shops, Brickfact oder Merlins Bricks. Bricktrack liest + Produktdaten (schema.org, Open Graph, bei Amazon die Produktseite) und, wenn + die Seite blockt, den Link selbst. Lego wird über Rebrickable ergänzt, + BlueBrixx und Cobi über Merlins Bricks. Das Ergebnis füllt das Formular vor, + das Bild wird beim Speichern lokal abgelegt. + +### Sicherheit + +- Abrufe im Auftrag eines Nutzers gehen nur an öffentliche Adressen: Jede + Adresse wird vor dem Verbindungsaufbau geprüft, Weiterleitungen ebenso, + Größe und Zeit sind begrenzt. + ## [0.4.0] - 2026-10-25 Ein neues Gesicht: Bricktrack sieht jetzt aus wie das, was es verwaltet. diff --git a/CLAUDE.md b/CLAUDE.md index 41a476e..19ca94f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -63,6 +63,8 @@ Bild-URLs, die der Nutzer selbst hinterlegt hat. | `src/lib/reminder-job.ts`, `src/lib/mailer.ts` | Versand und Zeitplan | | `src/lib/export.ts` | Export und Import des gesamten Bestands | | `src/lib/money.ts`, `src/lib/format.ts` | Cent-Umrechnung, dd.MM.yyyy | +| `src/lib/link-import.ts` | Set-Daten aus Link und Seite lesen (rein, testbar) | +| `src/lib/safe-fetch.ts`, `src/lib/net-guard.ts` | Abruf fremder URLs nur an oeffentliche Adressen | | `src/lib/design.ts`, `src/app/designs.css` | Designs: Namen und Cookie bzw. Tokens je `data-design` | | `src/components/brick/` | Noppen, Logo, Platzhalter fuer Sets ohne Bild | @@ -195,7 +197,9 @@ Session. nichts preis ausser den Wunschlisten-Daten - keine Nutzernamen, keine Sammlungsdaten, keine IDs anderer Objekte. 4. Externe API-Aufrufe (Rebrickable, ab Phase 2) laufen ausschliesslich - serverseitig. + serverseitig. URLs, die ein Nutzer eingibt (Link-Import, Bild-Uebernahme), + werden nur ueber `safeFetch` abgerufen - nie mit `fetch` direkt, sonst + erreicht der Server auch Geraete im Heimnetz. 5. Session-Cookies: `httpOnly`, `secure`, `sameSite=lax`. Rate-Limiting auf den Login-Endpunkten. 6. Der Export enthaelt **keine** Konten, Passwoerter oder Passkeys - und diff --git a/docs/ANLEITUNG.md b/docs/ANLEITUNG.md index 915b257..8d259c8 100644 --- a/docs/ANLEITUNG.md +++ b/docs/ANLEITUNG.md @@ -306,8 +306,35 @@ gib ihnen sprechende Namen. ## 11. Import und Scanner -Sets von Hand einzutippen ist der langsame Weg. Für Lego gibt es zwei -schnellere. +Sets von Hand einzutippen ist der langsame Weg. Es gibt drei schnellere. + +### Aus einem Link übernehmen – für alle Hersteller + +Auf **Katalog → Set anlegen** steht das Feld „Aus einem Link übernehmen". +Dort passt jeder Link zu einem Set hinein: Amazon, idealo, geizhals, der Shop +des Herstellers oder eine Set-Datenbank wie +[Brickfact](https://brickfact.com) (Lego) und +[Merlins Bricks](https://www.merlinsbricks.com) (BlueBrixx, Cobi und viele +mehr). „Übernehmen" füllt das Formular darunter aus – **gespeichert wird erst, +wenn du „Set anlegen" drückst**. Ein Blick auf Name und Nummer lohnt sich, +denn Shops schreiben gern das halbe Sortiment in den Titel. + +Was dabei passiert: + +1. Bricktrack liest die Seite und übernimmt Name, Setnummer, EAN, Bild, + Teile und Jahr, soweit sie dort stehen. +2. Manche Shops lassen sich nicht abfragen. Dann reicht oft schon der Link + selbst: In `amazon.de/LEGO-60398-Familienhaus-…` stecken Hersteller, + Nummer und Name. +3. Mit Hersteller und Nummer ergänzt Bricktrack den Rest: Lego über + Rebrickable (mit API-Key), BlueBrixx und Cobi über Merlins Bricks. + +Das Bild wird beim Speichern lokal abgelegt, die Quelle steht in den Notizen. +Gibt es den Hersteller noch nicht, wird er angelegt. Steht das Set schon im +Katalog, kommt statt des Formulars ein Link zum vorhandenen Eintrag. + +> Bricktrack ruft dafür nur öffentliche Adressen ab. Links ins eigene Netz – +> Router, NAS, andere Container – werden abgewiesen. ### Lego-Import über die Setnummer diff --git a/docs/bilder/02-start.png b/docs/bilder/02-start.png index 7f43ae3..05d013f 100644 Binary files a/docs/bilder/02-start.png and b/docs/bilder/02-start.png differ diff --git a/docs/bilder/03-verwaltung-hersteller.png b/docs/bilder/03-verwaltung-hersteller.png index 183ecc2..a416427 100644 Binary files a/docs/bilder/03-verwaltung-hersteller.png and b/docs/bilder/03-verwaltung-hersteller.png differ diff --git a/docs/bilder/05-fehlende-sets.png b/docs/bilder/05-fehlende-sets.png index cba66cc..3539d31 100644 Binary files a/docs/bilder/05-fehlende-sets.png and b/docs/bilder/05-fehlende-sets.png differ diff --git a/docs/bilder/06-mehrfachauswahl.png b/docs/bilder/06-mehrfachauswahl.png index 4ee6f3d..c05e66e 100644 Binary files a/docs/bilder/06-mehrfachauswahl.png and b/docs/bilder/06-mehrfachauswahl.png differ diff --git a/docs/bilder/07-wunschliste-dialog.png b/docs/bilder/07-wunschliste-dialog.png index 27d6ec0..d423f4f 100644 Binary files a/docs/bilder/07-wunschliste-dialog.png and b/docs/bilder/07-wunschliste-dialog.png differ diff --git a/docs/bilder/09-sammlung.png b/docs/bilder/09-sammlung.png index 4ebca63..bb83224 100644 Binary files a/docs/bilder/09-sammlung.png and b/docs/bilder/09-sammlung.png differ diff --git a/docs/bilder/10-wunschlisten.png b/docs/bilder/10-wunschlisten.png index cd9e6aa..fdcef8b 100644 Binary files a/docs/bilder/10-wunschlisten.png and b/docs/bilder/10-wunschlisten.png differ diff --git a/docs/bilder/11-wunschliste-bearbeiten.png b/docs/bilder/11-wunschliste-bearbeiten.png index 289ed5c..6584a66 100644 Binary files a/docs/bilder/11-wunschliste-bearbeiten.png and b/docs/bilder/11-wunschliste-bearbeiten.png differ diff --git a/docs/bilder/13-reservieren.png b/docs/bilder/13-reservieren.png index 832bdb9..26043cc 100644 Binary files a/docs/bilder/13-reservieren.png and b/docs/bilder/13-reservieren.png differ diff --git a/docs/bilder/15-wunschliste-reserviert.png b/docs/bilder/15-wunschliste-reserviert.png index 5bc421d..e39df29 100644 Binary files a/docs/bilder/15-wunschliste-reserviert.png and b/docs/bilder/15-wunschliste-reserviert.png differ diff --git a/docs/bilder/17-lego-import.png b/docs/bilder/17-lego-import.png index 69db989..5007027 100644 Binary files a/docs/bilder/17-lego-import.png and b/docs/bilder/17-lego-import.png differ diff --git a/docs/bilder/18-fehlteile.png b/docs/bilder/18-fehlteile.png index 63c926a..2f03d9d 100644 Binary files a/docs/bilder/18-fehlteile.png and b/docs/bilder/18-fehlteile.png differ diff --git a/docs/bilder/19-einladungen.png b/docs/bilder/19-einladungen.png index fc6aa12..f234a94 100644 Binary files a/docs/bilder/19-einladungen.png and b/docs/bilder/19-einladungen.png differ diff --git a/docs/bilder/21-sammler.png b/docs/bilder/21-sammler.png index 7b86943..454c589 100644 Binary files a/docs/bilder/21-sammler.png and b/docs/bilder/21-sammler.png differ diff --git a/docs/bilder/23-preise.png b/docs/bilder/23-preise.png index 18cac30..32dea35 100644 Binary files a/docs/bilder/23-preise.png and b/docs/bilder/23-preise.png differ