Files
qrcode-generator/src/lib/dto.ts
T
Florian Wilde eeaf3820b7 Statische Codes benennen und auf Wunsch ablegen
Das Feld „Name (optional)" stand nur im Dynamisch-Block. Bei einem statischen
Code gab es damit keine Moeglichkeit, ihm einen Namen zum Wiederfinden zu
geben.

Jetzt gilt es in beiden Betriebsarten und tut zweierlei: Es bestimmt den
Dateinamen beim Herunterladen — aus „Plakat Eingang" wird
qr-plakat-eingang.png statt qr-example-com-plakat.png — und es laesst sich
damit ein statischer Code in „Meine Codes" ablegen.

Ein abgelegter statischer Code ist ein Schnappschuss, kein steuerbares Ziel.
Aenderbar ist nur der Name; Inhalt und Gestaltung bleiben, wie sie beim
Ablegen waren, denn genau das steckt im gedruckten Bild. Er bekommt keinen
Kurz-Link, ist unter /r nicht erreichbar und zaehlt keine Scans — in der
Liste steht dort „statisch" und ein Strich. Wer nach dem Ablegen den Inhalt
aendert, bekommt das Ablegen erneut angeboten; der vorherige Eintrag bleibt
als eigener Schnappschuss.

Dafuer traegt QrCode jetzt `mode`, und `slug` darf leer sein. In PostgreSQL
schliessen sich mehrere NULL in einem eindeutigen Index nicht aus, die
Bedingung „je Domain eindeutig" gilt fuer dynamische Codes also unveraendert.

Refs #2
2026-08-20 19:33:49 +02:00

51 lines
1.6 KiB
TypeScript

import type { EcLevel } from "@/lib/qr/design";
import type { QrTypeId } from "@/lib/qr/type-module";
/** Statisch oder dynamisch — bestimmt, was ein Code überhaupt kann. */
export type QrCodeMode = "static" | "dynamic";
/**
* Darstellung eines gespeicherten Codes an der API-Grenze. Bewusst frei von
* Server-Abhängigkeiten, damit Client-Komponenten den Typ verwenden können.
*/
export type QrCodeDto = {
id: string;
/**
* Ein statischer Code trägt seinen Inhalt selbst. Er ist nur abgelegt, damit
* man ihn wiederfindet und erneut herunterladen kann — Kurz-Link, Ziel und
* Scan-Zähler bleiben deshalb leer.
*/
mode: QrCodeMode;
/** Kurz-Link. Leer bei statischen Codes. */
slug: string | null;
/** Frühere Kurz-Links, die weiterhin auf diesen Code führen. */
aliases: string[];
type: QrTypeId;
label: string | null;
data: Record<string, unknown>;
/** Die Kurz-URL, die im QR-Code steckt. Leer bei statischen Codes. */
shortUrl: string | null;
/** Aktuelles Weiterleitungsziel. Leer bei statischen Codes. */
target: string;
/** Lesbare Kurzfassung des Ziels. */
summary: string;
design: {
fgColor: string;
bgColor: string;
size: number;
ecLevel: EcLevel;
margin: number;
};
scans: number;
lastScanAt: string | null;
createdAt: string;
updatedAt: string;
/** Gruppe, der der Code gehört. */
groupId: string;
groupName: string | null;
domainId: string;
domainHostname: string | null;
/** Wer ihn angelegt hat — leer bei Codes aus der Zeit ohne Anmeldung. */
createdByName: string | null;
};