Commits

El 404 amb estil, el 500 caçat i el primer esbós del migrador

Pàgines d'error pròpies, una auditoria que converteix 500 en 404, i el primer

Un 404 que no sembli error

Fins ara, si obries una URL que no existia, Next.js (el marc de la web) et servia la seva pàgina grisa de sempre. Aquesta setmana hem fet la nostra. Dues peces: un not-found.tsx a l'arrel, per a URLs desconegudes tipus /xyz, i un de dins del grup (frontend), per als notFound() que llencen les fitxes quan no troben contingut.

I un error.tsx per als errors de veritat: component de client (que funciona al navegador), role=alert (el senyal que els lectors de pantalla llegeixen com a alerta), botó per reintentar. A l'usuari no li ensenyem el missatge tècnic; a la consola (el diari del navegador) sí que queda registrat.

La part curiosa: el primer desplegament va servir el 404 de l'arrel amb el marcatge correcte però sense cap full d'estils. El layout amb els CSS viu al grup (frontend), i el not-found de l'arrel penja directament d'app/layout. Next no propaga els imports de CSS cap amunt de l'arbre de rutes. Solució poc glamurosa i correcta: re-importar tokens.css, base.css i ui.css dins del propi fitxer. El bundle (el paquet de codi) del 404 (49KB) ara porta les classes .notfound, i el de la home segueix net — això demostra que l'import queda tancat al chunk del 404.

La caça del 500

L'auditoria de les fitxes va caçar un de greu: /consells/incorrecta/com-reduir... — una categoria que no existeix — retornava un 500 (l'error intern del servidor). Postgres (la base de dades) rebutjava el valor fora de l'enum (els valors permesos) i l'excepció pujava fins a la pàgina. Ara lib/format.ts exporta CONSELL_CATEGORIES i si la categoria no és a la llista, es talla amb notFound() abans de tocar la base de dades. La URL bruta fa 404, que és el que toca.

Segon intent del mateix dia: filtrar per _status = 'published'. També 500 — Payload no deixa consultar _status. I sobra: l'accés onlyPublicat ja filtrà els esborranys. Ho hem deixat comentat a les sis pàgines perquè ningú hi recaigui.

Detalls de les llistes

L'auditoria de les llistes (spec 03j) va deixar quatre arranjaments:

  • listingHref no reiniciava page=1 en canviar de filtre.
  • Les pàgines 2+ amb filtre actiu es marcaven com indexables; ara són noindex. Només la pàgina 1 sense filtres es pot indexar (aparèixer als cercadors).
  • El mapa de comarques del hero de /agenda no existia: tres enllaços amb el color de cada comarca.
  • Els dies de l'agenda ara mostren el dia de la setmana en vermell: DL., DT., DC...

I totes les llistes passen de force-dynamic a revalidate = 3600 (es prepara un cop l'hora i es reaprofita), com demana l'especificació. El 404 també ha de ser force-dynamic; si no, Next el prerenderitza estàtic amb les landings i serveix el seu "404" per defecte en lloc del nostre.

I ja tenim el migrador esbossat

Fase 3 a la vista. La importació de la publicitat ja tindrà el seu capítol (La publicitat s'importa: Advanced Ads cap a Payload); avui toca la feina grossa: hem creat scripts/migrate-wp/wp_to_payload.py, la base del que el migrador anirà aprenent a fer amb Payload (El migrador aprèn a parlar amb Payload). El fitxer porta el mapatge de cada post_type de WordPress (el gestor antic) a la seva col·lecció de Payload (el gestor nou), les regles de descart (D1-D4, amb detecció d'Elementor, el constructor de pàgines antic) i les llistes d'enums per col·lecció. Amb tests: 64 comprovacions, totes verdes.

El pas següent és la importació pilot d'una comarca. D'això parlem demà.