Shop-Vertrag
Der statische Shop des Kunden — Katalog aus GET /api/v1/menu, Warenkorb itemId plus Menge, veröffentlichbarer Schlüssel ohne Geheimnis.
Der Shop-Vertrag (storefront-contract@v1) beschreibt einen Shop, den der Kunde selbst ausrollt. Delieta hostet ihn nicht. Das Artefakt ist ein statischer Export: der Katalog bäckt beim Build, der Warenkorb lebt in localStorage, die Kasse ist eine markierte Naht und sendet kein POST.
Zwei Env, kein öffentliches Präfix
DELIETA_API_URL=https://delieta.pl
DELIETA_PUBLISHABLE_KEY=dlt_live_…
Nur der Origin — kein /api/v1-Suffix, kein Slash am Ende. Der Schlüssel wird beim Build für GET /api/v1/menu genutzt. Kein NEXT_PUBLIC_DELIETA.
Fehlendes Env → Seite „Katalog einrichten“, kein leerer Shop, der einen Laden vortäuscht. Env da, Fetch fällt → Seite „Katalog nicht verfügbar“.
Der veröffentlichbare Schlüssel ist unfähig, nicht „versteckt“
kind: publishable hält nur catalog:read (menu:read ist Alias). Er funktioniert in öffentlichem HTML nur, weil der Schlüssel Bestellungen, Fahrer oder Kunden nicht lesen kann.
Ein geheimer Schlüssel (orders:write, eta:quote) kommt nicht in den Browser, das Shop-Repo oder Pages. dlt_test_… ist auch kein „sicheres Geheimnis in HTML“.
Der Schlüssel entscheidet den Mandanten. Sende kein companyId.
Drei Oberflächen
| Oberfläche | Heute | Noch nicht |
|---|---|---|
| Katalog | GET {origin}/api/v1/menu mit veröffentlichbarem Bearer. Groszy, PLN. Nicht verfügbare Positionen ausgelassen. | Refresh ohne Rebuild |
| Warenkorb | { itemId, quantity }[] in localStorage. Summe auf dem Bildschirm aus dem gebackenen Katalog. | Modifikatoren als eigene Zeilenfelder |
| Kasse | /checkout/ zeigt den Warenkorb. Macht kein POST. | Derselbe Warenkorb geht zu Delieta; der Server preist; eine Zahlungs-URL kommt zurück |
Der Kunde sendet was (IDs und Mengen), nie wie viel. Ein im Browser getippter Preis ist nicht vertraglich.
flowchart TD env["Zwei Env: Origin und veröffentlichbarer Schlüssel"] --> build["Build bäckt GET /menu"] build --> html["Statisches HTML"] html --> cart["Warenkorb: itemId und Menge"] cart --> seam["/checkout/ zeigt den Warenkorb, sendet kein POST"] secret["Geheimer Schlüssel"] -.->|"nie in diesem Baum"| html
Die Vorlage, die du kopierst, ist ein statischer Shop-Export. Delieta hostet diesen Baum nicht.
Geld und Fehler
Ganze Groszy. Formatiere am Anzeigerand. Partner-API-Fehler sind application/problem+json; auf einem statischen Export siehst du sie meist beim Build. Verzweige nach code: unauthorized, scope_required, rate_limited.
Volle Operationen, die der Shop heute nutzt und noch nicht aufruft, stehen in der Partner-API.

