feat: öffentliche Herkunftsseiten für Honigchargen + Kunden-QR-Code

Neuer unauthentifizierter Endpunkt GET /api/v1/public/batches/:lot
(Abschnitt 27 der Lastenheft) liefert kontrolliert freigegebene
Rückverfolgbarkeitsdaten einer Abfüllcharge – Produkt, Erntemonat,
Bienenstand-Namen, Schleuderdatum, Wassergehalt – ohne interne IDs,
Adressen oder Koordinaten preiszugeben. Die neue Seite /herkunft/{lot}
liegt außerhalb der (app)-Route-Group und damit ohne Login/Sidebar,
gedacht als Ziel eines QR-Codes auf dem Honigglas. Der bestehende
QR-Dienst kennt jetzt den Entity-Typ "bottling-batches" und verlinkt
intern auf diese neue öffentliche Seite; ein entsprechender
QR-Code-Button samt Klartext-Link steht ab sofort auf der
Abfüllungs-Detailseite bereit.
This commit is contained in:
Nick Szaunig committed 2026-08-25 01:35:47 +02:00
1 parent 711536f299
commit d56550c0e5
13 files changed
+538 -48

No files matched your search

@@ -0,0 +1,6 @@
import { apiFetch } from "@/lib/auth/api-client";
import { PublicBatch } from "./types";
export function fetchPublicBatch(lotNumber: string): Promise<PublicBatch> {
return apiFetch<PublicBatch>(`/public/batches/${encodeURIComponent(lotNumber)}`);
}
@@ -0,0 +1,18 @@
export interface PublicApiaryOrigin {
name: string;
location: string | null;
}
export interface PublicBatch {
lotNumber: string;
productName: string | null;
productDescription: string | null;
bottledDate: string;
bestBeforeDate: string;
jarSize: number;
honeyType: string | null;
waterContent: number | null;
extractedDate: string | null;
harvestDates: string[];
apiaries: PublicApiaryOrigin[];
}
+2 -1
View File
@@ -5,7 +5,8 @@ export type QrEntityType =
| "apiaries"
| "queens"
| "honey-batches"
| "storage-containers";
| "storage-containers"
| "bottling-batches";
export async function fetchQrCodeSvg(entityType: QrEntityType, id: string): Promise<Blob> {
const { blob } = await apiFetchBlob(`/qr/${entityType}/${id}.svg`, `${entityType}.svg`);