204 lines
6.5 KiB
TypeScript
204 lines
6.5 KiB
TypeScript
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();
|