Saltar al contingut principal

Onada de millores internes: seguretat, rendiment i resiliència

Producte i plataforma

Aquesta setmana ha estat més de treure deute que d'afegir coses noves, però el resultat és que l'app se sent més sòlida. Resum perquè sàpigues on hem millorat encara que no ho hagis vist amb l'ull.

Seguretat

  • Escapat de JSON-LD a la carta pública per evitar injeccions des de noms de plat exòtics.
  • Validació d'URLs externes abans de mostrar-les a les públiques.
  • Pujada d'imatges ara rebutja SVGs i limita la mida a 5 MB. Abans s'hi podia colar un SVG amb script.
  • Token d'edició pública signat amb HMAC: ningú no pot editar la reserva d'algú altre encara que endevini l'ID.
  • Webhook de Stripe idempotent: si el mateix esdeveniment arriba dues vegades (Stripe de vegades reintenta), només s'aplica un cop.
  • Rate-limit i access guard en sis funcions de Gemini perquè no se n'abusi del cost.
  • Rols: workspace-member-upsert ja no permet escalar a owner des d'un rol inferior.

Rendiment

  • Admin overview ha deixat de fer N+1 en llistar restaurants (era una query per cadascun; ara una de sola).
  • Sentry lazy-loaded: només es carrega quan cal, no a cada visita a la home pública.
  • date-fns per bundle petit en lloc del paquet sencer, estalvia uns 80 KB a cada càrrega.

Resiliència

  • Auto-reload del frontend si falla el preload d'un chunk després d'un deploy: l'usuari no veu pantalla trencada, recarrega sola.
  • Snapshot de dist/ i script de rollback ràpid a la versió anterior si un deploy ho espatlla.
  • Recordatoris ara respecten la zona horària del restaurant (abans s'enviaven en UTC i a vegades s'avançaven una hora).
  • Cron d'estadístiques públiques reagendat per no trepitjar-se amb els backups.

Si alguna cosa anava lenta o rara i notes que ja no, era això.

ESENCA