import { db } from '../lib/db'; import { users, courts as courtsTable, bookings, announcements, activityLogs } from '../lib/db/schema'; import { randomUUID } from 'crypto'; import bcrypt from 'bcryptjs'; async function seedData() { try { console.log('Starting data seeding...'); // Get existing users to add sample bookings and activities const existingUsers = await db.select().from(users); if (existingUsers.length < 2) { console.log('Not enough users found. Please run the reset-database script first.'); return; } const adminUser = existingUsers.find((u) => u.role === 'admin'); const regularUser = existingUsers.find((u) => u.role === 'user'); const courts = await db.select().from(courtsTable); if (!adminUser || !regularUser || courts.length === 0) { console.log('Missing admin user, regular user, or courts. Please run reset-database first.'); return; } const now = new Date(); const today = now.toISOString().split('T')[0]; const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000).toISOString().split('T')[0]; // Add some sample bookings console.log('Creating sample bookings...'); const sampleBookings = [ { id: randomUUID(), userId: regularUser.id, courtId: courts[0].id, date: today, startTime: '19:00', endTime: '20:00', status: 'active' as const, notes: 'Regular evening practice session', createdAt: new Date(now.getTime() - 2 * 60 * 60 * 1000), // 2 hours ago updatedAt: new Date(now.getTime() - 2 * 60 * 60 * 1000), }, { id: randomUUID(), userId: regularUser.id, courtId: courts[1] ? courts[1].id : courts[0].id, date: tomorrow, startTime: '20:00', endTime: '21:00', status: 'active' as const, notes: 'Tournament preparation', createdAt: new Date(now.getTime() - 1 * 60 * 60 * 1000), // 1 hour ago updatedAt: new Date(now.getTime() - 1 * 60 * 60 * 1000), }, ]; await db.insert(bookings).values(sampleBookings); // Add sample activity logs console.log('Creating sample activity logs...'); const sampleLogs = [ { id: randomUUID(), userId: adminUser.id, action: 'login', entityType: 'user', entityId: adminUser.id, details: JSON.stringify({ email: adminUser.email, role: adminUser.role, loginMethod: 'password', }), ipAddress: '192.168.1.100', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: new Date(now.getTime() - 3 * 60 * 60 * 1000), // 3 hours ago }, { id: randomUUID(), userId: regularUser.id, action: 'create_booking', entityType: 'booking', entityId: sampleBookings[0].id, details: JSON.stringify({ courtId: courts[0].id, courtName: courts[0].name, date: today, startTime: '19:00', endTime: '20:00', }), ipAddress: '192.168.1.101', userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15', createdAt: new Date(now.getTime() - 2 * 60 * 60 * 1000), // 2 hours ago }, { id: randomUUID(), userId: regularUser.id, action: 'login', entityType: 'user', entityId: regularUser.id, details: JSON.stringify({ email: regularUser.email, role: regularUser.role, loginMethod: 'password', }), ipAddress: '192.168.1.101', userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15', createdAt: new Date(now.getTime() - 2.5 * 60 * 60 * 1000), // 2.5 hours ago }, { id: randomUUID(), userId: adminUser.id, action: 'create_announcement', entityType: 'announcement', entityId: null, details: JSON.stringify({ title: 'System Maintenance', priority: 'high', action: 'created_via_seed', }), ipAddress: '192.168.1.100', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: new Date(now.getTime() - 1 * 60 * 60 * 1000), // 1 hour ago }, { id: randomUUID(), userId: regularUser.id, action: 'create_booking', entityType: 'booking', entityId: sampleBookings[1].id, details: JSON.stringify({ courtId: courts[1] ? courts[1].id : courts[0].id, courtName: courts[1] ? courts[1].name : courts[0].name, date: tomorrow, startTime: '20:00', endTime: '21:00', }), ipAddress: '192.168.1.101', userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15', createdAt: new Date(now.getTime() - 1 * 60 * 60 * 1000), // 1 hour ago }, { id: randomUUID(), userId: adminUser.id, action: 'update_settings', entityType: 'settings', entityId: null, details: JSON.stringify({ changedSettings: ['booking_window_days', 'max_booking_duration_hours'], previousValues: { booking_window_days: '7', max_booking_duration_hours: '2' }, newValues: { booking_window_days: '14', max_booking_duration_hours: '3' }, }), ipAddress: '192.168.1.100', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: new Date(now.getTime() - 30 * 60 * 1000), // 30 minutes ago }, ]; await db.insert(activityLogs).values(sampleLogs); // Add more announcements for testing console.log('Creating additional announcements...'); const additionalAnnouncements = [ { id: randomUUID(), title: 'New Court Rules', content: 'Please remember to clean up after your sessions and respect the time limits.', isActive: true, priority: 'medium' as const, expiresAt: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000), // 1 week from now createdAt: new Date(now.getTime() - 4 * 60 * 60 * 1000), // 4 hours ago updatedAt: new Date(now.getTime() - 4 * 60 * 60 * 1000), }, { id: randomUUID(), title: 'Tournament Sign-ups Open', content: 'The annual table tennis tournament sign-ups are now open! Register by the end of this month.', isActive: true, priority: 'high' as const, expiresAt: new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000), // 30 days from now createdAt: new Date(now.getTime() - 24 * 60 * 60 * 1000), // 1 day ago updatedAt: new Date(now.getTime() - 24 * 60 * 60 * 1000), }, ]; await db.insert(announcements).values(additionalAnnouncements); console.log('Sample data seeding completed successfully!'); console.log(`Created: - ${sampleBookings.length} sample bookings - ${sampleLogs.length} activity logs - ${additionalAnnouncements.length} additional announcements`); } catch (error) { console.error('Error seeding data:', error); } } seedData();