Spaces:
Sleeping
Sleeping
| import fs from 'fs'; | |
| import path from 'path'; | |
| const dataDir = path.join(__dirname, '../../data'); | |
| const dbPath = path.join(dataDir, 'travel.db'); | |
| const baselinePath = path.join(dataDir, 'travel-baseline.db'); | |
| function resetDemoUser(): void { | |
| if (!fs.existsSync(baselinePath)) { | |
| console.log('[Demo Reset] No baseline found, skipping. Admin must save baseline first.'); | |
| return; | |
| } | |
| const { db, closeDb, reinitialize } = require('../db/database'); | |
| // Save admin's current credentials and API keys (these should survive the reset) | |
| const adminEmail = process.env.DEMO_ADMIN_EMAIL || 'admin@nomad.app'; | |
| interface AdminData { password_hash: string; maps_api_key: string | null; openweather_api_key: string | null; unsplash_api_key: string | null; avatar: string | null; } | |
| let adminData: AdminData | undefined = undefined; | |
| try { | |
| adminData = db.prepare( | |
| 'SELECT password_hash, maps_api_key, openweather_api_key, unsplash_api_key, avatar FROM users WHERE email = ?' | |
| ).get(adminEmail) as AdminData | undefined; | |
| } catch (e: unknown) { | |
| console.error('[Demo Reset] Failed to read admin data:', e instanceof Error ? e.message : e); | |
| } | |
| // Flush WAL to main DB file | |
| try { db.exec('PRAGMA wal_checkpoint(TRUNCATE)'); } catch (e) {} | |
| // Close DB connection | |
| closeDb(); | |
| // Restore baseline | |
| try { | |
| fs.copyFileSync(baselinePath, dbPath); | |
| // Remove WAL/SHM files if they exist (stale from old connection) | |
| try { fs.unlinkSync(dbPath + '-wal'); } catch (e) {} | |
| try { fs.unlinkSync(dbPath + '-shm'); } catch (e) {} | |
| } catch (e: unknown) { | |
| console.error('[Demo Reset] Failed to restore baseline:', e instanceof Error ? e.message : e); | |
| reinitialize(); | |
| return; | |
| } | |
| // Reinitialize DB connection with restored baseline | |
| reinitialize(); | |
| // Restore admin's latest credentials (in case admin changed password/API keys after baseline was saved) | |
| if (adminData) { | |
| try { | |
| const { db: freshDb } = require('../db/database'); | |
| freshDb.prepare( | |
| 'UPDATE users SET password_hash = ?, maps_api_key = ?, openweather_api_key = ?, unsplash_api_key = ?, avatar = ? WHERE email = ?' | |
| ).run( | |
| adminData.password_hash, | |
| adminData.maps_api_key, | |
| adminData.openweather_api_key, | |
| adminData.unsplash_api_key, | |
| adminData.avatar, | |
| adminEmail | |
| ); | |
| } catch (e: unknown) { | |
| console.error('[Demo Reset] Failed to restore admin credentials:', e instanceof Error ? e.message : e); | |
| } | |
| } | |
| console.log('[Demo Reset] Database restored from baseline'); | |
| } | |
| function saveBaseline(): void { | |
| const { db } = require('../db/database'); | |
| // Flush WAL so baseline file is self-contained | |
| try { db.exec('PRAGMA wal_checkpoint(TRUNCATE)'); } catch (e) {} | |
| fs.copyFileSync(dbPath, baselinePath); | |
| console.log('[Demo] Baseline saved'); | |
| } | |
| function hasBaseline(): boolean { | |
| return fs.existsSync(baselinePath); | |
| } | |
| export { resetDemoUser, saveBaseline, hasBaseline }; | |