2025-04-24 12:44:46 -04:00

182 lines
6.1 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const { sequelize, User, GymClass } = require('./models');
const dotenv = require('dotenv');
const bcrypt = require('bcryptjs');
// Load env vars
dotenv.config();
// Copy image files from Java project to uploads folder
const copyImages = async () => {
const sourceDir = path.join(__dirname, '..', 'gym-backend', 'uploads');
const destDir = path.join(__dirname, 'uploads');
// Create uploads directory if it doesn't exist
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir, { recursive: true });
}
// Check if source directory exists
if (fs.existsSync(sourceDir)) {
// Get all image files from source directory
const imageFiles = fs.readdirSync(sourceDir).filter(file =>
file.endsWith('.png') || file.endsWith('.jpg') || file.endsWith('.jpeg') || file.endsWith('.gif')
);
// Copy each file to destination
imageFiles.forEach(file => {
fs.copyFileSync(path.join(sourceDir, file), path.join(destDir, file));
console.log(`Copied ${file} to uploads folder`);
});
} else {
console.log('Source directory not found, skipping image copy');
}
};
// Create default images if they don't exist
const createDefaultImages = async () => {
const defaultImages = {
'default-avatar.jpg': 'Default user avatar image',
'default-class.jpg': 'Default class image',
'yoga.png': 'Yoga class image',
'spinning.png': 'Spinning class image',
'pilates.png': 'Pilates class image',
'zumba.png': 'Zumba class image',
'crossfit.png': 'CrossFit class image'
};
const uploadsDir = path.join(__dirname, 'uploads');
// Create uploads directory if it doesn't exist
if (!fs.existsSync(uploadsDir)) {
fs.mkdirSync(uploadsDir, { recursive: true });
}
// Create each default image if it doesn't exist
Object.entries(defaultImages).forEach(([filename, content]) => {
const filePath = path.join(uploadsDir, filename);
if (!fs.existsSync(filePath)) {
fs.writeFileSync(filePath, content);
console.log(`Created placeholder for ${filename}`);
}
});
};
// Import data into DB
const importData = async () => {
try {
// Sync database models without force
await sequelize.sync();
console.log('Database connected');
// Copy image files from Java project and create defaults
await copyImages();
await createDefaultImages();
// Check if demo user already exists
const existingUser = await User.findOne({ where: { email: 'usuario@ejemplo.com' } });
// Create demo user only if it doesn't exist
let demoUser;
if (!existingUser) {
// Hash password
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash('password123', salt);
demoUser = await User.create({
name: 'Usuario Demo',
email: 'usuario@ejemplo.com',
password: hashedPassword,
profilePicUrl: '/uploads/default-avatar.jpg',
notificationsEnabled: true
});
console.log('Demo user created with ID:', demoUser.id);
} else {
console.log('Demo user already exists, skipping creation');
demoUser = existingUser;
}
// Create demo classes only if they don't exist
const existingClasses = await GymClass.count();
if (existingClasses === 0) {
const currentDate = new Date();
const classes = [
{
name: 'Yoga',
description: 'Clase de yoga para todos los niveles',
instructor: 'María López',
startTime: new Date(currentDate.getTime() + 24 * 60 * 60 * 1000 + 8 * 60 * 60 * 1000),
endTime: new Date(currentDate.getTime() + 24 * 60 * 60 * 1000 + 9 * 60 * 60 * 1000),
maxCapacity: 15,
currentBookings: 8,
category: 'Mente y Cuerpo',
imageUrl: '/uploads/yoga.png'
},
{
name: 'Spinning',
description: 'Clase de alta intensidad de ciclismo estático',
instructor: 'Juan Pérez',
startTime: new Date(currentDate.getTime() + 24 * 60 * 60 * 1000 + 10 * 60 * 60 * 1000),
endTime: new Date(currentDate.getTime() + 24 * 60 * 60 * 1000 + 11 * 60 * 60 * 1000),
maxCapacity: 20,
currentBookings: 15,
category: 'Cardiovascular',
imageUrl: '/uploads/spinning.png'
},
{
name: 'Pilates',
description: 'Fortalecimiento de core y flexibilidad',
instructor: 'Ana García',
startTime: new Date(currentDate.getTime() + 24 * 60 * 60 * 1000 + 16 * 60 * 60 * 1000),
endTime: new Date(currentDate.getTime() + 24 * 60 * 60 * 1000 + 17 * 60 * 60 * 1000),
maxCapacity: 12,
currentBookings: 5,
category: 'Mente y Cuerpo',
imageUrl: '/uploads/pilates.png'
},
{
name: 'Zumba',
description: 'Baile y ejercicio cardiovascular',
instructor: 'Carlos Martínez',
startTime: new Date(currentDate.getTime() + 48 * 60 * 60 * 1000 + 18 * 60 * 60 * 1000),
endTime: new Date(currentDate.getTime() + 48 * 60 * 60 * 1000 + 19 * 60 * 60 * 1000),
maxCapacity: 25,
currentBookings: 18,
category: 'Baile',
imageUrl: '/uploads/zumba.png'
},
{
name: 'CrossFit',
description: 'Entrenamiento funcional de alta intensidad',
instructor: 'Roberto Sánchez',
startTime: new Date(currentDate.getTime() + 48 * 60 * 60 * 1000 + 9 * 60 * 60 * 1000),
endTime: new Date(currentDate.getTime() + 48 * 60 * 60 * 1000 + 10 * 60 * 60 * 1000),
maxCapacity: 15,
currentBookings: 12,
category: 'Fuerza',
imageUrl: '/uploads/crossfit.png'
}
];
await GymClass.bulkCreate(classes);
console.log(`${classes.length} gym classes created`);
} else {
console.log(`Classes already exist, skipping class creation`);
}
console.log('Data import process completed successfully!');
process.exit();
} catch (err) {
console.error(err);
process.exit(1);
}
};
importData();