La nueva web sustituye al sistema PHP legacy y rompe el monolito en cuatro aplicaciones independientes coordinadas con un CMS headless y una tienda Shopify.
┌──────────────────────────┐
│ Cliente (navegador) │
└────────────┬─────────────┘
│
▼
┌──────────────────────────┐
│ CloudFront │
│ (CDN + cert + WAF) │
└────────────┬─────────────┘
│
▼
┌──────────────────────────┐
│ Storefront (Next.js) │ ← AWS App Runner
│ - SSR + SSG + RSC │
│ - i18n (es, en, fr, it)│
└─┬─────────────┬────────┬─┘
│ │ │
┌─────────┘ │ └────────────┐
▼ ▼ ▼
┌───────────────────┐ ┌────────────────────┐ ┌──────────────────┐
│ Shopify │ │ Backoffice API │ │ Product Search │
│ Storefront API │ │ (NestJS) │ │ (NestJS) │
│ + Customer API │ │ - Auth dual │ │ - Filtros │
│ - Productos │ │ - Diseños │ │ - Doofinder │
│ - Carrito │ │ - Concursos │ │ proxy │
│ - Checkout │ │ - Pampling UP │ │ │
│ - Pagos │ │ - Reseñas │ └──────────────────┘
└───────────────────┘ │ - Devoluciones │
└─────────┬──────────┘
│
┌─────────┴─────────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ PostgreSQL │ │ Redis │
│ (RDS) │ │ (ElastiCache)│
└──────────────┘ └──────────────┘
┌──────────────────────────────────┐
│ Sanity (CMS headless) │
│ - banners, blog, FAQs, páginas │
│ - sincroniza productos vía │
│ Sanity Connect ← Shopify │
└──────────────────────────────────┘
Repositorio único (NX monorepo): pampling-web/apps/*.
| App | Stack | Función |
|---|---|---|
storefront |
Next.js 15 + React 19 + next-intl | Web de cliente final |
backoffice |
NestJS + TypeORM + Argon2 | API + AdminJS panel |
product-search |
NestJS | Filtrado y búsqueda de productos |
sanity |
Sanity Studio (Next.js bridge) | Editor de contenido |
sync-db |
Node CLI | Scripts de migración legacy → nuevo |
backoffice-front |
Next.js | UI custom para empleados (gestión de diseñadores, etc.) |
backoffice-e2e |
Jest + Supertest | Tests E2E del backoffice |
storefront-e2e |
Playwright | Tests E2E del storefront |
users con metadata (puntos Pampling UP, diseños subidos, etc.) — pero no sus credenciales nuevas.legacy_password_hash MD5. En el primer login, el sistema valida MD5, crea el customer en Shopify, limpia el hash legacy y a partir de ahí Shopify gestiona la contraseña.pampling-com.myshopify.com o dominio custom de checkout).es, en, it, fr (+ de pendiente).users.password).admins separada).develop (staging) y production.main.main → deploy automático en staging.v*.*.* → deploy en producción..github/workflows/.Pendiente de añadir: