diff --git a/scripts/import-data.ts b/scripts/import-data.ts new file mode 100644 index 0000000..c6abc95 --- /dev/null +++ b/scripts/import-data.ts @@ -0,0 +1,175 @@ +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();