Files
dwroller/database/migrate-to-sqlite.js
2025-08-15 10:35:27 +02:00

167 lines
5.3 KiB
JavaScript

const mongoose = require('mongoose');
const Player = require('./playerModel');
const { playerHelpers, sessionHelpers } = require('./sqlite-db');
require('dotenv').config();
const MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017/deathwatch';
async function migratePlayers() {
try {
// Connect to MongoDB
console.log('Connecting to MongoDB...');
await mongoose.connect(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });
console.log('Connected to MongoDB');
// Fetch all players from MongoDB
console.log('Fetching players from MongoDB...');
const mongoPlayers = await Player.find();
console.log(`Found ${mongoPlayers.length} players in MongoDB`);
// Migrate each player to SQLite
let migratedCount = 0;
let skippedCount = 0;
for (const mongoPlayer of mongoPlayers) {
try {
// Check if player already exists in SQLite
const existingPlayer = playerHelpers.getByName(mongoPlayer.name);
if (existingPlayer) {
console.log(`Player ${mongoPlayer.name} already exists in SQLite, updating...`);
const updated = playerHelpers.update(mongoPlayer.name, {
rollerInfo: mongoPlayer.rollerInfo || {},
shopInfo: mongoPlayer.shopInfo || {},
tabInfo: mongoPlayer.tabInfo || {},
pw: mongoPlayer.pw || '',
pwHash: mongoPlayer.pwHash || ''
});
if (updated) {
console.log(`✓ Updated player: ${mongoPlayer.name}`);
migratedCount++;
} else {
console.log(`⚠ Failed to update player: ${mongoPlayer.name}`);
skippedCount++;
}
} else {
// Create new player in SQLite
const newPlayer = playerHelpers.create({
name: mongoPlayer.name,
rollerInfo: mongoPlayer.rollerInfo || {},
shopInfo: mongoPlayer.shopInfo || {},
tabInfo: mongoPlayer.tabInfo || {},
pw: mongoPlayer.pw || '',
pwHash: mongoPlayer.pwHash || ''
});
console.log(`✓ Migrated player: ${mongoPlayer.name}`);
migratedCount++;
}
// Log the data being migrated
console.log(` - Roller info: ${Object.keys(mongoPlayer.rollerInfo || {}).length} keys`);
console.log(` - Shop info: ${Object.keys(mongoPlayer.shopInfo || {}).length} keys`);
console.log(` - Tab info: ${Object.keys(mongoPlayer.tabInfo || {}).length} keys`);
} catch (error) {
console.error(`Error migrating player ${mongoPlayer.name}:`, error);
skippedCount++;
}
}
console.log('\n=== Migration Summary ===');
console.log(`Total players in MongoDB: ${mongoPlayers.length}`);
console.log(`Successfully migrated/updated: ${migratedCount}`);
console.log(`Skipped/failed: ${skippedCount}`);
// Verify the migration
console.log('\n=== Verification ===');
const sqlitePlayers = playerHelpers.getAll();
console.log(`Total players in SQLite: ${sqlitePlayers.length}`);
// Show sample data
if (sqlitePlayers.length > 0) {
console.log('\nSample migrated player:');
const sample = sqlitePlayers[0];
console.log(`Name: ${sample.name}`);
console.log(`Roller info keys: ${Object.keys(sample.rollerInfo).length}`);
console.log(`Shop info keys: ${Object.keys(sample.shopInfo).length}`);
console.log(`Tab info keys: ${Object.keys(sample.tabInfo).length}`);
}
} catch (error) {
console.error('Migration failed:', error);
} finally {
// Close connections
await mongoose.disconnect();
console.log('Disconnected from MongoDB');
}
}
// Export player data to JSON for backup
async function exportToJson() {
try {
console.log('Exporting MongoDB data to JSON backup...');
// Connect to MongoDB
await mongoose.connect(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });
// Fetch all players
const players = await Player.find();
// Create backup object
const backup = {
exportDate: new Date().toISOString(),
playerCount: players.length,
players: players.map(player => ({
name: player.name,
rollerInfo: player.rollerInfo || {},
shopInfo: player.shopInfo || {},
tabInfo: player.tabInfo || {},
pw: player.pw || '',
pwHash: player.pwHash || '',
mongoId: player._id.toString()
}))
};
// Write to file
const fs = require('fs');
const path = require('path');
const backupPath = path.join(__dirname, 'mongo-backup.json');
fs.writeFileSync(backupPath, JSON.stringify(backup, null, 2));
console.log(`✓ Backup saved to: ${backupPath}`);
console.log(`✓ Exported ${players.length} players`);
await mongoose.disconnect();
} catch (error) {
console.error('Export failed:', error);
}
}
// Main function
async function main() {
const args = process.argv.slice(2);
if (args.includes('--export-only')) {
await exportToJson();
} else if (args.includes('--migrate-only')) {
await migratePlayers();
} else {
// Do both
await exportToJson();
await migratePlayers();
}
process.exit(0);
}
// Run if called directly
if (require.main === module) {
main().catch(console.error);
}
module.exports = { migratePlayers, exportToJson };