Saltar a contenido

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 header del CMS, que en el modelo de contenido pertenece al sitio heredado del template y no al storefront.