The App Proxy HTML response carried no cache headers. Two consequences: - Browsers could serve a stale copy of /apps/recesso from cache, so theme changes made by the merchant were not reflected for the customer. - The page renders the order name, the customer email and the free-text withdrawal declaration. That content must not be stored by the browser or by any intermediate proxy. Send no-store (plus Pragma for HTTP/1.0 caches) and Referrer-Policy on every response produced by htmlResponse. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mv83a29B4eFv5ixoj6PoE1
Pizeta Recesso — App Shopify per la funzione di recesso
App Shopify riutilizzabile che rende un negozio conforme alla funzione elettronica di recesso ("pulsante di recesso") obbligatoria — Art. 54-bis Codice del Consumo (D.Lgs 209/2025, recepimento Dir. UE 2023/2673), in vigore per i contratti conclusi dal 19 giugno 2026.
Contesto e requisiti legali: vedi PLAN.md e
ANALISI-REQUISITI-LEGALI.md.
Struttura cartelle
pizeta-recesso-app/ ← repo git (docs + codice insieme)
├─ PLAN.md piano multi-agente + decisioni bloccate
├─ ANALISI-REQUISITI-LEGALI.md base legale verificata
├─ README.md questo file
└─ app/ app Shopify (template ufficiale Remix, TypeScript)
├─ app/routes/ route Remix (admin embedded + webhook)
├─ prisma/schema.prisma modello dati Postgres (multi-tenant per-shop)
├─ extensions/ theme app extension (storefront) — in arrivo
├─ shopify.app.toml config app (scopes, api_version pinnata, webhook)
├─ fly.toml deployment Fly (app "recesso-custom")
├─ Dockerfile build produzione
└─ .env.example template variabili d'ambiente
Prerequisiti
- Node ≥ 20.19 (vedi
app/package.json→engines) - Shopify CLI (
npm i -g @shopify/cli) - Fly CLI (
flyctl) per il deployment - Un Postgres raggiungibile (Fly Postgres o Supabase) per
DATABASE_URL
Setup sviluppo
cd app
npm install
# 1. Collega la registrazione app "Legal Return PCRT" (scrive client_id nel toml)
shopify app config link
# 2. Configura le env (mai committare .env)
cp .env.example .env # poi compila i valori
# 3. Provisiona il DB e applica lo schema Prisma
# (imposta prima DATABASE_URL nel .env)
npx prisma migrate dev --name init
# 4. Avvia il dev server — SOLO sullo store usa-e-getta pcrt-reso-test
shopify app dev --store pcrt-reso-test
⚠️ Landmine — mai shopify app dev su store da trasferire
shopify app dev (draft app) contro un development store disabilita in modo
irreversibile il trasferimento di quello store (PLAN §0-bis). Usare shopify app dev
/ draft SOLO su pcrt-reso-test. Mai su pizeta-pharma-2 o su store destinati al
cliente. L'app finita, installata via link custom, non ha questo problema.
Strategia due ambienti (custom vs public)
Una sola base di codice public-grade, distribuita Custom ora e Public in futuro (PLAN §0-ter). Gli ambienti sono isolati per costruzione:
| Ambiente | Distribuzione | Fly app | DB |
|---|---|---|---|
| Sviluppo/test | draft (app dev) |
— | locale |
| Custom LIVE | Custom install link | recesso-custom |
dedicato |
| Public (poi) | Public + review | recesso-public |
dedicato |
Registrazioni Partner distinte + Fly app distinte + DB distinti → un deploy della
public non può impattare gli store live sulla custom. Regole anti-rottura:
migrazioni DB solo additive/backward-compatible, theme extension versionate,
API version pinnata (bump solo dopo test su pcrt-reso-test).
Deployment (Fly)
I segreti si impostano con fly secrets (mai nel repo):
cd app
fly secrets set \
DATABASE_URL="postgresql://..." \
SHOPIFY_API_KEY="..." \
SHOPIFY_API_SECRET="..." \
SHOPIFY_APP_URL="https://recesso-custom.fly.dev"
fly deploy