Arregla pérdida de datos al desplegar: el seed solo siembra si la DB está vacía

El docker-entrypoint corre db:seed en cada arranque. El guard comprobaba si
existía un tenant CONCRETO ("reformas-ejemplo"); si ese no estaba pero había
otros (una empresa creada por el reformista), el seed ejecutaba TRUNCATE de
todas las tablas y resembraba el demo → borraba los datos reales en cada deploy.

Ahora el guard salta si existe CUALQUIER tenant, así que con datos reales el seed
nunca toca la DB. SEED_FORCE=1 sigue forzando el reseed (borra todo) a propósito.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Carlos Narro
2026-06-11 17:38:38 +02:00
parent df700bcbfb
commit 5afda5af05

View File

@@ -291,13 +291,13 @@ const SEED_LEADS: SeedLead[] = [
const STAGE_ORDER = schema.pipelineStage.enumValues;
async function main() {
const [existing] = await db
.select()
.from(schema.tenants)
.where(eq(schema.tenants.slug, 'reformas-ejemplo'))
.limit(1);
// Guard de seguridad: solo sembramos si la base de datos está VACÍA (sin ningún tenant). Antes se
// comprobaba un slug concreto ("reformas-ejemplo"); si ese tenant no estaba pero había otros
// (p. ej. una empresa creada por el reformista), el seed los TRUNCABA en cada deploy → pérdida de
// datos. Ahora cualquier tenant existente protege toda la DB. SEED_FORCE=1 fuerza el reseed (BORRA TODO).
const [existing] = await db.select({ id: schema.tenants.id }).from(schema.tenants).limit(1);
if (existing && !process.env.SEED_FORCE) {
console.log('Ya hay datos (tenant "reformas-ejemplo"). Saltando seed. Usa SEED_FORCE=1 para forzar.');
console.log('La base de datos ya tiene datos (existe al menos un tenant). Saltando seed para no borrar nada. Usa SEED_FORCE=1 para forzar (¡BORRA TODO!).');
await client.end();
return;
}