init
This commit is contained in:
+129
@@ -0,0 +1,129 @@
|
||||
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();
|
||||
});
|
||||
Reference in New Issue
Block a user