#!/usr/bin/env node /** * Clean up production database - remove test records only * * WARNING: This script modifies the production database. * It only removes records that match test patterns. * It preserves actual player data, matches, and tournaments. */ const { execSync } = require('child_process'); // Database connection string const DB_URL = 'postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp'; // Helper to run SQL and log results function runSQL(sql, description) { console.log(`\n๐Ÿ” ${description}...`); try { const result = execSync(`psql "${DB_URL}" -c "${sql}"`, { encoding: 'utf8' }); console.log(result); return true; } catch (error) { console.error(`โŒ Error: ${error.message}`); return false; } } // Helper to run multi-line SQL function runMultiLineSQL(sqlLines, description) { console.log(`\n๐Ÿ” ${description}...`); try { const sql = sqlLines.join('\n'); const result = execSync(`psql "${DB_URL}" -c "${sql}"`, { encoding: 'utf8' }); console.log(result); return true; } catch (error) { console.error(`โŒ Error: ${error.message}`); return false; } } // Helper to count records matching pattern function countRecords(table, column, pattern) { const sql = `SELECT COUNT(*) FROM ${table} WHERE ${column} LIKE '${pattern}';`; try { const result = execSync(`psql "${DB_URL}" -c "${sql}" -t`, { encoding: 'utf8' }).trim(); return parseInt(result); } catch (error) { return 0; } } async function main() { console.log('๐Ÿงน Cleaning up test records from production database'); console.log('=============================================\n'); // Confirm with user const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('โš ๏ธ This will DELETE test records from PRODUCTION database. Continue? (y/N) ', async (answer) => { if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 'yes') { console.log('โŒ Cleanup cancelled'); rl.close(); process.exit(0); } rl.close(); console.log('\n๐Ÿ“‹ Checking test records...\n'); // Count test players const testPlayerCount = countRecords('players', 'name', '%Test%') + countRecords('players', 'name', '%Setup%') + countRecords('players', 'name', '%Home Test%'); console.log(`Test players found: ${testPlayerCount}`); // Count test tournaments const testEventCount = countRecords('events', 'name', '%Test%') + countRecords('events', 'name', '%Setup%'); console.log(`Test tournaments found: ${testEventCount}`); // Count test users const testUserCount = countRecords('users', 'email', '%test%') + countRecords('users', 'email', '%setup%'); console.log(`Test users found: ${testUserCount}`); console.log('\n๐Ÿ”„ Starting cleanup...\n'); // Step 1: Delete test events (tournaments) that have no matches console.log('1. Deleting test tournaments without matches...'); runSQL( "DELETE FROM events WHERE (name LIKE '%Test%' OR name LIKE '%Setup%') AND NOT EXISTS (SELECT 1 FROM matches WHERE matches.\"eventId\" = events.id);", 'Deleted test tournaments' ); // Step 2: Delete test players that have no matches console.log('\n2. Deleting test players without matches...'); runSQL( "DELETE FROM players WHERE (name LIKE '%Test%' OR name LIKE '%Setup%' OR name LIKE '%Home Test%') AND NOT EXISTS (SELECT 1 FROM matches WHERE matches.\"team1P1Id\" = players.id) AND NOT EXISTS (SELECT 1 FROM matches WHERE matches.\"team1P2Id\" = players.id) AND NOT EXISTS (SELECT 1 FROM matches WHERE matches.\"team2P1Id\" = players.id) AND NOT EXISTS (SELECT 1 FROM matches WHERE matches.\"team2P2Id\" = players.id);", 'Deleted test players without matches' ); // Step 3: Delete test users (they shouldn't have player associations) console.log('\n3. Deleting test users...'); runSQL( "DELETE FROM users WHERE (email LIKE '%test%' OR email LIKE '%setup%') AND \"playerId\" IS NULL;", 'Deleted test users' ); // Summary console.log('\nโœ… Cleanup complete!'); console.log('\n๐Ÿ“Š Remaining test records:'); runSQL("SELECT COUNT(*) FROM players WHERE name LIKE '%Test%' OR name LIKE '%Setup%' OR name LIKE '%Home Test%';", 'Remaining test players'); runSQL("SELECT COUNT(*) FROM events WHERE name LIKE '%Test%' OR name LIKE '%Setup%';", 'Remaining test tournaments'); runSQL("SELECT COUNT(*) FROM users WHERE email LIKE '%test%' OR email LIKE '%setup%';", 'Remaining test users'); console.log('\n๐Ÿ’ก Note: Some test records may remain if they have:'); console.log(' - Associated matches'); console.log(' - Associated users'); console.log(' These were preserved to maintain data integrity.'); }); } // Run main function main();