Feat #6: Dublettenprüfung #14

Merged
florian.wilde merged 1 commits from feat/6-dublettenpruefung into main 2026-08-21 08:46:50 +00:00
Owner

Beim Ablegen eines statischen Codes prüft der Server, ob in derselben Gruppe schon ein statischer Code mit identischem Typ und Inhalt liegt. Wenn ja: 409 mit dem gefundenen Eintrag (Name, Datum), und die Oberfläche zeigt eine Warnung samt Knopf Trotzdem ablegen.

Eine Rückfrage, keine Sperre — zwei Fassungen desselben Codes können gewollt sein.

Abgrenzungen

  • Nur statische Codes. Zwei dynamische Codes mit demselben Ziel sind der Normalfall, sobald zwei Kampagnen getrennt gezählt werden.
  • Verglichen wird der Inhalt, nicht die Gestaltung. Derselbe Code in Schwarz-Weiß und in Hausfarben gilt als Dublette — gescannt wird beides Mal dasselbe. Das steht so in der Warnung.
  • Gesucht wird nur in der Zielgruppe: Ein Treffer aus einer fremden Gruppe wäre nutzlos und verriete deren Bestand.
  • Der Vergleich läuft über jsonb-Gleichheit — Schlüsselreihenfolge im JSON spielt keine Rolle (mitgeprüft).

Geändert

  • src/lib/duplicates.ts (neu) — die Suche
  • src/app/api/codes/route.ts — Feld allowDuplicate, 409-Antwort mit duplicate
  • src/lib/api-client.ts — ApiError trägt jetzt status und details
  • src/components/qr-generator.tsx — Warnung, „Trotzdem ablegen“
  • docs/funktionen.md

Geprüft mit einer eigenen Testreihe: 24 von 24 — über die API (zweiter Anlauf, andere Gestaltung, allowDuplicate, anderer Inhalt, Schlüsselreihenfolge, dynamische Codes unbehelligt) und über die Oberfläche (Warnung, Name im Text, Verschwinden bei geändertem Inhalt, Wiederkehren beim ursprünglichen, „Trotzdem ablegen“).

Closes #6

Beim Ablegen eines statischen Codes prüft der Server, ob in derselben Gruppe schon ein statischer Code mit identischem Typ und Inhalt liegt. Wenn ja: **409** mit dem gefundenen Eintrag (Name, Datum), und die Oberfläche zeigt eine Warnung samt Knopf **Trotzdem ablegen**. Eine Rückfrage, keine Sperre — zwei Fassungen desselben Codes können gewollt sein. **Abgrenzungen** - Nur **statische** Codes. Zwei dynamische Codes mit demselben Ziel sind der Normalfall, sobald zwei Kampagnen getrennt gezählt werden. - Verglichen wird der **Inhalt**, nicht die Gestaltung. Derselbe Code in Schwarz-Weiß und in Hausfarben gilt als Dublette — gescannt wird beides Mal dasselbe. Das steht so in der Warnung. - Gesucht wird nur in der **Zielgruppe**: Ein Treffer aus einer fremden Gruppe wäre nutzlos und verriete deren Bestand. - Der Vergleich läuft über `jsonb`-Gleichheit — Schlüsselreihenfolge im JSON spielt keine Rolle (mitgeprüft). **Geändert** - `src/lib/duplicates.ts` (neu) — die Suche - `src/app/api/codes/route.ts` — Feld `allowDuplicate`, 409-Antwort mit `duplicate` - `src/lib/api-client.ts` — `ApiError` trägt jetzt `status` und `details` - `src/components/qr-generator.tsx` — Warnung, „Trotzdem ablegen“ - `docs/funktionen.md` Geprüft mit einer eigenen Testreihe: 24 von 24 — über die API (zweiter Anlauf, andere Gestaltung, `allowDuplicate`, anderer Inhalt, Schlüsselreihenfolge, dynamische Codes unbehelligt) und über die Oberfläche (Warnung, Name im Text, Verschwinden bei geändertem Inhalt, Wiederkehren beim ursprünglichen, „Trotzdem ablegen“). Closes #6
florian.wilde added 1 commit 2026-08-21 00:53:50 +00:00
Ein statischer Code traegt seinen Inhalt selbst — zweimal derselbe Inhalt
ergibt zweimal exakt dasselbe Bild. Bisher entstand der zweite Eintrag
stillschweigend.

Das Anlegen antwortet nun mit 409 und nennt den vorhandenen Eintrag samt
Namen und Datum; die Oberflaeche zeigt das als Warnung mit dem Knopf
"Trotzdem ablegen". Eine Rueckfrage, keine Sperre — zwei Fassungen
desselben Codes koennen gewollt sein.

Verglichen wird Typ und Inhalt innerhalb der Gruppe, nicht die Gestaltung.
Dynamische Codes bleiben aussen vor: zwei Kurz-Links auf dasselbe Ziel
sind der Normalfall, sobald getrennt gezaehlt werden soll.

ApiError traegt dafuer jetzt Status und Antwortkoerper — eine gemeldete
Dublette ist keine Sackgasse, sondern eine Rueckfrage.

Refs #6
florian.wilde merged commit 87ffdcae04 into main 2026-08-21 08:46:50 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/qrcode-generator#14