130 lines
3.9 KiB
JavaScript
130 lines
3.9 KiB
JavaScript
const { PrismaClient } = require('@prisma/client');
|
|
const { PrismaMariaDb } = require('@prisma/adapter-mariadb');
|
|
const bcrypt = require('bcryptjs');
|
|
const dotenv = require('dotenv');
|
|
|
|
dotenv.config({ override: true });
|
|
|
|
const adapter = new PrismaMariaDb({
|
|
host: process.env.DB_HOST,
|
|
port: Number(process.env.DB_PORT),
|
|
user: process.env.DB_USERNAME,
|
|
password: process.env.DB_PASSWORD,
|
|
database: process.env.DB_NAME,
|
|
connectionLimit: 5,
|
|
});
|
|
|
|
const prisma = new PrismaClient({ adapter });
|
|
|
|
async function main() {
|
|
console.log('Seeding database...');
|
|
|
|
// 1. Clear existing data
|
|
await prisma.bookingSeat.deleteMany({});
|
|
await prisma.booking.deleteMany({});
|
|
await prisma.schedule.deleteMany({});
|
|
await prisma.route.deleteMany({});
|
|
await prisma.user.deleteMany({});
|
|
|
|
console.log('Cleared existing data.');
|
|
|
|
// 2. Create Users
|
|
const adminEmail = process.env.ADMIN_EMAIL || 'admin@travel.com';
|
|
const adminPass = process.env.ADMIN_PASSWORD || 'admin123';
|
|
const hashedPasswordAdmin = await bcrypt.hash(adminPass, 10);
|
|
const admin = await prisma.user.create({
|
|
data: {
|
|
email: adminEmail,
|
|
password: hashedPasswordAdmin,
|
|
name: 'Super Admin',
|
|
phone: '081234567890',
|
|
role: 'ADMIN',
|
|
},
|
|
});
|
|
|
|
const hashedPasswordUser = await bcrypt.hash('user123', 10);
|
|
const user = await prisma.user.create({
|
|
data: {
|
|
email: 'user@travel.com',
|
|
password: hashedPasswordUser,
|
|
name: 'John Doe',
|
|
phone: '089876543210',
|
|
role: 'USER',
|
|
},
|
|
});
|
|
|
|
console.log('Created users:', { admin: admin.email, user: user.email });
|
|
|
|
// 3. Create Routes
|
|
const routesData = [
|
|
{ departureCity: 'Jakarta', arrivalCity: 'Bandung', durationMinutes: 180, basePrice: 150000 },
|
|
{ departureCity: 'Bandung', arrivalCity: 'Jakarta', durationMinutes: 180, basePrice: 150000 },
|
|
{ departureCity: 'Jakarta', arrivalCity: 'Bogor', durationMinutes: 90, basePrice: 75000 },
|
|
{ departureCity: 'Bogor', arrivalCity: 'Jakarta', durationMinutes: 90, basePrice: 75000 },
|
|
];
|
|
|
|
const routes = [];
|
|
for (const r of routesData) {
|
|
const route = await prisma.route.create({ data: r });
|
|
routes.push(route);
|
|
}
|
|
console.log(`Created ${routes.length} routes.`);
|
|
|
|
// 4. Create Schedules for the next 3 days
|
|
const today = new Date();
|
|
let schedulesCreated = 0;
|
|
|
|
for (let dayOffset = 0; dayOffset < 3; dayOffset++) {
|
|
const targetDate = new Date(today);
|
|
targetDate.setDate(today.getDate() + dayOffset);
|
|
const dateStr = targetDate.toISOString().split('T')[0];
|
|
|
|
for (const route of routes) {
|
|
// Create some schedules per route
|
|
let hours = [];
|
|
if (route.departureCity === 'Jakarta' && route.arrivalCity === 'Bandung') {
|
|
hours = [7, 10, 13, 16, 19];
|
|
} else if (route.departureCity === 'Bandung' && route.arrivalCity === 'Jakarta') {
|
|
hours = [7, 10, 13, 16, 19];
|
|
} else {
|
|
hours = [8, 12, 16];
|
|
}
|
|
|
|
for (let i = 0; i < hours.length; i++) {
|
|
const hour = hours[i];
|
|
const departureTime = new Date(`${dateStr}T${String(hour).padStart(2, '0')}:00:00.000Z`);
|
|
const arrivalTime = new Date(departureTime.getTime() + route.durationMinutes * 60 * 1000);
|
|
|
|
// Alternate vehicle types
|
|
const isHiace = i % 2 === 0;
|
|
const vehicleType = isHiace ? 'Toyota HiAce' : 'Executive Bus';
|
|
const capacity = isHiace ? 10 : 30;
|
|
const price = isHiace ? Number(route.basePrice) : Number(route.basePrice) - 20000;
|
|
|
|
await prisma.schedule.create({
|
|
data: {
|
|
routeId: route.id,
|
|
departureTime,
|
|
arrivalTime,
|
|
vehicleType,
|
|
capacity,
|
|
price,
|
|
},
|
|
});
|
|
schedulesCreated++;
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log(`Seeded ${schedulesCreated} schedules successfully.`);
|
|
}
|
|
|
|
main()
|
|
.catch((e) => {
|
|
console.error(e);
|
|
process.exit(1);
|
|
})
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
});
|