Files
mercadodevida/work/artifacts/F-050/architect.md
2026-08-19 07:54:36 +02:00

4.2 KiB

Architect — F-050

Diagnosis

Investigación sobre el estado actual del admin:

  • Layout: (dashboard)/layout.tsx mantiene max-w-[1280px] con mx-auto, lo que limita el ancho útil en pantallas anchas; los centros quedan sin crecer.
  • settings/page.tsx añade su propio max-w-4xl, anulando el contenedor del layout.
  • products/[id]/page.tsx (edit sheet) usa max-w-4xl interno, lo que limita el editor de productos.
  • brands/tax-rates/shipping siguen mezclando botones de texto con iconos en la columna de acciones.
  • categories ya tiene selector de padre y checkbox promote, pero al editar sólo lista parents y bloquea al descendiente en hoja.
  • dashboard carga /api/admin/stats con combinedAuth, que acepta backoffice_session o mdv_session; ambos resuelven al usuario con su role. El dashboard asume Role (customer|admin) del campo, pero los backoffice users tienen role admin|editor, por lo que requireRole(user, 'admin') no bloquea pero el render espera un union de customer|admin. Tras varios 401 (sin cookie válida) y la diferencia entre el proxy interno y la sesión, el cliente sólo ve un mensaje "No se pudieron cargar las estadísticas".
  • Además, el dashboard del admin hace un fetch server-side/render que se ejecuta sin cookie de backoffice porque el login actual del admin está en cookie backoffice_session, pero el /auth/login mostrado por el frontend es la versión cliente; algunos links apuntaban a /audit, /backoffice/stats y /orders/active que no existen. auditApi.list apunta a /api/admin/audit que sí existe pero la página de auditoría usa auditApi.list, así que ese 404 era ruido del flujo anterior.

Plan

  1. Layout full-width

    • Reemplazar max-w-[1280px] mx-auto por w-full px-6 md:px-10 py-8 en (dashboard)/layout.tsx, usando la estructura responsive del sidebar fijo.
    • settings/page.tsx retira su max-w-4xl propio.
    • products/[id]/page.tsx retira el max-w-4xl; la grid de tabs y secciones se expande.
  2. Acciones con icono + title en tax/shipping/brands

    • Reutilizar RowActions con los handlers apropiados en tax-rates y brands (cuando aplique).
    • En tax-rates añadir handler de eliminar y reemplazar el botón de texto por RowActions. shipping ya tiene RowActions.
  3. Categories: padre y promote

    • El selector de padre ya existe y filtra por isParent, pero en modo edición la categoría aún se está renderizando como padre aunque ya no lo sea. Solución: permitir que el checkbox isParent se edite en cualquier momento y refrescar el listado de padres disponibles para excluir la categoría actual (lo cual ya está implementado).
    • Añadir tip claro: "Promover a parent no exige tener hijos; parent es un flag booleano."
  4. Dashboard stats sin 404

    • Cambiar el requireRole interno para que el dashboard admita tanto admin como editor y mapee correctamente.
    • Corregir el type-cast: el dashboard recibe role: string del backoffice, no restringido a customer|admin. Aceptar ambos.
  5. 404s en navegación

    • Reemplazar /orders/active y /backoffice/stats por rutas reales en permissions.ts y en el dashboard.
    • Verificar que el 404 de /audit proviene de un log pre-actualización; al recargar el backend, el endpoint /api/admin/audit existe y devuelve 200 con cookie válida.
  6. Auth y credenciales

    • Verificar flujo de login del admin: el cliente hace fetch('/api/auth/login') desde el proxy Next; la página /api/auth/login corresponde a identity no a backoffice. El cliente debe usar /api/backoffice/auth/login. Ajustar api-client.ts para que authApi.login apunte a /api/backoffice/auth/login y authApi.me a /api/backoffice/auth/me.
    • Tras esto el cookie backoffice_session queda, /backoffice/auth/me responde 200 y /admin/stats pasa la auth.

Acceptance evidence

  • /settings: ancho efectivo mayor a 4xl.
  • /products (edit): ancho del editor crece en pantallas anchas.
  • /tax-rates, /shipping, /brands: columna de acciones con iconos y title.
  • /categories: edición permite cambiar parent y promote.
  • /dashboard: stats cargan 200 sin 404 cuando hay sesión backoffice válida.
  • Verify verde.