RF-000 — Plataforma base de gestión de contenido (Payload 3.61 stock)¶
Alcance. Documentar únicamente las capacidades provistas por Payload 3.61.1 y por el website template oficial del que deriva el repositorio, sin desarrollo propio. El modelado propio se documenta en los requisitos siguientes de esta serie y en el Inventario de entidades.
Requisito¶
Disponer de un sistema de gestión de contenido headless que resuelva sin desarrollo propio el modelado de entidades por configuración, la administración del contenido por parte de editores no técnicos, el control de acceso por entidad y operación, el versionado con borradores y publicación programada, y la exposición del contenido como API de lectura para un consumidor externo.
Solución adoptada: adoptar Payload 3.61.1 sobre Next.js 15 y React 19, con adaptador PostgreSQL, desplegado como una única aplicación que sirve el panel de administración, la API de contenido y el sitio público heredado del template.
Arquitectura funcional¶
flowchart TB
E([Editor]) --> ADM[Panel de administración<br/>Next.js · React]
SF([Storefront externo]) --> API
ADM --> API[Capa de API<br/>REST · GraphQL · Local]
CFG[[payload.config.ts<br/>colecciones · globales · bloques · campos]] --> ADM
CFG --> API
API --> ACC[Control de acceso por operación]
ACC --> DB[(PostgreSQL)]
CFG --> TS[payload-types.ts<br/>tipos generados]
PLG[Plugins: seo · redirects · form-builder<br/>search · nested-docs] --> CFG
Capacidades del framework¶
| Capacidad | Alcance de fábrica |
|---|---|
| Modelado por configuración | Colecciones, globales, campos, grupos, arrays y bloques declarados en TypeScript; el esquema de base de datos se deriva de esa declaración |
| Panel de administración | Interfaz generada a partir del esquema: listados, formularios, filtros, búsqueda y carga de archivos, sin desarrollo de UI |
| Autenticación y usuarios | Colección de usuarios del panel, sesión, recuperación de contraseña y control de acceso por operación (create, read, update, delete) |
| Control de acceso | Funciones por colección que devuelven booleano o filtro de consulta; habilita lectura pública selectiva |
| Versionado y borradores | Historial de versiones, borradores, autoguardado y publicación programada por documento |
| Live preview | Previsualización del documento en edición con puntos de corte móvil, tableta y escritorio |
| API de lectura y escritura | REST y GraphQL generadas del esquema, más API local para uso en servidor; paginación, filtros y profundidad de relaciones |
| Tipos generados | payload-types.ts derivado de la configuración, consumible por el cliente externo |
| Carga de archivos | Colecciones de tipo upload con validación de tipo MIME, tamaños derivados, punto focal y miniatura de administración |
| Texto enriquecido | Editor Lexical con funciones configurables y bloques embebidos |
| Migraciones | Generación y aplicación de migraciones de esquema sobre PostgreSQL |
| Trabajos programados | Cola de tareas con control de acceso por token |
Extensiones instaladas de fábrica¶
| Plugin | Aporte |
|---|---|
plugin-seo |
Grupo meta en páginas y entradas, con generación de título y URL |
plugin-redirects |
Colección redirects para páginas y entradas |
plugin-form-builder |
Colecciones forms y form-submissions, sin módulo de pago |
plugin-search |
Colección search como índice de entradas de blog |
plugin-nested-docs |
Anidamiento de categorías con generación de URL jerárquica |
payload-cloud |
Integración con la nube de Payload; sin uso en esta instalación |
Andamiaje heredado del website template¶
El repositorio deriva del website template oficial. Lo siguiente existe sin haber sido desarrollado ni modificado para este proyecto:
| Pieza | Estado de uso |
|---|---|
Colecciones pages, posts, categories, users |
pages en uso como contenedor de bloques; el blog no se consume desde el storefront |
Globales header y footer |
Pertenecen al sitio público heredado, no al storefront |
Bloques cta, content, mediaBlock, archive, formBlock |
Con componente React propio del template |
Sitio público en src/app/(frontend)/ |
Sostiene el live preview de los editores |
| Seed de contenido de ejemplo y dos pruebas de scaffold | Sin función en la operación |
Reglas heredadas de la plataforma¶
- Derivar el esquema de la configuración: todo cambio de modelo exige generar y aplicar migración.
- Publicar como público solo lo declarado explícitamente: la lectura anónima es una decisión por colección, no un valor por defecto.
- Conectar a la base de datos en tiempo de compilación: el build falla si PostgreSQL no es alcanzable.
- Restringir el consumo por origen mediante la lista CORS de la configuración.
Fuera del alcance stock¶
Capacidades requeridas por el negocio que Payload no cubre de fábrica y que motivan el desarrollo propio documentado en los requisitos siguientes:
- Piezas gráficas reutilizables con enlace y botón — RF-001.
- Carruseles con programación por slide — RF-002.
- Menú de navegación del storefront — RF-003.
- Bloques comerciales sin render local — RF-004.
- Sistema uniforme de destinos y descriptores de filtro — RF-005.
- Almacenamiento y entrega de medios fuera del servidor — RF-006.
- Consulta de catálogo: el CMS nunca consulta productos; los descriptores los resuelve el storefront contra Algolia.
Criterios de aceptación¶
| # | Criterio |
|---|---|
| 1 | Administrar contenido desde el panel sin desarrollo de interfaz por entidad |
| 2 | Exponer por REST y GraphQL toda entidad declarada, con filtros y paginación |
| 3 | Restringir la escritura a usuarios autenticados y habilitar lectura anónima por colección |
| 4 | Editar un documento como borrador, previsualizarlo y publicarlo en una fecha futura |
| 5 | Derivar tipos TypeScript de la configuración para consumo del storefront |
| 6 | Aplicar un cambio de esquema mediante migración versionada |