Qué tan reversible es el modelo de menús¶
Evaluación de cuánto costaría cambiar de opinión, más adelante, sobre cada decisión del modelo propuesto en RF-007. La pregunta se hace ahora, antes de escribir código, que es cuando cambiar de opinión sale gratis.
Alcance. Se mide la reversibilidad de cada decisión por separado, no del modelo como bloque, porque no se deshacen igual. Los costos son relativos —trivial, bajo, medio, alto— y no horas: dependen de cuánto contenido haya cargado cuando se quiera cambiar.
Respuesta corta¶
El modelo es barato de cambiar en casi todo, menos en una cosa: la sincronización de categorías. El resto son pocas decenas de documentos y una migración de datos.
Eso sugiere partirlo en dos etapas y decidirlas por separado. La primera —menús reutilizables con entradas cargadas a mano— reemplaza al menú actual, entrega el panel desplegable y se puede deshacer casi por completo. La segunda —sincronizar el catálogo y las entradas de categoría— es la que deja huella: infraestructura que hay que operar y contenido que se acumula donde antes no existía.
Lo que hace barato cambiar¶
Cuatro propiedades del modelo son las que sostienen la reversibilidad. Conviene saber cuáles son, porque son también las que se pueden perder sin darse cuenta si alguien las viola al implementar.
- El volumen es chico. Un menú completo son decenas de documentos, no millones de filas. Cualquier restructuración es un guion que corre en segundos. Es la razón principal por la que casi todo es barato.
- Se guardan descriptores, no resultados. El CMS anota qué categoría y cuántos niveles, y nunca guarda las categorías hijas resueltas. Cambiar cómo se expande es un cambio del storefront, sin tocar un solo dato.
- Los campos del catálogo y los de presentación están separados. No es prolijidad: es la garantía de que el enriquecimiento se puede llevar a otro lado si la sincronización se abandona.
- El contrato con el storefront es la API pública. El storefront lee un árbol y lo dibuja. Ni el CMS sabe cómo se ve, ni el storefront sabe cómo se cargó.
Costo de cambiar de opinión, decisión por decisión¶
| Si más adelante queremos… | Costo | Por qué |
|---|---|---|
| Sumar o sacar un campo de la entrada | Trivial | Migración de esquema y nada más |
| Mover la orientación del menú al lugar donde se usa | Bajo | Se agrega el campo en el lugar de uso y cae de vuelta al del menú si está vacío. No hay que decidirlo ahora |
| Cambiar el tope de niveles | Trivial | Es una validación. Bajarlo oculta contenido, no lo borra |
| Dejar de usar "incluir" y que todo se abra | Bajo | Son pocas entradas; un guion las convierte |
| Cambiar cómo se ve el menú en la tienda | Bajo | No toca datos. Es trabajo de storefront |
| Cambiar de motor de búsqueda o de resolución de filtros | Bajo | El menú guarda un descriptor, no una consulta armada |
| Volver al menú plano de RF-003 | Medio | Aplanar es fácil; se pierde la jerarquía cargada y el trabajo del editor |
Cambiar la gramática de destinos (linkConfig) |
Alto | Es compartida con banners, sliders y botones. Ya lo era antes de RF-007 |
| Abandonar la sincronización de categorías | Alto | Ver el apartado siguiente |
La decisión que sí deja huella¶
Sincronizar las categorías del catálogo al CMS es la única parte del modelo que no se deshace con un guion. Por tres razones distintas:
Deja infraestructura que hay que operar. Un proceso que corre solo, una credencial, una frecuencia, y algo que avise cuando falla. Eso no se borra: se apaga, y mientras tanto alguien lo mantuvo.
Acumula contenido que antes no existía. El nombre comercial, el ícono y la imagen de cada categoría se cargan una sola vez, pero con doscientas categorías enriquecidas eso es trabajo real que vive únicamente en el CMS. Apagar la sincronización sin más lo pierde.
Crea una segunda copia de algo que ya tiene dueño. Mientras exista, hay dos lugares que dicen cuáles son las categorías, y el menú muestra lo que diga la copia.
La salida de emergencia, y de qué depende¶
El enriquecimiento se puede exportar y llevar a otro lado —a Medusa mismo, que admite datos adicionales por categoría— siempre que esté guardado contra el identificador del catálogo y separado de los campos que vienen de él. Esa es exactamente la regla que RF-007 ya pide.
Dicho al revés: si al implementar alguien mezcla los campos, o guarda el enriquecimiento contra el identificador interno del CMS, la salida de emergencia se cierra y la decisión pasa de alta a irreversible. Vale la pena que quede como criterio de revisión, no como recomendación.
Lo que hay que sostener para que siga siendo barato¶
Cinco reglas para la implementación. No son de estilo: cada una sostiene una de las propiedades de más arriba.
- Nunca guardar el árbol resuelto. Si algún día se guarda la expansión "para que sea más rápido", se pierde la propiedad 2 y el modelo se endurece de golpe.
- Nunca mezclar campos del catálogo con campos de presentación, ni guardar presentación contra el identificador interno.
- Que el storefront no sepa de menús. Lee un árbol y lo dibuja. Si aparece lógica que depende de nombres o identificadores concretos de menú, el contrato se rompe y cambiar el modelo pasa a ser un cambio en dos repositorios.
- Dejar registro de cada sincronización, qué cambió y cuándo. Sin eso no hay forma de deshacer una sincronización mala ni de explicar un menú equivocado.
- Que el menú no se convierta en base de datos. Si alguien empieza a cargar precios, stock o textos largos en las entradas, deja de ser configuración y pasa a ser contenido crítico, y ahí se acabó la reversibilidad de todo lo demás.
Caso aparte: agregar atributos de estética¶
Sumar campos que le digan al storefront cómo mostrar algo —un color, un estilo, un tamaño— es trivial en el modelo de datos. Es un campo más en una colección chica, y como los menús ya cargados lo tienen vacío, el storefront cae a su comportamiento de siempre. No hay migración ni riesgo.
El riesgo no está en el modelo, está en qué se guarda en ese campo, y ahí la reversibilidad cambia por completo según la elección:
| Lo que guarda el campo | Ejemplo | Reversibilidad |
|---|---|---|
| Un nombre del sistema de diseño | destacado, promocion, neutro |
Alta. El storefront decide cómo se ve cada nombre; un cambio de marca es una sola edición allá |
| Un valor literal | #ED0000, 18px |
Baja. Se acumula en cada entrada y hay que revisarlas una por una para cambiarlo |
La asimetría es lo que decide: pasar de nombres a valores libres es barato, y de valores libres a nombres es caro. Conviene empezar por nombres aunque parezca más restrictivo, porque deja abiertas las dos puertas.
Tres razones más, todas del propio proyecto:
- Es la regla que ya rige. El sistema de diseño del storefront dice, textual, "prohibido el hex literal en componentes: todo color sale de un token", y fija umbrales mínimos de contraste. Un color cargado a mano desde el CMS entra por la ventana a ese sistema.
- Es el patrón que ya usan los campos propios. El botón sobre el banner se ubica con una grilla de nueve posiciones y no con coordenadas libres (RF-001); el enlace tiene apariencias con nombre. Constreñir la elección del editor ya es la manera de hacer las cosas acá.
- Es la misma regla que sostiene todo lo demás. El menú guarda qué categoría, no las hijas
resueltas; guarda un descriptor de destino, no una dirección armada. Guardar
destacadoen vez de#ED0000es exactamente eso aplicado a la presentación.
Cuándo sí conviene el valor libre¶
Para campañas con identidad propia y fecha de vencimiento, donde el color es el punto. La forma de darlo sin abrir la puerta del todo es ponerlo en el menú y no en cada entrada, como un tema que se aplica al panel completo. Así una campaña deja un valor suelto, no cuarenta.
El camino natural cuando llegue el momento¶
El modelo ya tiene destacado como casilla. Convertirla en una lista de estilos con nombre es un
cambio compatible hacia atrás: lo que estaba marcado pasa a destacado y lo demás queda vacío.
No hace falta decidirlo ahora.
Recomendación¶
Partirlo en dos etapas y no comprometerse con la segunda hasta que la primera esté en uso.
| Etapa | Qué incluye | Reversibilidad |
|---|---|---|
| 1 | Colección menus, entradas propias, abrir e incluir, orientación, el global reducido a dos referencias, y el storefront dibujando |
Casi total. Es una colección chica y un componente |
| 2 | Sincronización del catálogo, colección de categorías enriquecibles, entradas de categoría y niveles automáticos | Alta al principio, decreciente a medida que se enriquecen categorías |
La etapa 1 ya reemplaza a RF-003 y entrega el panel desplegable de varias columnas, que es el objetivo comercial. La etapa 2 agrega que el menú siga al catálogo solo, que es una mejora de gestión, no de lo que ve el comprador.
Separarlas tiene un costo: durante la etapa 1 los rubros se cargan a mano, y eso es justamente lo que la etapa 2 viene a evitar. Es un costo aceptable si la etapa 1 dura poco. Si se estira, el trabajo manual se hace dos veces.
Decisión que esto permite postergar¶
De las decisiones abiertas de RF-007, M4 —si la orientación vive en el menú o en el lugar donde se lo usa— no hace falta resolverla ahora. Elegir el menú hoy no cierra la otra puerta: el día que haga falta, se agrega el campo en el lugar de uso y, vacío, cae de vuelta al del menú. Las demás conviene cerrarlas antes de empezar.