import sqlite3 from 'sqlite3'; import { promisify } from 'util'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const dbPath = path.join(__dirname, 'database.sqlite'); const db = new sqlite3.Database(dbPath); // Custom wrapper to get lastID from db.run function dbRun(sql, params = []) { return new Promise((resolve, reject) => { db.run(sql, params, function(err) { if (err) reject(err); else resolve({ lastID: this.lastID, changes: this.changes }); }); }); } const dbGet = promisify(db.get.bind(db)); // Initialize database tables async function initDatabase() { try { // Create pharmacies table await dbRun(` CREATE TABLE IF NOT EXISTS pharmacies ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, address TEXT NOT NULL, phone TEXT, latitude REAL, longitude REAL ) `); // Create medicines table await dbRun(` CREATE TABLE IF NOT EXISTS medicines ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, active_ingredient TEXT, dosage TEXT, form TEXT ) `); // Create junction table for pharmacy-medicine relationships // Ahora usa nregistro (número de registro de CIMA) en lugar de medicine_id local await dbRun(` CREATE TABLE IF NOT EXISTS pharmacy_medicines ( id INTEGER PRIMARY KEY AUTOINCREMENT, pharmacy_id INTEGER NOT NULL, medicine_nregistro TEXT NOT NULL, medicine_name TEXT, price REAL, stock INTEGER DEFAULT 0, FOREIGN KEY (pharmacy_id) REFERENCES pharmacies(id), UNIQUE(pharmacy_id, medicine_nregistro) ) `); // Create indexes for better search performance await dbRun(`CREATE INDEX IF NOT EXISTS idx_medicine_name ON medicines(name)`); await dbRun(`CREATE INDEX IF NOT EXISTS idx_pharmacy_medicine ON pharmacy_medicines(medicine_nregistro)`); console.log('Database tables initialized'); } catch (error) { console.error('Error initializing database:', error); throw error; } } // Sample data const pharmacies = [ { name: 'Farmacia Central', address: 'Av. Principal 123, Ciudad', phone: '+34 123 456 789', lat: 40.4168, lng: -3.7038 }, { name: 'Farmacia San José', address: 'Calle Mayor 45, Ciudad', phone: '+34 987 654 321', lat: 40.4178, lng: -3.7048 }, { name: 'Farmacia del Sol', address: 'Plaza del Sol 12, Ciudad', phone: '+34 555 123 456', lat: 40.4158, lng: -3.7028 }, { name: 'Farmacia Salud', address: 'Calle Salud 78, Ciudad', phone: '+34 666 789 012', lat: 40.4188, lng: -3.7058 }, { name: 'Farmacia 24h', address: 'Av. Libertad 234, Ciudad', phone: '+34 777 345 678', lat: 40.4148, lng: -3.7018 }, ]; const medicines = [ { name: 'Paracetamol 500mg', active_ingredient: 'Paracetamol', dosage: '500mg', form: 'Tabletas' }, { name: 'Ibuprofeno 600mg', active_ingredient: 'Ibuprofeno', dosage: '600mg', form: 'Tabletas' }, { name: 'Aspirina 100mg', active_ingredient: 'Ácido Acetilsalicílico', dosage: '100mg', form: 'Tabletas' }, { name: 'Amoxicilina 500mg', active_ingredient: 'Amoxicilina', dosage: '500mg', form: 'Cápsulas' }, { name: 'Omeprazol 20mg', active_ingredient: 'Omeprazol', dosage: '20mg', form: 'Cápsulas' }, { name: 'Loratadina 10mg', active_ingredient: 'Loratadina', dosage: '10mg', form: 'Tabletas' }, { name: 'Diclofenaco 50mg', active_ingredient: 'Diclofenaco', dosage: '50mg', form: 'Tabletas' }, { name: 'Metformina 850mg', active_ingredient: 'Metformina', dosage: '850mg', form: 'Tabletas' }, { name: 'Atorvastatina 20mg', active_ingredient: 'Atorvastatina', dosage: '20mg', form: 'Tabletas' }, { name: 'Losartán 50mg', active_ingredient: 'Losartán', dosage: '50mg', form: 'Tabletas' }, ]; async function seedDatabase() { try { console.log('Starting database seeding...'); // Initialize database tables first await initDatabase(); // Clear existing data await dbRun('DELETE FROM pharmacy_medicines'); await dbRun('DELETE FROM medicines'); await dbRun('DELETE FROM pharmacies'); // Insert pharmacies const pharmacyIds = []; for (const pharmacy of pharmacies) { const result = await dbRun( 'INSERT INTO pharmacies (name, address, phone, latitude, longitude) VALUES (?, ?, ?, ?, ?)', [pharmacy.name, pharmacy.address, pharmacy.phone, pharmacy.lat, pharmacy.lng] ); pharmacyIds.push(result.lastID); } console.log(`Inserted ${pharmacyIds.length} pharmacies`); // Insert medicines const medicineIds = []; for (const medicine of medicines) { const result = await dbRun( 'INSERT INTO medicines (name, active_ingredient, dosage, form) VALUES (?, ?, ?, ?)', [medicine.name, medicine.active_ingredient, medicine.dosage, medicine.form] ); medicineIds.push(result.lastID); } console.log(`Inserted ${medicineIds.length} medicines`); // Create pharmacy-medicine relationships // Each medicine is available in 2-4 random pharmacies with random prices let relationshipCount = 0; for (let i = 0; i < medicineIds.length; i++) { const medicineId = medicineIds[i]; const numPharmacies = Math.floor(Math.random() * 3) + 2; // 2-4 pharmacies const selectedPharmacies = new Set(); while (selectedPharmacies.size < numPharmacies) { selectedPharmacies.add(Math.floor(Math.random() * pharmacyIds.length)); } for (const pharmacyIndex of selectedPharmacies) { const pharmacyId = pharmacyIds[pharmacyIndex]; const price = (Math.random() * 20 + 5).toFixed(2); // Random price between 5-25 const stock = Math.floor(Math.random() * 50) + 10; // Random stock 10-60 // NOTA: Como ahora usamos CIMA API, este seed solo crea ejemplos // En producción, deberías vincular usando nregistros reales de CIMA const medicine = medicines[i]; await dbRun( 'INSERT INTO pharmacy_medicines (pharmacy_id, medicine_nregistro, medicine_name, price, stock) VALUES (?, ?, ?, ?, ?)', [pharmacyId, `EXAMPLE_${medicineId}`, medicine.name, price, stock] ); relationshipCount++; } } console.log(`Created ${relationshipCount} pharmacy-medicine relationships`); console.log('⚠️ NOTA: Los medicamentos de ejemplo usan IDs ficticios.'); console.log('Database seeding completed successfully!'); } catch (error) { console.error('Error seeding database:', error); } finally { db.close(); } } seedDatabase();