import { drizzle } from "drizzle-orm/neon-serverless"; import { Pool } from "@neondatabase/serverless"; import { sessions, users, mediaOutlets, articles, predictionMarkets, auctions, bids, mediaOutletRequests, comments, predictionBets, } from "../shared/schema"; import { readFileSync } from "fs"; import { join } from "path"; interface ExportData { exportDate: string; version: string; tables: { sessions: any[]; users: any[]; mediaOutlets: any[]; articles: any[]; predictionMarkets: any[]; auctions: any[]; bids: any[]; mediaOutletRequests: any[]; comments: any[]; predictionBets: any[]; }; metadata: { totalRecords: number; tableStats: Record; }; } async function importData() { console.log("šŸš€ Starting data import...\n"); // Get command line arguments const args = process.argv.slice(2); const filename = args[0]; const targetDatabaseUrl = args[1]; if (!filename) { console.error("āŒ Error: No filename provided"); console.log("\nUsage: npm run db:import [database_url]"); console.log("\nExample:"); console.log(" npm run db:import data-export-2025-10-13.json"); console.log(" npm run db:import data-export-2025-10-13.json postgresql://user:pass@host/db"); process.exit(1); } // Read export file const filepath = join(process.cwd(), filename); console.log(`šŸ“‚ Reading data from ${filename}...`); let exportData: ExportData; try { const fileContent = readFileSync(filepath, 'utf-8'); exportData = JSON.parse(fileContent); console.log(` āœ… File loaded successfully`); console.log(` šŸ“… Export date: ${exportData.exportDate}`); console.log(` šŸ“Š Total records: ${exportData.metadata.totalRecords}`); } catch (error) { console.error(`āŒ Error reading file:`, error); process.exit(1); } // Setup database connection const databaseUrl = targetDatabaseUrl || process.env.DATABASE_URL; if (!databaseUrl) { console.error("āŒ Error: No database URL provided"); console.log("\nPlease provide a DATABASE_URL environment variable or pass it as an argument"); process.exit(1); } console.log(`\nšŸ”— Connecting to database...`); const pool = new Pool({ connectionString: databaseUrl }); const targetDb = drizzle(pool); console.log(` āœ… Connected successfully`); try { // Import data in dependency order console.log("\nšŸ“„ Importing data...\n"); // 1. Sessions if (exportData.tables.sessions.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.sessions.length} sessions...`); await targetDb.insert(sessions).values(exportData.tables.sessions).onConflictDoNothing(); console.log(` āœ… Sessions imported`); } // 2. Users if (exportData.tables.users.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.users.length} users...`); await targetDb.insert(users).values(exportData.tables.users).onConflictDoNothing(); console.log(` āœ… Users imported`); } // 3. Media Outlets if (exportData.tables.mediaOutlets.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.mediaOutlets.length} media outlets...`); await targetDb.insert(mediaOutlets).values(exportData.tables.mediaOutlets).onConflictDoNothing(); console.log(` āœ… Media outlets imported`); } // 4. Articles if (exportData.tables.articles.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.articles.length} articles...`); await targetDb.insert(articles).values(exportData.tables.articles).onConflictDoNothing(); console.log(` āœ… Articles imported`); } // 5. Prediction Markets if (exportData.tables.predictionMarkets.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.predictionMarkets.length} prediction markets...`); await targetDb.insert(predictionMarkets).values(exportData.tables.predictionMarkets).onConflictDoNothing(); console.log(` āœ… Prediction markets imported`); } // 6. Auctions if (exportData.tables.auctions.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.auctions.length} auctions...`); await targetDb.insert(auctions).values(exportData.tables.auctions).onConflictDoNothing(); console.log(` āœ… Auctions imported`); } // 7. Bids if (exportData.tables.bids.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.bids.length} bids...`); await targetDb.insert(bids).values(exportData.tables.bids).onConflictDoNothing(); console.log(` āœ… Bids imported`); } // 8. Media Outlet Requests if (exportData.tables.mediaOutletRequests.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.mediaOutletRequests.length} media outlet requests...`); await targetDb.insert(mediaOutletRequests).values(exportData.tables.mediaOutletRequests).onConflictDoNothing(); console.log(` āœ… Media outlet requests imported`); } // 9. Comments if (exportData.tables.comments.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.comments.length} comments...`); await targetDb.insert(comments).values(exportData.tables.comments).onConflictDoNothing(); console.log(` āœ… Comments imported`); } // 10. Prediction Bets if (exportData.tables.predictionBets.length > 0) { console.log(`šŸ“Š Importing ${exportData.tables.predictionBets.length} prediction bets...`); await targetDb.insert(predictionBets).values(exportData.tables.predictionBets).onConflictDoNothing(); console.log(` āœ… Prediction bets imported`); } console.log(`\nāœ… Import completed successfully!`); console.log(`\nšŸ“Š Import summary:`); Object.entries(exportData.metadata.tableStats).forEach(([table, count]) => { console.log(` - ${table}: ${count} records`); }); await pool.end(); process.exit(0); } catch (error) { console.error("\nāŒ Error during import:", error); await pool.end(); process.exit(1); } } // Run import importData();