Hoja de ruta técnica · Firebase → backend propio
De una SPA estática conectada directo a Firebase a una arquitectura con backend propio, base de datos relacional y aislamiento real de datos por empresa.
El sistema actual funciona y está en producción, pero la seguridad depende solo de validaciones hechas en el navegador. Cualquier usuario autenticado puede, en teoría, leer y escribir datos de otra empresa. Este plan existe para corregir eso, llevando la lógica de autorización y los datos a un backend al que el cliente nunca accede directamente.
Los 5 cambios
01 — Estructura
/frontend y /backendimport directo de código de un lado al otro02 — Backend
NestJS, que corre sobre Express (intercambiable por Fastify) y ya organiza módulos e inyección de dependencias03 — Datos
workspace_id, verificado en cada consulta del backendPrisma — el más usado del mercado hoy, type-safe. Queda escondido detrás de una interfaz de repositorio en la capa de dominio, para que la regla de negocio nunca dependa del ORM directamente04 — Frontend
05 — Arquitectura interna
dominio (reglas de negocio) → aplicación (casos de uso) → infraestructura (base de datos, HTTP)La validación existe en los dos lados, pero con roles distintos: el backend es dueño de la regla de negocio (capa de dominio) y revalida todo, siempre. El frontend solo dibuja y valida UX — campo obligatorio, formato, feedback inmediato — nunca decide una regla de negocio, y ninguna validación del frontend es confiable por sí sola.
Todo el código se escribe en inglés (variables, funciones, tablas, endpoints, commits), sin excepción. El backend siempre responde en inglés — mensajes de error y claves de traducción, nunca texto traducido fijo. El frontend decide el idioma de visualización — por defecto según el navegador del cliente, con opción de elegirlo manualmente — reaprovechando el módulo de i18n que ya existe.
06 — Orden de ejecución
A partir de los datos que ya existen hoy en Firestore.
Capas de Clean Architecture + primer endpoint funcionando: autenticación.
Clientes → Trabajos → Gastos → Inventario → el resto. Nunca todo de una vez.
Hasta que cada módulo nuevo esté validado — sin que el cliente sienta la transición.
Aislamiento por empresa, validación del lado del servidor, página pública de aprobación dependiendo de un token real guardado en la base de datos — no de parámetros en la URL.