Saltearse al contenido

Catálogo público

El catálogo público es la cara de lectura de la oferta de un sitio: productos y servicios con su precio, sus categorías, sus filtros y sus medidas, servidos por HTTP a quien pinte el sitio. No se usa para editar nada; la gestión vive en Portafolio. Sirve para que un sitio cliente arme listado, ficha y buscador sin tener la base de datos detrás.

  • GET /api/catalog/products devuelve el listado paginado de la oferta activa. GET /api/catalog/products/{slug} da la ficha.
  • GET /api/catalog/categories devuelve el árbol con products_count, que cuenta oferta completa: productos y servicios.
  • GET /api/catalog/filters y GET /api/catalog/facets dan los valores de atributo de variante y las facetas de medida y norma, con conteo cruzado.
  • GET /api/catalog/stories lista las ofertas con video, ordenadas por cuándo se añadió el video.
  • GET /api/catalog/product-views y GET /api/catalog/field-definitions sirven las vistas guardadas del catálogo y los campos personalizados filtrables.
  • GET /api/manifest entrega el manifiesto del sitio, fuera del prefijo catalog.
  • Solo sale lo que tiene is_active encendido. Las ofertas espejo de los planes de Merez se excluyen por plan_id y, por si acaso, por las categorías reservadas planes y creditos.
  • Del módulo portfolio. La clave del módulo está en inglés; los endpoints siguen diciendo catalog.
  • De una credencial con la habilidad catalog: token de Sitio o site_key de ingesta. La compuerta no es middleware de ruta: PublicCatalogController::resolveSite() valida credencial, origen CORS y módulo, en ese orden.
  • El grupo /api/catalog/* solo lleva cors.catalog. El manifiesto añade un límite de 60 peticiones por minuto.

El contenido no se borra: se deja de servir. Sin el módulo, la respuesta es 403 {"module":"portfolio"}. Si la credencial no trae la habilidad, 403 {"ability":"catalog"}. Si el origen no está autorizado, la petición no pasa. Al volver a encender el módulo, lo que estaba activo vuelve a salir con la misma URL y el mismo slug.

Ojo con la asimetría del panel: listar sin módulo devuelve 200 con lista vacía; escribir devuelve 403.

  • Dos nombres para dos guardas. Módulo portfolio, habilidad catalog. No es un descuido: renombrar la habilidad habría invalidado cada clave de ingesta ya emitida en producción.
  • /filters solo enseña un valor cuando más de una oferta lo usa. Con una sola referencia, el bloque de filtros aparece vacío y no es un fallo.
  • Apagar una ficha con is_active la saca del listado, de la ficha, de las facetas y del conteo por categoría. La faceta no miente: se vacía.
  • Los planes de Merez no aparecen en el catálogo público aunque sean ofertas del sitio operador.
  • La búsqueda se apoya en sinónimos y equivalencias de medida cargados desde el panel. Sin ese vocabulario, buscar por sinónimo no encuentra nada.
  • El backend no genera sitemap.xml: el sitio lo arma consumiendo estas respuestas.
  • Portafolio: donde se carga y se publica la oferta.
  • Blog: el otro feed público, con su propia compuerta doble.
  • Integraciones: credenciales por sitio y orígenes autorizados.