Kontrakt witryny
Statyczny sklep klienta — katalog z GET /api/v1/menu, koszyk itemId plus ilość, klucz publikowalny bez sekretu.
Kontrakt witryny (storefront-contract@v1) opisuje sklep, który klient sam wdraża. Delieta go nie hostuje. Artefakt jest statycznym eksportem: katalog piecze się na buildzie, koszyk żyje w localStorage, kasa jest oznaczonym szwem i nie wysyła POST.
Dwa env, żaden publiczny prefiks
DELIETA_API_URL=https://delieta.pl
DELIETA_PUBLISHABLE_KEY=dlt_live_…
Sam origin — bez sufiksu /api/v1, bez końcowego slasha. Klucz jest używany na buildzie do GET /api/v1/menu. Żadnego NEXT_PUBLIC_DELIETA.
Brak env → strona „ustaw katalog”, nie pusta witryna udająca sklep. Env jest, fetch pada → strona „katalog niedostępny”, nie menu z zerem pozycji, które wygląda jak wdrożenie.
Klucz publikowalny jest niezdolny, nie „ukryty”
kind: publishable trzyma wyłącznie catalog:read (menu:read to alias). To działa w publicznym HTML tylko dlatego, że klucz nie umie czytać zamówień, kierowców ani klientów.
Klucz sekretny (orders:write, eta:quote) nie trafia do przeglądarki, do repozytorium sklepu ani do Pages. dlt_test_… też nie jest „bezpiecznym sekretem w HTML” — to zły rodzaj.
Najemcę rozstrzyga klucz. Nie wysyłaj companyId.
Trzy powierzchnie
| Powierzchnia | Dziś | Jeszcze nie |
|---|---|---|
| Katalog | GET {origin}/api/v1/menu z Bearer publikowalnym. Grosze, PLN. Pozycje niedostępne pominięte. | Odświeżenie bez rebuildu |
| Koszyk | { itemId, quantity }[] w localStorage. Suma na ekranie z upieczonego katalogu. | Wybór modyfikatorów jako osobne pola linii |
| Kasa | /checkout/ pokazuje koszyk. Nie robi POST. | Ten sam koszyk idzie do Deliety; serwer wycenia; wraca URL płatności |
Klient wysyła co (identyfikatory i ilości), nigdy za ile. Cena wpisana w przeglądarce nie jest kontraktowa.
flowchart TD env["Dwa env: origin i klucz publikowalny"] --> build["Build piecze GET /menu"] build --> html["Statyczny HTML"] html --> cart["Koszyk: itemId i ilosc"] cart --> seam["/checkout/ pokazuje koszyk, nie wysyla POST"] secret["Klucz sekretny"] -.->|"nigdy w tym drzewie"| html
Szablon, który kopiujesz, jest statycznym eksportem sklepu: katalog z menu, koszyk w przeglądarce, kasa jako szew. Delieta tego drzewa nie hostuje.
Pieniądze i błędy
Grosze całkowite. Formatuj na krawędzi wyświetlania. Błędy Partner API to application/problem+json; na statycznym eksporcie najczęściej widać je na buildzie. Branchuj po code: unauthorized, scope_required, rate_limited.
Pełne operacje, których sklep dziś używa i których jeszcze nie woła, są w Partner API.

