- Remix (TypeScript) + Polaris, official Shopify app template - Prisma multi-tenant schema (Settings, ExclusionRule, WithdrawalRequest, AuditLog, WebhookEvent) on Postgres - Mandatory GDPR compliance webhooks (data_request, redact, shop/redact) + HMAC handlers - API version pinned 2026-04, scopes read_orders/read_products - Fly deploy config; two-env strategy (custom now, public later) - Dev setup: shopify.web.toml + Vite allowedHosts for tunnels - Docs: PLAN.md, ANALISI-REQUISITI-LEGALI.md (Art. 54-bis compliance) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mv83a29B4eFv5ixoj6PoE1
91 lines
3.6 KiB
Markdown
91 lines
3.6 KiB
Markdown
# 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`](./PLAN.md) e
|
|
[`ANALISI-REQUISITI-LEGALI.md`](./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
|
|
|
|
```bash
|
|
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):
|
|
|
|
```bash
|
|
cd app
|
|
fly secrets set \
|
|
DATABASE_URL="postgresql://..." \
|
|
SHOPIFY_API_KEY="..." \
|
|
SHOPIFY_API_SECRET="..." \
|
|
SHOPIFY_APP_URL="https://recesso-custom.fly.dev"
|
|
fly deploy
|
|
```
|