mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 06:11:45 +00:00
86 lines
2.9 KiB
TypeScript
86 lines
2.9 KiB
TypeScript
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 };
|