Routes now follow actual roads instead of cutting through buildings: - New OsrmService calls free OSRM Match API to snap GPS points to roads - Position history endpoint accepts ?matched=true for road-snapped geometry - Stats use OSRM road distance instead of Haversine crow-flies distance - Frontend shows solid blue polylines for matched routes, dashed for raw - Handles chunking (100 coord limit), rate limiting, graceful fallback - Distance badge shows accurate road miles on route trails Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
VIP Coordinator Backend
NestJS 10.x backend with Prisma ORM, Auth0 authentication, and PostgreSQL.
Quick Start
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env with your Auth0 credentials
# Start PostgreSQL (via Docker)
cd ..
docker-compose up -d postgres
# Generate Prisma Client
npx prisma generate
# Run database migrations
npx prisma migrate dev
# Seed sample data (optional)
npm run prisma:seed
# Start development server
npm run start:dev
API Endpoints
All endpoints are prefixed with /api/v1
Public Endpoints
GET /health- Health check
Authentication
GET /auth/profile- Get current user profile
Users (Admin only)
GET /users- List all usersGET /users/pending- List pending approval usersGET /users/:id- Get user by IDPATCH /users/:id- Update userPATCH /users/:id/approve- Approve/deny userDELETE /users/:id- Delete user (soft)
VIPs (Admin, Coordinator)
GET /vips- List all VIPsPOST /vips- Create VIPGET /vips/:id- Get VIP by IDPATCH /vips/:id- Update VIPDELETE /vips/:id- Delete VIP (soft)
Drivers (Admin, Coordinator)
GET /drivers- List all driversPOST /drivers- Create driverGET /drivers/:id- Get driver by IDGET /drivers/:id/schedule- Get driver schedulePATCH /drivers/:id- Update driverDELETE /drivers/:id- Delete driver (soft)
Events (Admin, Coordinator; Drivers can view and update status)
GET /events- List all eventsPOST /events- Create event (with conflict detection)GET /events/:id- Get event by IDPATCH /events/:id- Update eventPATCH /events/:id/status- Update event statusDELETE /events/:id- Delete event (soft)
Flights (Admin, Coordinator)
GET /flights- List all flightsPOST /flights- Create flightGET /flights/status/:flightNumber- Get real-time flight statusGET /flights/vip/:vipId- Get flights for VIPGET /flights/:id- Get flight by IDPATCH /flights/:id- Update flightDELETE /flights/:id- Delete flight
Development Commands
npm run start:dev # Start dev server with hot reload
npm run build # Build for production
npm run start:prod # Start production server
npm run lint # Run ESLint
npm run test # Run tests
npm run test:watch # Run tests in watch mode
npm run test:cov # Run tests with coverage
Database Commands
npx prisma studio # Open Prisma Studio (database GUI)
npx prisma migrate dev # Create and apply migration
npx prisma migrate deploy # Apply migrations (production)
npx prisma migrate reset # Reset database (DEV ONLY)
npx prisma generate # Regenerate Prisma Client
npm run prisma:seed # Seed database with sample data
Environment Variables
See .env.example for all required variables:
DATABASE_URL- PostgreSQL connection stringAUTH0_DOMAIN- Your Auth0 tenant domainAUTH0_AUDIENCE- Your Auth0 API identifierAUTH0_ISSUER- Your Auth0 issuer URLAVIATIONSTACK_API_KEY- Flight tracking API key (optional)
Features
- ✅ Auth0 JWT authentication
- ✅ Role-based access control (Administrator, Coordinator, Driver)
- ✅ User approval workflow
- ✅ VIP management
- ✅ Driver management
- ✅ Event scheduling with conflict detection
- ✅ Flight tracking integration
- ✅ Soft deletes for all entities
- ✅ Comprehensive validation
- ✅ Type-safe database queries with Prisma
Tech Stack
- Framework: NestJS 10.x
- Database: PostgreSQL 15+ with Prisma 5.x ORM
- Authentication: Auth0 + Passport JWT
- Validation: class-validator + class-transformer
- HTTP Client: @nestjs/axios (for flight tracking)