167 lines
5.3 KiB
JavaScript
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 };
|