124 lines
4.7 KiB
TypeScript
124 lines
4.7 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
|
import { PrismaPg } from '@prisma/adapter-pg';
|
|
import pg from 'pg';
|
|
import bcrypt from 'bcryptjs';
|
|
import dotenv from 'dotenv';
|
|
|
|
dotenv.config({ path: '.env.local' });
|
|
dotenv.config(); // Fallback to .env for other vars if needed
|
|
|
|
const connectionString = process.env.DATABASE_URL!;
|
|
console.log(`Connecting to: ${connectionString.split('@')[1] ? '***@' + connectionString.split('@')[1] : connectionString}`);
|
|
const pool = new pg.Pool({ connectionString });
|
|
const adapter = new PrismaPg(pool);
|
|
const prisma = new PrismaClient({ adapter });
|
|
|
|
const CATEGORIES = [
|
|
'Technologie & IT', 'Restauration & Alimentation', 'Mode & Textile', 'Artisanat & Déco',
|
|
'Santé & Bien-être', 'Éducation & Formation', 'Services aux entreprises', 'Construction & BTP',
|
|
'Agriculture & Agrobusiness', 'Tourisme & Transport'
|
|
];
|
|
|
|
const CITIES = ['Abidjan', 'Dakar', 'Lagos', 'Douala', 'Kinshasa', 'Cotonou', 'Lomé', 'Paris', 'Lyon', 'Bruxelles'];
|
|
|
|
const NAMES = [
|
|
'Moussa Diarra', 'Fatou Sow', 'Bakary Koné', 'Awa Traoré', 'Koffi Adjoumani',
|
|
'Cheick Tidiane', 'Bintu Camara', 'Ousmane Diallo', 'Yasmine Touré', 'Ibrahim Sy',
|
|
'Mariam Keita', 'Lamine Ndiaye', 'Aminata Faye', 'Idrissa Gueye', 'Sékou Condé',
|
|
'Zainab Bello', 'Kwame Nkrumah', 'Chidi Okafor', 'Adama Barrow', 'Fatimata Sylla',
|
|
'Jean-Pierre Mbeki', 'Grace Akoto', 'Samuel Eto\'o', 'Didier Drogba', 'Blaise Diagne',
|
|
'Léopold Senghor', 'Thomas Sankara', 'Miriam Makeba', 'Angélique Kidjo', 'Alpha Blondy'
|
|
];
|
|
|
|
const BIZ_NAMES = [
|
|
'Digital Africa', 'Saveurs du Sahel', 'Wax & Modernity', 'Artisans du Delta', 'Zenith Wellness',
|
|
'Afro-EdTech', 'Bizi Solutions', 'Sahara Build', 'Agro-Innov', 'Trans-Africa Express',
|
|
'Cyber-Sénégal', 'Miam-Miam Abidjan', 'Élégance Bamako', 'Poterie de Kati', 'Savon de Guinée',
|
|
'Code Academy', 'Compta Facile', 'Solar Power West', 'Cocoa Direct', 'Taxi-Plus',
|
|
'Cloud Kinshasa', 'Épices de Douala', 'Tissage d\'Accra', 'Bambou Design', 'Bio-Cosmetiques',
|
|
'E-Learning Africa', 'Logistique 225', 'Refuge Solaire', 'Ananas Export', 'Linga-Linga Travel'
|
|
];
|
|
|
|
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
|
|
|
async function seed() {
|
|
console.log('--- Démarrage du seeding robuste (30 entrepreneurs) ---');
|
|
|
|
const hashedPassword = await bcrypt.hash('afrohub2025', 10);
|
|
let successCount = 0;
|
|
|
|
for (let i = 0; i < 30; i++) {
|
|
const name = NAMES[i % NAMES.length] + (i > 29 ? ` ${i}` : '');
|
|
const email = `entrepreneur${i + 1}@afrohub-test.com`;
|
|
const bizName = BIZ_NAMES[i % BIZ_NAMES.length];
|
|
const category = CATEGORIES[i % CATEGORIES.length];
|
|
const location = CITIES[i % CITIES.length];
|
|
const slug = bizName.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9-]/g, '') + `-${i + 1}`;
|
|
|
|
try {
|
|
// Create or Update User
|
|
const user = await prisma.user.upsert({
|
|
where: { email },
|
|
update: { role: 'ENTREPRENEUR' },
|
|
create: {
|
|
name,
|
|
email,
|
|
password: hashedPassword,
|
|
role: 'ENTREPRENEUR',
|
|
location,
|
|
avatar: `https://i.pravatar.cc/150?u=${email}`
|
|
}
|
|
});
|
|
|
|
// Create or Update Business
|
|
await prisma.business.upsert({
|
|
where: { ownerId: user.id },
|
|
update: {
|
|
isActive: true,
|
|
verified: true,
|
|
isFeatured: i < 8
|
|
},
|
|
create: {
|
|
name: bizName,
|
|
category,
|
|
location,
|
|
description: `Société leader dans le domaine ${category}. Basés à ${location}, nous œuvrons pour le rayonnement de l'expertise africaine.`,
|
|
logoUrl: `https://picsum.photos/200/200?random=${i + 200}`,
|
|
contactEmail: email,
|
|
contactPhone: `+225 00 ${i}${i} ${i}${i} ${i}${i}`,
|
|
slug,
|
|
isActive: true,
|
|
verified: true,
|
|
isFeatured: i < 8,
|
|
ownerId: user.id,
|
|
tags: [category.split(' ')[0], 'Expertise', 'Continent'],
|
|
viewCount: Math.floor(Math.random() * 500)
|
|
}
|
|
});
|
|
|
|
successCount++;
|
|
process.stdout.write(`\rProgress: ${successCount}/30`);
|
|
|
|
await wait(100);
|
|
} catch (e: any) {
|
|
console.error(`\n❌ Échec pour ${email}:`);
|
|
console.error('Message:', e.message);
|
|
if (e.code) console.error('Code:', e.code);
|
|
if (e.meta) console.error('Meta:', e.meta);
|
|
await wait(1000);
|
|
}
|
|
}
|
|
|
|
console.log(`\n\n✅ Mission accomplie : ${successCount}/30 boutiques actives.`);
|
|
console.log(`Identifiants : entrepreneurX@afrohub-test.com / afrohub2025`);
|
|
|
|
await prisma.$disconnect();
|
|
await pool.end();
|
|
}
|
|
|
|
seed().catch(async (err) => {
|
|
console.error("Erreur fatale lors du seeding:", err);
|
|
await pool.end();
|
|
process.exit(1);
|
|
});
|