gohorsejobs/seeder-api/src/index.js

211 lines
8.4 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { pool, testConnection, closePool } from './db.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';
import { seedApplications } from './seeders/applications.js';
import { seedAcmeCorp, seedWileECoyote } from './seeders/acme.js';
import { seedFictionalCompanies } from './seeders/fictional-companies.js';
import { seedEpicCompanies } from './seeders/epic-companies.js';
import { seedNotifications } from './seeders/notifications.js';
async function resetDatabase() {
console.log('🗑️ Resetting database...');
try {
// Dynamic drop: Fetch all tables in public schema and drop them
// This avoids "must be owner of schema public" error by operating on tables directly
console.log('🔍 Finding tables to drop...');
const tablesResult = await pool.query(`
SELECT tablename
FROM pg_tables
WHERE schemaname = 'public'
`);
if (tablesResult.rows.length > 0) {
const tables = tablesResult.rows.map(row => row.tablename);
console.log(`🔥 Dropping ${tables.length} tables: ${tables.join(', ')}`);
// Construct a single DROP statement for all tables (CASCADE handles dependencies)
const tableList = tables.map(t => `"${t}"`).join(', ');
await pool.query(`DROP TABLE IF EXISTS ${tableList} CASCADE`);
console.log('✅ All public tables dropped successfully.');
} else {
console.log(' No tables found to drop IN public schema.');
}
} catch (error) {
console.error('❌ Error resetting database:', error.message);
throw error;
}
}
async function runMigrations() {
console.log('📦 Running migrations...');
// This would typically read from migration files
// For now, we'll just log that migrations should be run separately
const host = process.env.DB_HOST || '172.28.22.171';
const user = process.env.DB_USER || 'usuario';
const db = process.env.DB_NAME || 'todaijobs';
console.log(` Run migrations via: psql -h ${host} -U ${user} -d ${db} -f migrations/*.sql`);
}
async function seedDatabase() {
console.log('🌱 Starting database seeding...\n');
try {
// Test connection first
const connected = await testConnection();
if (!connected) {
throw new Error('Could not connect to database');
}
console.log('');
// Seed in order (respecting foreign key dependencies)
// 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
await seedFictionalCompanies(); // 🎬 Stark Industries, Los Pollos, Springfield Nuclear
await seedEpicCompanies(); // 🌟 BNL, Cyberdyne, Wonka, Wayne, Oceanic, InGen, Bubba Gump, Umbrella, Sprawl-Mart
await seedApplications(); // 📝 Applications from candidates
await seedNotifications(); // 🔔 Notifications for dashboard
console.log('\n✅ Database seeding completed successfully!');
console.log('\n📊 Summary:');
console.log(' - 🌍 Location data (continents, subregions, countries, states, cities)');
console.log(' - 1 SuperAdmin');
console.log(' - 43 Companies (30 + 13 fictícias)');
console.log(' - 1129+ Jobs total');
console.log(' - 🏭 ACME Corp: 69 vagas Looney Tunes');
console.log(' - 🦸 Stark Industries: 8 vagas Marvel');
console.log(' - 🐔 Los Pollos Hermanos: 4 vagas Breaking Bad');
console.log(' - ☢️ Springfield Nuclear: 4 vagas Simpsons');
console.log(' - 🛏️ Buy n Large: 3 vagas Wall-E');
console.log(' - 🤖 Cyberdyne Systems: 3 vagas Terminator');
console.log(' - 🍫 Wonka Industries: 3 vagas Chocolate Factory');
console.log(' - 🦇 Wayne Enterprises: 3 vagas Batman');
console.log(' - ✈️ Oceanic Airlines: 3 vagas Lost');
console.log(' - 🦖 InGen Jurassic Park: 3 vagas Jurassic Park');
console.log(' - 🦐 Bubba Gump Shrimp: 3 vagas Forrest Gump');
console.log(' - ☣️ Umbrella Corporation: 3 vagas Resident Evil');
console.log(' - 🏪 Sprawl-Mart: 30 vagas Dystopia');
console.log(' - 🐺 Wile E. Coyote: wile_e_coyote / MeepMeep@123');
console.log(' - Work modes: onsite, hybrid, remote');
console.log(' - 20 Applications');
} catch (error) {
console.error('\n❌ Seeding failed:', error.message);
console.error(error);
} finally {
await closePool();
}
}
// Lite version (skips cities for faster seeding)
async function seedDatabaseLite() {
console.log('🌱 Starting database seeding (LITE - no cities)...\n');
console.log('🌶️ PASSWORD_PEPPER:', process.env.PASSWORD_PEPPER ? `"${process.env.PASSWORD_PEPPER}"` : '(not set)');
try {
const connected = await testConnection();
if (!connected) {
throw new Error('Could not connect to database');
}
console.log('');
// Seed in order (respecting foreign key dependencies)
await seedLocationDataLite(); // ⚡ Fast mode - no cities
await seedCompanies();
await seedUsers();
await seedJobs();
await seedAcmeCorp();
await seedWileECoyote();
await seedFictionalCompanies();
await seedEpicCompanies();
await seedApplications();
await seedNotifications();
console.log('\n✅ Database seeding (LITE) completed successfully!');
console.log(' ⚡ Cities skipped for faster seeding');
} catch (error) {
console.error('\n❌ Seeding failed:', error.message);
console.error(error);
} finally {
await closePool();
}
}
// Ultra-fast version (skips ALL location data)
async function seedDatabaseNoLocations() {
console.log('🌱 Starting database seeding (NO LOCATIONS)...\n');
console.log('🌶️ PASSWORD_PEPPER:', process.env.PASSWORD_PEPPER ? `"${process.env.PASSWORD_PEPPER}"` : '(not set)');
console.log('⏭️ Skipping ALL location data (continents, countries, states, cities)\n');
try {
const connected = await testConnection();
if (!connected) {
throw new Error('Could not connect to database');
}
console.log('');
// Skip location data entirely - just seed business data
await seedCompanies();
await seedUsers();
await seedJobs();
await seedAcmeCorp();
await seedWileECoyote();
await seedFictionalCompanies();
await seedEpicCompanies();
await seedApplications();
await seedNotifications();
console.log('\n✅ Database seeding (NO LOCATIONS) completed successfully!');
console.log(' ⏭️ All location data skipped (continents, countries, states, cities)');
} catch (error) {
console.error('\n❌ Seeding failed:', error.message);
console.error(error);
} finally {
await closePool();
}
}
// Main execution
const shouldReset = process.argv.includes('--reset');
const shouldLite = process.argv.includes('--lite');
const shouldSkipLocations = process.argv.includes('--skip-locations');
(async () => {
if (shouldReset) {
await resetDatabase();
console.log('✅ Database reset complete. Run migrations before seeding.');
} else if (shouldSkipLocations) {
await seedDatabaseNoLocations();
} else if (shouldLite) {
await seedDatabaseLite();
} else {
await seedDatabase();
}
})();