RF-001 — Contenido editorial y navegación desde el CMS¶
| Estado | Implementado |
| Tipo | Cliente propio de Payload + renderizador de bloques |
| Ubicación | src/lib/payload.ts · src/lib/payload-home.ts · src/lib/services/navigation-service.ts · src/lib/services/header-service.ts · app/[countryCode]/(main)/[slug]/page.tsx |
| Depende de | RF-000 · CMS — RF-001 a RF-005 de Payload |
| Ver también | ADR-0001 — Payload CMS como fuente de contenido |
Requisito¶
Permitir que el equipo comercial modifique la portada, las páginas institucionales, el menú de navegación y los formularios sin intervención técnica ni despliegue; renderizar en la tienda los bloques definidos en el CMS; e impedir que las credenciales del CMS lleguen al navegador.
Solución adoptada¶
Implementar un cliente propio del CMS que se autentica con usuario y contraseña, cachea el token
en memoria del servidor y consulta la API de contenido desde componentes de servidor. El armado
de la página es un renderizador que resuelve cada bloque por su blockType.
flowchart LR
E([Editor]) --> CMS[(Payload CMS)]
SRV[Server Components] -->|login usuario/clave<br/>JWT cacheado| CMS
SRV --> R[Renderizador de bloques]
R --> N([Navegador])
CMS -.credenciales nunca<br/>llegan al navegador.-> SRV
Funciones¶
| Función | Origen | Detalle |
|---|---|---|
| Portada editable | getHomepage() |
Página de slug homepage, con soporte de borrador |
| Páginas por slug | getPageBySlug() |
Cualquier página institucional en /{countryCode}/{slug} |
| Menú de navegación | navigation-service.ts |
Global main-navigation: ítems con destino a filtro, página o URL propia |
| Encabezado configurable | header-service.ts |
Global header |
| Formularios dinámicos | getPayloadForm() |
Definición, mensaje de confirmación y cuerpo del correo de respuesta |
| Texto enriquecido | RichText |
Render del formato Lexical del CMS |
Bloques soportados¶
hero · content · richText · mediaBlock (con modo pantalla completa) · cta · banner ·
archive (por selección o por consulta) · formBlock / form · productGrid /
cuadriculaProductos · slider / heroSlider.
Los campos de formulario admitidos son text, email, textarea, select y checkbox.
Reglas de negocio¶
- Autenticar contra el CMS desde el servidor y reutilizar el token durante una hora, renovándolo con cinco minutos de margen.
- Degradar sin interrumpir: la falta de credenciales o de URL del CMS se registra como aviso y no detiene el renderizado.
- Ignorar en producción todo bloque no contemplado, y advertirlo en pantalla solo en desarrollo.
- Resolver el destino de cada ítem de navegación según su tipo: filtro de catálogo, página del CMS o URL libre.
- Aceptar los dos juegos de nombres de bloque —en inglés y en castellano— que conviven en el contenido cargado.
Criterios de aceptación¶
| # | Criterio |
|---|---|
| 1 | Modificar la portada desde el CMS y verla publicada sin desplegar código |
| 2 | Publicar una página nueva y alcanzarla por su slug bajo el código de país |
| 3 | Renderizar los diez tipos de bloque soportados dentro de una misma página |
| 4 | Reordenar el menú desde el CMS y verlo reflejado en la barra de navegación |
| 5 | Enviar un formulario definido en el CMS y recibir su mensaje de confirmación |
| 6 | No exponer credenciales del CMS en el código entregado al navegador |
Limitaciones conocidas¶
- Cachear el token en memoria del proceso: cada instancia mantiene su propia sesión con el CMS.
- Autenticar con usuario y contraseña de un usuario del panel, en lugar de una clave de servicio de solo lectura.
- Renderizar el global
headerdel CMS, que en el modelo de contenido pertenece al sitio heredado del template y no al storefront.