From 6a3352a96ca378388e5caef32908efdb4dce03af Mon Sep 17 00:00:00 2001 From: mono Date: Sun, 25 Oct 2026 21:27:44 -0500 Subject: [PATCH] fix: preservar datos y recuperar base local --- AGENTS.md | 5 +++ apps/toldo-app/package-lock.json | 4 +-- apps/toldo-app/package.json | 2 +- .../src/__tests__/critical-flow.test.ts | 2 +- .../src/__tests__/database-bootstrap.test.ts | 22 +++++++++++++ apps/toldo-app/src/main.ts | 24 +++++++++++++- apps/toldo-app/src/style.css | 5 +++ apps/toldo-app/src/views/Exportar.vue | 8 ++++- apps/toldo-app/version.properties | 4 +-- .../.openspec.yaml | 2 ++ .../harden-database-bootstrap-reset/design.md | 23 +++++++++++++ .../proposal.md | 29 ++++++++++++++++ .../specs/database-bootstrap-recovery/spec.md | 33 +++++++++++++++++++ .../harden-database-bootstrap-reset/tasks.md | 12 +++++++ .../standardize-app-version/proposal.md | 2 +- .../specs/app-versioning/spec.md | 6 ++-- .../changes/standardize-app-version/tasks.md | 2 +- packages/data/src/db/schema.ts | 10 ++++++ .../src/export-import/ExportImportService.ts | 2 +- 19 files changed, 183 insertions(+), 14 deletions(-) create mode 100644 apps/toldo-app/src/__tests__/database-bootstrap.test.ts create mode 100644 openspec/changes/harden-database-bootstrap-reset/.openspec.yaml create mode 100644 openspec/changes/harden-database-bootstrap-reset/design.md create mode 100644 openspec/changes/harden-database-bootstrap-reset/proposal.md create mode 100644 openspec/changes/harden-database-bootstrap-reset/specs/database-bootstrap-recovery/spec.md create mode 100644 openspec/changes/harden-database-bootstrap-reset/tasks.md diff --git a/AGENTS.md b/AGENTS.md index 2576327..6d6be43 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,3 +33,8 @@ Mantener código siguiendo arquitectura limpia - El script debe confirmar `applicationId`, `versionName`, `versionCode`, bundle JavaScript, fuentes MDI y textos críticos de la versión. - Incrementar `versionCode` para cada APK publicable; mantener la misma firma y publicar versiones beta como prerelease. - Después de subir un asset, comparar su SHA256 con el APK verificado localmente y comprobar el asset de la release mediante la API de Gitea. + +## Persistencia local +- La app debe abrir Dexie explícitamente antes de montar Vue. +- Las migraciones deben agregar una nueva versión Dexie y transformar datos; nunca deben borrar datos automáticamente. +- El reset de la base es una acción manual, confirmada y visible sólo como último recurso. diff --git a/apps/toldo-app/package-lock.json b/apps/toldo-app/package-lock.json index 238ee79..cc17534 100644 --- a/apps/toldo-app/package-lock.json +++ b/apps/toldo-app/package-lock.json @@ -1,12 +1,12 @@ { "name": "toldo-app", - "version": "0.0.5", + "version": "0.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "toldo-app", - "version": "0.0.5", + "version": "0.0.6", "dependencies": { "@capacitor/android": "^6.2.1", "@capacitor/core": "^6.2.1", diff --git a/apps/toldo-app/package.json b/apps/toldo-app/package.json index 5541097..4226b4e 100644 --- a/apps/toldo-app/package.json +++ b/apps/toldo-app/package.json @@ -1,7 +1,7 @@ { "name": "toldo-app", "private": true, - "version": "0.0.5", + "version": "0.0.6", "type": "module", "scripts": { "dev": "vite", diff --git a/apps/toldo-app/src/__tests__/critical-flow.test.ts b/apps/toldo-app/src/__tests__/critical-flow.test.ts index c59bfd7..ea3ae5c 100644 --- a/apps/toldo-app/src/__tests__/critical-flow.test.ts +++ b/apps/toldo-app/src/__tests__/critical-flow.test.ts @@ -19,7 +19,7 @@ describe('contratos de operación y respaldo', () => { it('expone la versión actual en las exportaciones', () => { const result = new ExportImportService().exportAll({ productores: [], productos: [], movimientosInventario: [], ventas: [], ventaLineas: [], gastos: [], ajustes: [], cuadres: [] }); - expect(result.appVersion).toBe('0.0.5'); + expect(result.appVersion).toBe('0.0.6'); }); it('exporta jornadas junto con los datos operativos', () => { diff --git a/apps/toldo-app/src/__tests__/database-bootstrap.test.ts b/apps/toldo-app/src/__tests__/database-bootstrap.test.ts new file mode 100644 index 0000000..da8a070 --- /dev/null +++ b/apps/toldo-app/src/__tests__/database-bootstrap.test.ts @@ -0,0 +1,22 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { db, openDatabase, resetDatabase } from '@toldo/data'; + +describe('bootstrap y recuperación de base local', () => { + beforeEach(async () => { + await resetDatabase(); + }); + + it('abre el esquema actual y conserva datos al cerrar y abrir', async () => { + await db.productores.add({ id: 'persisted', nombre: 'Productor persistente', activo: true, createdAt: new Date() } as any); + db.close(); + await openDatabase(); + expect(await db.productores.get('persisted')).toMatchObject({ nombre: 'Productor persistente' }); + expect(db.auditorias).toBeTruthy(); + }); + + it('restablece sólo cuando se solicita explícitamente', async () => { + await db.productores.add({ id: 'to-reset', nombre: 'Temporal', activo: true, createdAt: new Date() } as any); + await resetDatabase(); + expect(await db.productores.count()).toBe(0); + }); +}); diff --git a/apps/toldo-app/src/main.ts b/apps/toldo-app/src/main.ts index 404617e..89fa09e 100644 --- a/apps/toldo-app/src/main.ts +++ b/apps/toldo-app/src/main.ts @@ -2,5 +2,27 @@ import { createApp } from 'vue' import App from './App.vue' import router from './router' import vuetify from './plugins/vuetify' +import { openDatabase, resetDatabase } from '@toldo/data' -createApp(App).use(router).use(vuetify).mount('#app') +async function bootstrap() { + try { + await openDatabase() + createApp(App).use(router).use(vuetify).mount('#app') + } catch (error) { + const root = document.querySelector('#app') + if (!root) return + root.innerHTML = '' + const card = document.createElement('main') + card.className = 'database-recovery' + card.innerHTML = '

