# 13 — API: proxy shop (catalogo, carrello, checkout) Leggi `CLAUDE.md`. ## Obiettivo Esporre al frontend le operazioni e-commerce passando sempre da Fastify. ## Cosa fare - Catalogo (pubblico): `GET /shop/products` (paginazione, categoria, ricerca), `GET /shop/products/:handle`, `GET /shop/categories`. Cache in memoria breve (es. 60s) per le liste. - Prezzi: se la richiesta ha un utente autenticato installatore approvato, il calcolo prezzi deve usare il suo customer (price list riservata); altrimenti prezzi standard. - Carrello: id carrello in cookie `cart_id` (httpOnly). Route `POST /shop/cart`, `GET /shop/cart`, `POST /shop/cart/items`, `PATCH /shop/cart/items/:id`, `DELETE /shop/cart/items/:id`, `POST /shop/cart/address`, `GET /shop/cart/shipping-options`, `POST /shop/cart/shipping`. - Se l'utente è loggato, il carrello viene associato al suo customer (`/internal/carts/:id/customer`); se fa login con un carrello guest già aperto, il carrello viene associato. - Checkout guest: obbligatoria solo l'email. - Pagamento: `POST /shop/cart/payment` inizializza la payment session Stripe e restituisce il `client_secret`; `POST /shop/cart/complete` completa il carrello dopo la conferma Stripe lato client e restituisce l'ordine. Verifica nella documentazione Medusa v2 la sequenza esatta (payment collection → payment session → complete). - Il frontend non riceve mai chiavi o id interni Medusa non necessari. ## Criteri di accettazione - Flusso completo testabile da file `.http`: crea carrello → aggiungi prodotto → indirizzo → spedizione → pagamento (carta test Stripe) → ordine creato. - Stesso flusso con utente installatore mostra i prezzi riservati. - Carrello guest associato correttamente al login. - `CLAUDE.md` aggiornato con l'elenco route shop.