Files
vip-coordinator/backend/prisma/seed.ts
kyle 868f7efc23
Some checks failed
CI/CD Pipeline / Backend Tests (push) Has been cancelled
CI/CD Pipeline / Frontend Tests (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
Major Enhancement: NestJS Migration + CASL Authorization + Error Handling
Complete rewrite from Express to NestJS with enterprise-grade features:

## Backend Improvements
- Migrated from Express to NestJS 11.0.1 with TypeScript
- Implemented Prisma ORM 7.3.0 for type-safe database access
- Added CASL authorization system replacing role-based guards
- Created global exception filters with structured logging
- Implemented Auth0 JWT authentication with Passport.js
- Added vehicle management with conflict detection
- Enhanced event scheduling with driver/vehicle assignment
- Comprehensive error handling and logging

## Frontend Improvements
- Upgraded to React 19.2.0 with Vite 7.2.4
- Implemented CASL-based permission system
- Added AbilityContext for declarative permissions
- Created ErrorHandler utility for consistent error messages
- Enhanced API client with request/response logging
- Added War Room (Command Center) dashboard
- Created VIP Schedule view with complete itineraries
- Implemented Vehicle Management UI
- Added mock data generators for testing (288 events across 20 VIPs)

## New Features
- Vehicle fleet management (types, capacity, status tracking)
- Complete 3-day Jamboree schedule generation
- Individual VIP schedule pages with PDF export (planned)
- Real-time War Room dashboard with auto-refresh
- Permission-based navigation filtering
- First user auto-approval as administrator

## Documentation
- Created CASL_AUTHORIZATION.md (comprehensive guide)
- Created ERROR_HANDLING.md (error handling patterns)
- Updated CLAUDE.md with new architecture
- Added migration guides and best practices

## Technical Debt Resolved
- Removed custom authentication in favor of Auth0
- Replaced role checks with CASL abilities
- Standardized error responses across API
- Implemented proper TypeScript typing
- Added comprehensive logging

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-31 08:50:25 +01:00

166 lines
4.5 KiB
TypeScript

import { PrismaClient, Role, Department, ArrivalMode, EventType, EventStatus } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
console.log('🌱 Seeding database...');
// Clean up existing data (careful in production!)
await prisma.scheduleEvent.deleteMany({});
await prisma.flight.deleteMany({});
await prisma.driver.deleteMany({});
await prisma.vIP.deleteMany({});
await prisma.user.deleteMany({});
console.log('✅ Cleared existing data');
// Create sample users
const admin = await prisma.user.create({
data: {
auth0Id: 'auth0|admin-sample-id',
email: 'admin@example.com',
name: 'Admin User',
role: Role.ADMINISTRATOR,
isApproved: true,
},
});
const coordinator = await prisma.user.create({
data: {
auth0Id: 'auth0|coordinator-sample-id',
email: 'coordinator@example.com',
name: 'Coordinator User',
role: Role.COORDINATOR,
isApproved: true,
},
});
console.log('✅ Created sample users');
// Create sample drivers
const driver1 = await prisma.driver.create({
data: {
name: 'John Smith',
phone: '+1 (555) 123-4567',
department: Department.OFFICE_OF_DEVELOPMENT,
},
});
const driver2 = await prisma.driver.create({
data: {
name: 'Jane Doe',
phone: '+1 (555) 987-6543',
department: Department.ADMIN,
},
});
console.log('✅ Created sample drivers');
// Create sample VIPs
const vip1 = await prisma.vIP.create({
data: {
name: 'Dr. Robert Johnson',
organization: 'Tech Corporation',
department: Department.OFFICE_OF_DEVELOPMENT,
arrivalMode: ArrivalMode.FLIGHT,
airportPickup: true,
venueTransport: true,
notes: 'Prefers window seat, dietary restriction: vegetarian',
flights: {
create: [
{
flightNumber: 'AA123',
flightDate: new Date('2026-02-15'),
segment: 1,
departureAirport: 'JFK',
arrivalAirport: 'LAX',
scheduledDeparture: new Date('2026-02-15T08:00:00'),
scheduledArrival: new Date('2026-02-15T11:30:00'),
status: 'scheduled',
},
],
},
},
});
const vip2 = await prisma.vIP.create({
data: {
name: 'Ms. Sarah Williams',
organization: 'Global Foundation',
department: Department.ADMIN,
arrivalMode: ArrivalMode.SELF_DRIVING,
expectedArrival: new Date('2026-02-16T14:00:00'),
airportPickup: false,
venueTransport: true,
notes: 'Bringing assistant',
},
});
console.log('✅ Created sample VIPs');
// Create sample events
await prisma.scheduleEvent.create({
data: {
vipId: vip1.id,
title: 'Airport Pickup',
location: 'LAX Terminal 4',
startTime: new Date('2026-02-15T11:30:00'),
endTime: new Date('2026-02-15T12:30:00'),
description: 'Pick up Dr. Johnson from LAX',
type: EventType.TRANSPORT,
status: EventStatus.SCHEDULED,
driverId: driver1.id,
},
});
await prisma.scheduleEvent.create({
data: {
vipId: vip1.id,
title: 'Welcome Dinner',
location: 'Grand Hotel Restaurant',
startTime: new Date('2026-02-15T19:00:00'),
endTime: new Date('2026-02-15T21:00:00'),
description: 'Welcome dinner with board members',
type: EventType.MEAL,
status: EventStatus.SCHEDULED,
driverId: driver2.id,
},
});
await prisma.scheduleEvent.create({
data: {
vipId: vip2.id,
title: 'Conference Transport',
location: 'Convention Center',
startTime: new Date('2026-02-16T14:30:00'),
endTime: new Date('2026-02-16T15:00:00'),
description: 'Transport to conference venue',
type: EventType.TRANSPORT,
status: EventStatus.SCHEDULED,
driverId: driver1.id,
},
});
console.log('✅ Created sample events');
console.log('\n🎉 Database seeded successfully!');
console.log('\nSample Users:');
console.log('- Admin: admin@example.com');
console.log('- Coordinator: coordinator@example.com');
console.log('\nSample VIPs:');
console.log('- Dr. Robert Johnson (Flight arrival)');
console.log('- Ms. Sarah Williams (Self-driving)');
console.log('\nSample Drivers:');
console.log('- John Smith');
console.log('- Jane Doe');
}
main()
.catch((e) => {
console.error('❌ Error seeding database:', e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});