No se pudo abrir los datos locales

La aplicación no continuará para evitar mostrar información incompleta. Puedes intentar recargar o restablecer el entorno como último recurso.

' + const details = document.createElement('pre') + details.textContent = error instanceof Error ? error.message : String(error) + const button = document.createElement('button') + button.textContent = 'Restablecer entorno local' + button.onclick = async () => { button.disabled = true; await resetDatabase(); window.location.reload() } + card.append(details, button) + root.append(card) + } +} + +bootstrap() diff --git a/apps/toldo-app/src/style.css b/apps/toldo-app/src/style.css index ae505a2..9ece11d 100644 --- a/apps/toldo-app/src/style.css +++ b/apps/toldo-app/src/style.css @@ -56,6 +56,11 @@ body { background: #f5f7f2; } +.database-recovery { max-width: 640px; margin: 12vh auto; padding: 24px; font-family: system-ui, sans-serif; color: #26352b; background: #fffdf8; border: 1px solid #d9e2d7; border-radius: 12px; box-shadow: 0 8px 30px rgba(38, 53, 43, .12); } +.database-recovery p { margin: 12px 0; } +.database-recovery pre { white-space: pre-wrap; font-size: 12px; color: #6b4a25; background: #f7f1e7; padding: 12px; border-radius: 8px; } +.database-recovery button { padding: 12px 16px; color: white; background: #2d5f3b; border: 0; border-radius: 8px; cursor: pointer; } + h1, h2 { font-family: var(--heading); diff --git a/apps/toldo-app/src/views/Exportar.vue b/apps/toldo-app/src/views/Exportar.vue index 436df63..f63cc51 100644 --- a/apps/toldo-app/src/views/Exportar.vue +++ b/apps/toldo-app/src/views/Exportar.vue @@ -8,19 +8,25 @@
Restaurar datos{{ mensaje }}Importar datos + Mantenimiento
Restablece la base local sólo si la aplicación no puede migrarla. Esta acción elimina ventas, inventario, jornadas y respaldos locales.
Restablecer entorno local