Notes

El dissabte més dens: editor, ingesta i un DNS que es va apagar

Vint commits: dashboard propi a l''admin, botons d''IA, cua d''ingesta amb

3 min de lectura

El dissabte més dens del projecte

Vint commits (cada punt guardat del codi, amb el seu missatge). Fase 5 gairebé sencera, l'arrencada de la 6, i un DNS que es va apagar al mig d'un build (el procés que compila tota la web). Va per ordre. Si t'has perdut, un dels capítols anteriors del diari és El migrador ja parla amb el WordPress de producció.

Un dashboard propi

Vista /admin pròpia: cinc targetes (publicats del mes, pendents, plans LaIA, subscriptors, consum LLM) i tres accessos directes. Que es vegi va requerir arreglar el build dues vegades: l'importMap de Payload —el gestor de continguts nou— es genera sol i no es commiteja; sense ell, les vistes custom no es registren. I payload-types.ts és al gitignore (la llista de fitxers que el Git ignora), així que el build del servidor fallava amb col·leccions noves fins afegir la generació al procés.

A sobre, un bug de Payload 3.89: passar l'objecte locale com a clientProp a una vista client rebenta la serialització RSC (el format amb què React es passa les dades del servidor al navegador) amb un Functions cannot be passed directly to Client Components. Solució: un wrapper sense use client que rep la vista i munta el dashboard sense props.

Botons d'IA i ingesta amb porta

Botons d'IA contextuals a títol, copdet, metaDescription i alt de quatre col·leccions, amb live preview a les mateixes.

La cua d'ingesta (T5.6): el que genera l'agent ja no es publica sol. Arriba amb estatFlux=revisio, publicar és només d'admin i descartar demana motiu. A l'endpoint de l'agent, quatre correccions del dia: es busca per l'índex HMAC de l'API key (una empremta de la clau, no la clau sencera), no per la clau xifrada; els camps estructurats no admeten null (un $push sobre null rebenta); les imatges de revisió van a una taula filla, perquè Postgres (la base de dades) no guarda arrays dins de jsonb; i un cast perquè el tipus de drafts exigeix un flag que no fem servir.

El fantasma número 418

L'error d'hidratació —el servidor pinta una cosa i el navegador esperava una altra— va tornar: un <a> dins d'un <a> a la home, i el lang de l'admin. I les vistes d'edició donaven 500: l'arbre de dependències tenia una versió antiga d'un paquet de Payload (3.45 instal·lat, 3.89 exigit) i els deep imports de AiAssist la xapaven. Fora versió fantasma, vistes vives.

El DNS es mor a mig build

A mig build, el DNS de la màquina va caure i els builds es quedaven penjats demanant fonts de Google. El DNS és la libreta d'adreces que tradueix noms en adreces; sense ell, res. Dos pegats: pre-resoldre els dominis a /etc/hosts, i DNS públic (8.8.8.8, 1.1.1.1) al servei de l'app. Al cap de mitja hora, tot revertit: quan el MagicDNS de Tailscale (la xarxa privada del servidor) torna, el pegat és soroll. Queda un script de recovery i una cosa apresa: si payload migrate troba marcadors batch = -1, demana confirmació interactiva i atura el deploy (la publicació al servidor). El deploy neteja aquestes files abans de migrar.

I ja de nit, publicitat

Primera fase 6: motor de zones amb rotació per pes, tracking propi d'impressions i clics (/ads/imp, /ads/click), i panell d'estadístiques amb pàgina /publicitat. El detall del dia: el filtre de campanyes vigents comparava amb CURRENT_DATE, que a Postgres és UTC (l'hora mundial). Una campanya vigent a les 00:30 d'aquí no sortia. Ara compara amb (now() AT TIME ZONE 'Europe/Madrid')::date.

Què queda

Fase 5 quasi tancada. Fase 6, encesa. I el servidor, amb el DNS viu de nou.