From 3ab04c5fd79b91ffd43865dc095a00bb04fc2ba5 Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Wed, 24 Dec 2025 18:25:50 -0300 Subject: [PATCH] feat(seeder): interleave users and companies before heavy city seeding --- seeder-api/src/index.js | 19 ++++++++--- seeder-api/src/seeders/location-loader.js | 40 +++++++++++++++++++++-- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/seeder-api/src/index.js b/seeder-api/src/index.js index c863460..b71eb9c 100644 --- a/seeder-api/src/index.js +++ b/seeder-api/src/index.js @@ -1,5 +1,5 @@ import { pool, testConnection, closePool } from './db.js'; -import { seedLocationData, seedLocationDataLite } from './seeders/location-loader.js'; +import { seedBaseLocations, seedDetailedLocations, seedLocationDataLite } from './seeders/location-loader.js'; import { seedUsers } from './seeders/users.js'; import { seedCompanies } from './seeders/companies.js'; import { seedJobs } from './seeders/jobs.js'; @@ -63,14 +63,23 @@ async function seedDatabase() { console.log(''); // Seed in order (respecting foreign key dependencies) - // 1. Location data first (continents -> subregions -> countries -> states -> cities) - console.time('🌍 Total Location Seeding'); - await seedLocationData(); - console.timeEnd('🌍 Total Location Seeding'); + // 1. Base Location data (Continents, Countries) - Fast & Required for Companies + console.time('🌍 Base Location Seeding'); + await seedBaseLocations(); + console.timeEnd('🌍 Base Location Seeding'); // 2. Then companies (need countries) await seedCompanies(); + + // 3. Then users (need companies) await seedUsers(); + + // 4. Detailed Location data (States, Cities) - Heavy + console.time('🌍 Detailed Location Seeding'); + await seedDetailedLocations(); + console.timeEnd('🌍 Detailed Location Seeding'); + + // 5. Jobs & Applications (need users & companies) await seedJobs(); await seedAcmeCorp(); // 🏭 ACME Corp + 69 vagas hilariantes await seedWileECoyote(); // 🐺 Wile E. Coyote user diff --git a/seeder-api/src/seeders/location-loader.js b/seeder-api/src/seeders/location-loader.js index 1b33b98..0512cfd 100644 --- a/seeder-api/src/seeders/location-loader.js +++ b/seeder-api/src/seeders/location-loader.js @@ -456,9 +456,12 @@ async function executeGzippedSqlFile(filename, tableName) { /** * Seed all location data from SQL dumps */ -export async function seedLocationData() { - console.log('🌍 Seeding comprehensive location data...'); - console.log(' Source: GeoDB Cities (https://github.com/dr5hn/countries-states-cities-database)\n'); +/** + * Seed base location data (Continents, Subregions, Countries) + * This is fast and required for Company seeding + */ +export async function seedBaseLocations() { + console.log('🌍 Seeding base location data (Continents -> Countries)...'); try { // 1. Continents (from regions.sql - 6 records) @@ -479,6 +482,20 @@ export async function seedLocationData() { await executeSqlFile('countries.sql', 'countries'); console.timeEnd(' ⏱️ Countries'); + } catch (error) { + console.error('❌ Base location seeding failed:', error.message); + throw error; + } +} + +/** + * Seed detailed location data (States, Cities) + * This is slower/heavy and should be run after Users/Companies are ready + */ +export async function seedDetailedLocations() { + console.log('🌍 Seeding detailed location data (States -> Cities)...'); + + try { // 4. States (~5400 records) console.log('4️⃣ Seeding States...'); console.time(' ⏱️ States'); @@ -491,6 +508,23 @@ export async function seedLocationData() { await executeGzippedSqlFile('cities.sql.gz', 'cities'); console.timeEnd(' ⏱️ Cities (Bulk Insert)'); + } catch (error) { + console.error('❌ Detailed location seeding failed:', error.message); + throw error; + } +} + +/** + * Seed all location data from SQL dumps (Legacy wrapper) + */ +export async function seedLocationData() { + console.log('🌍 Seeding comprehensive location data...'); + console.log(' Source: GeoDB Cities (https://github.com/dr5hn/countries-states-cities-database)\n'); + + try { + await seedBaseLocations(); + await seedDetailedLocations(); + console.log('\n ✅ Location data seeding complete!'); // Print counts