initial version of the app
This commit is contained in:
@@ -0,0 +1,203 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user