feat: NFC-Tags beschreiben mit demselben Deep-Link wie der QR-Code

Neuer Endpunkt GET /api/v1/qr/:entityType/:id/link liefert den vom
QR-Dienst bereits genutzten Deep-Link als reine URL statt als SVG,
damit die Web-NFC-API (client-seitig, Chrome/Android) ihn per
NDEFReader.write() auf einen physischen NFC-Tag schreiben kann.
QrService.resolveUrl() ist aus generateSvg() herausgezogen, damit
beide Endpunkte exakt denselben Link erzeugen.

Der bestehende QrCodeDialog bekommt dadurch für alle sechs
QR-fähigen Entitäten (Völker, Bienenstände, Königinnen, Honigchargen,
Lagerbehälter, Abfüllungen) automatisch einen "Auf NFC-Tag
schreiben"-Button, der nur erscheint, wenn window.NDEFReader
tatsächlich existiert – kein Fallback für andere Browser oder iOS,
wie in der Lastenheft vorgesehen.
This commit is contained in:
Nick Szaunig committed 2026-08-25 01:50:14 +02:00
1 parent f346859121
commit 53b781aa04
8 files changed
+106 -5

No files matched your search

+6 -2
View File
@@ -25,6 +25,11 @@ export class QrService {
constructor(private readonly prisma: PrismaService) {}
async generateSvg(entityType: string, id: string): Promise<string> {
const url = await this.resolveUrl(entityType, id);
return QRCode.toString(url, { type: 'svg', margin: 1, width: 256 });
}
async resolveUrl(entityType: string, id: string): Promise<string> {
if (!isEntityType(entityType)) {
throw new BadRequestException(
`Unsupported QR entity type: ${entityType}`,
@@ -38,8 +43,7 @@ export class QrService {
const frontendOrigin =
process.env.FRONTEND_ORIGIN ?? 'http://localhost:3000';
const url = `${frontendOrigin}${deepLink}`;
return QRCode.toString(url, { type: 'svg', margin: 1, width: 256 });
return `${frontendOrigin}${deepLink}`;
}
private async resolveDeepLink(