fix: inicializar esquema en desarrollo si no existe la tabla tasks

Co-authored-by: aider (openrouter/openai/gpt-5) <aider@aider.chat>
webui
borja 2 weeks ago
parent 939c721456
commit cd6d9c02af

@ -60,54 +60,81 @@ async function openDb(filename: string = 'tasks.db'): Promise<any> {
const instance = new DatabaseCtor(absolutePath); const instance = new DatabaseCtor(absolutePath);
applyDefaultPragmas(instance); applyDefaultPragmas(instance);
// Auto-inicialización y seed sólo en desarrollo y primer arranque // Auto-inicialización de esquema en desarrollo si falta y seed opcional
if (firstCreate && isDev() && DEV_AUTOSEED_DB) { if (isDev()) {
// Detectar entorno Bun vs Node (Vite dev) // ¿Existe la tabla principal?
const isBun = typeof (globalThis as any).Bun !== 'undefined'; let hasTasksTable = false;
try {
instance.prepare(`SELECT 1 FROM tasks LIMIT 1`).get();
hasTasksTable = true;
} catch {}
if (isBun) { // Si no existe el esquema, aplicar inicialización/migraciones
// En Bun podemos reutilizar initializeDatabase del repo principal if (!hasTasksTable) {
try { const isBun = typeof (globalThis as any).Bun !== 'undefined';
const dbModule = await import('../../../../../src/db');
if (typeof (dbModule as any).initializeDatabase === 'function') { if (isBun) {
(dbModule as any).initializeDatabase(instance); // En Bun podemos reutilizar initializeDatabase del repo principal
try {
const dbModule = await import('../../../../../src/db');
if (typeof (dbModule as any).initializeDatabase === 'function') {
(dbModule as any).initializeDatabase(instance);
hasTasksTable = true;
}
} catch (e) {
console.warn('[web/db] No se pudo ejecutar initializeDatabase en dev (Bun):', e);
}
} else {
// En SSR Node: aplicar migraciones directamente con compat para .query
try {
const mod = await import('../../../../../src/db/migrations/index.ts');
const list = (mod as any).migrations as any[];
const compat: any = instance;
if (typeof compat.query !== 'function') {
compat.query = (sql: string) => ({
all: () => compat.prepare(sql).all(),
get: () => compat.prepare(sql).get()
});
}
try { compat.exec?.(`PRAGMA foreign_keys = ON;`); } catch {}
for (const m of list) {
try {
await (m.up as any)(compat);
} catch (e) {
console.warn('[web/db] Error aplicando migración en dev (Node):', (m as any)?.name ?? '(sin nombre)', e);
}
}
// Verificar de nuevo
try {
compat.prepare(`SELECT 1 FROM tasks LIMIT 1`).get();
hasTasksTable = true;
} catch {}
} catch (e) {
console.warn('[web/db] No se pudieron aplicar migraciones en dev (Node):', e);
} }
} catch (e) {
console.warn('[web/db] No se pudo ejecutar initializeDatabase en dev (Bun):', e);
} }
} else { }
// En SSR Node: aplicar migraciones directamente con compat para .query
// Seed de datos de demo si está habilitado y la tabla está vacía
if (DEV_AUTOSEED_DB) {
try { try {
const mod = await import('../../../../../src/db/migrations/index.ts'); let count = 0;
const list = (mod as any).migrations as any[]; try {
const compat: any = instance; const row = instance.prepare(`SELECT COUNT(1) AS c FROM tasks`).get() as any;
if (typeof compat.query !== 'function') { count = Number(row?.c ?? 0);
compat.query = (sql: string) => ({ } catch {
all: () => compat.prepare(sql).all(), // Si aún no existe la tabla, no seedear
get: () => compat.prepare(sql).get() count = 0;
});
} }
try { compat.exec?.(`PRAGMA foreign_keys = ON;`); } catch {} if (count === 0) {
for (const m of list) { const seed = await import('./dev-seed');
try { if (typeof (seed as any).seedDev === 'function') {
await (m.up as any)(compat); await (seed as any).seedDev(instance, DEV_DEFAULT_USER);
} catch (e) {
console.warn('[web/db] Error aplicando migración en dev (Node):', (m as any)?.name ?? '(sin nombre)', e);
} }
} }
} catch (e) { } catch (e) {
console.warn('[web/db] No se pudieron aplicar migraciones en dev (Node):', e); console.warn('[web/db] No se pudo realizar el seed de datos de demo:', e);
}
}
// Seed de datos de demo
try {
const seed = await import('./dev-seed');
if (typeof (seed as any).seedDev === 'function') {
await (seed as any).seedDev(instance, DEV_DEFAULT_USER);
} }
} catch (e) {
console.warn('[web/db] No se pudo realizar el seed de datos de demo:', e);
} }
} }

Loading…
Cancel
Save