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
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>
166 lines
4.5 KiB
TypeScript
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();
|
|
});
|