Dublettenprüfung #6

Closed
opened 2026-08-20 23:21:04 +00:00 by florian.wilde · 3 comments
Owner

Ein statischer Code lässt sich mehrfach mit identischem Inhalt ablegen; es gibt keine Warnung vor Dubletten. Bei häufigem Gebrauch könnte die Liste zuwachsen.

Angelegt aus QR Code Generator in Nebula.

Ein statischer Code lässt sich mehrfach mit identischem Inhalt ablegen; es gibt keine Warnung vor Dubletten. Bei häufigem Gebrauch könnte die Liste zuwachsen. _Angelegt aus [QR Code Generator](https://nebula.wilde-ste.de/projects/cmss12yq702p6mm01ctlfe6nz) in Nebula._
florian.wilde added the in-arbeit label 2026-08-21 00:44:06 +00:00
florian.wilde started working 2026-08-21 00:44:16 +00:00
Author
Owner

🤖 Claude Code hat mit der Umsetzung begonnen.

  • Branch: feat/6-dublettenpruefung
  • Verstanden als: Beim Ablegen eines statischen Codes soll gewarnt werden, wenn in derselben Gruppe schon ein statischer Code mit identischem Inhalt liegt — eine Warnung mit Ausweg, keine Sperre.
  • Geplantes Vorgehen:
    • Prüfung auf der Server-Seite (POST /api/codes), damit sie auch für Aufrufe an der Oberfläche vorbei gilt. Verglichen wird Typ + Inhalt, innerhalb der Zielgruppe.
    • Antwort 409 mit dem gefundenen Eintrag (Name, Datum) statt einer nackten Fehlermeldung.
    • Im Generator eine Warnung: „Diesen Inhalt hast du schon abgelegt“ — mit Verweis auf den vorhandenen Code und dem Knopf Trotzdem ablegen.
    • Nur statische Codes. Zwei dynamische Codes mit demselben Ziel sind ein üblicher Fall (zwei Kampagnen, getrennte Zähler) und keine Dublette.
    • Die Gestaltung (Farben, Größe) bleibt beim Vergleich außen vor — sonst fiele derselbe Inhalt in Schwarz-Weiß und in Farbe durch die Prüfung. Das steht so in der Warnung.
    • Prüfen mit einer eigenen Testreihe über die API und die Oberfläche.

Zeiterfassung läuft.

🤖 **Claude Code hat mit der Umsetzung begonnen.** - Branch: `feat/6-dublettenpruefung` - Verstanden als: Beim Ablegen eines statischen Codes soll gewarnt werden, wenn in derselben Gruppe schon ein statischer Code mit **identischem Inhalt** liegt — eine Warnung mit Ausweg, keine Sperre. - Geplantes Vorgehen: - Prüfung auf der Server-Seite (`POST /api/codes`), damit sie auch für Aufrufe an der Oberfläche vorbei gilt. Verglichen wird Typ + Inhalt, innerhalb der Zielgruppe. - Antwort **409** mit dem gefundenen Eintrag (Name, Datum) statt einer nackten Fehlermeldung. - Im Generator eine Warnung: „Diesen Inhalt hast du schon abgelegt“ — mit Verweis auf den vorhandenen Code und dem Knopf **Trotzdem ablegen**. - Nur statische Codes. Zwei dynamische Codes mit demselben Ziel sind ein üblicher Fall (zwei Kampagnen, getrennte Zähler) und keine Dublette. - Die Gestaltung (Farben, Größe) bleibt beim Vergleich außen vor — sonst fiele derselbe Inhalt in Schwarz-Weiß und in Farbe durch die Prüfung. Das steht so in der Warnung. - Prüfen mit einer eigenen Testreihe über die API und die Oberfläche. Zeiterfassung läuft.
florian.wilde worked for 9 minutes 2026-08-21 00:53:29 +00:00
florian.wilde added zu-testen and removed in-arbeit labels 2026-08-21 00:53:59 +00:00
Author
Owner

✅ Umsetzung abgeschlossen — bereit zum Testen.

Was geändert wurde

  • Beim Ablegen eines statischen Codes prüft der Server, ob in derselben Gruppe schon einer mit identischem Typ und Inhalt liegt.
  • Ist das so, antwortet er mit 409 und nennt den vorhandenen Eintrag. Die Oberfläche zeigt: „Diesen Inhalt hast du schon abgelegt — „Aushang Kantine“ vom 21.08.2026“, dazu einen Verweis auf „Meine Codes“ und den Knopf Trotzdem ablegen.
  • Ändert man danach den Inhalt, verschwindet die Warnung von selbst; stellt man ihn wieder her, steht sie wieder da — ohne erneute Rückfrage beim Server.
  • Der Vergleich läuft über jsonb-Gleichheit in Postgres, die Schlüsselreihenfolge im JSON spielt also keine Rolle.

Bewusst so entschieden

  • Nur statische Codes. Zwei dynamische Codes mit demselben Ziel sind ein üblicher Fall — zwei Kampagnen, zwei Kurz-Links, getrennte Zähler.
  • Ohne die Gestaltung. Derselbe Inhalt in Schwarz-Weiß und in Hausfarben gilt als Dublette; gescannt wird beides Mal dasselbe. Die Warnung sagt das ausdrücklich, und übergehen lässt sie sich ja.
  • Nur innerhalb der Gruppe. Ein Treffer aus einer fremden Gruppe wäre nutzlos und verriete deren Bestand.

Geänderte Dateien

  • src/lib/duplicates.ts (neu)
  • src/app/api/codes/route.ts
  • src/lib/api-client.ts
  • src/components/qr-generator.tsx
  • docs/funktionen.md

So testest du es

  1. git switch feat/6-dublettenpruefung
  2. docker compose up -d --build app
  3. Einen statischen Website-Code mit Namen anlegen und ablegen.
  4. Seite neu laden, dieselbe Adresse eingeben, wieder statisch, auf In „Meine Codes“ ablegen klicken.
  5. Erwartet: Die gelbe Warnung mit dem Namen des vorhandenen Codes, der Knopf heißt jetzt Trotzdem ablegen. Ein Klick darauf legt ihn an.
  6. Gegenprobe: Zwei dynamische Codes mit demselben Ziel gehen weiterhin ohne Nachfrage durch.

Geprüft mit einer eigenen Testreihe: 24 von 24 — API und Oberfläche, samt Schlüsselreihenfolge und der Gegenprobe für dynamische Codes.

Aufgewendete Zeit: 00:09
Pull Request: #14

Nach Freigabe: /issue-freigabe 6

✅ **Umsetzung abgeschlossen — bereit zum Testen.** <!-- claude-status branch: feat/6-dublettenpruefung pr: 14 zeit_sekunden: 553 --> **Was geändert wurde** - Beim Ablegen eines statischen Codes prüft der Server, ob in derselben Gruppe schon einer mit identischem Typ und Inhalt liegt. - Ist das so, antwortet er mit **409** und nennt den vorhandenen Eintrag. Die Oberfläche zeigt: *„Diesen Inhalt hast du schon abgelegt — „Aushang Kantine“ vom 21.08.2026“*, dazu einen Verweis auf „Meine Codes“ und den Knopf **Trotzdem ablegen**. - Ändert man danach den Inhalt, verschwindet die Warnung von selbst; stellt man ihn wieder her, steht sie wieder da — ohne erneute Rückfrage beim Server. - Der Vergleich läuft über `jsonb`-Gleichheit in Postgres, die Schlüsselreihenfolge im JSON spielt also keine Rolle. **Bewusst so entschieden** - **Nur statische Codes.** Zwei dynamische Codes mit demselben Ziel sind ein üblicher Fall — zwei Kampagnen, zwei Kurz-Links, getrennte Zähler. - **Ohne die Gestaltung.** Derselbe Inhalt in Schwarz-Weiß und in Hausfarben gilt als Dublette; gescannt wird beides Mal dasselbe. Die Warnung sagt das ausdrücklich, und übergehen lässt sie sich ja. - **Nur innerhalb der Gruppe.** Ein Treffer aus einer fremden Gruppe wäre nutzlos und verriete deren Bestand. **Geänderte Dateien** - `src/lib/duplicates.ts` (neu) - `src/app/api/codes/route.ts` - `src/lib/api-client.ts` - `src/components/qr-generator.tsx` - `docs/funktionen.md` **So testest du es** 1. `git switch feat/6-dublettenpruefung` 2. `docker compose up -d --build app` 3. Einen statischen Website-Code mit Namen anlegen und ablegen. 4. Seite neu laden, dieselbe Adresse eingeben, wieder **statisch**, auf **In „Meine Codes“ ablegen** klicken. 5. Erwartet: Die gelbe Warnung mit dem Namen des vorhandenen Codes, der Knopf heißt jetzt **Trotzdem ablegen**. Ein Klick darauf legt ihn an. 6. Gegenprobe: Zwei **dynamische** Codes mit demselben Ziel gehen weiterhin ohne Nachfrage durch. Geprüft mit einer eigenen Testreihe: **24 von 24** — API und Oberfläche, samt Schlüsselreihenfolge und der Gegenprobe für dynamische Codes. **Aufgewendete Zeit:** 00:09 **Pull Request:** #14 Nach Freigabe: `/issue-freigabe 6`
Author
Owner

🚀 Freigegeben und nach main übernommen.

  • Merge-Commit: 87ffdca
  • Pull Request: #14 (gemergt)
  • Gesamtaufwand: 00:09

Typprüfung und Linter auf main nach dem Merge: grün.

Issue wird geschlossen.

🚀 **Freigegeben und nach `main` übernommen.** <!-- claude-status merge: 87ffdca pr: 14 zeit_sekunden: 553 --> - Merge-Commit: `87ffdca` - Pull Request: #14 (gemergt) - Gesamtaufwand: 00:09 Typprüfung und Linter auf `main` nach dem Merge: grün. Issue wird geschlossen.
florian.wilde removed the zu-testen label 2026-08-21 08:47:30 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Total Time Spent: 9 minutes
florian.wilde
9 minutes
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/qrcode-generator#6