ThrillVille
Key features
Live wait times modelled server-side (queue = recent check-ins × factor): list, map and detail share ONE source → consistent totals
Transactional FastPass: 15-min hold with server expiresAt, automatic sweeper, 409 double-sale lock and downloadable SVG QR
pending → confirmed → used / expired / cancelled state machine with automatic slot release
Tickets with server-calculated prices and 21% VAT plus downloadable QR
Points ALWAYS derived from real check-ins (Σ check-ins × pointsPerVisit), 8 badges and Explorer levels
Admin panel with KPIs, per-hour occupancy and 7-day sales in SVG charts with axes, dates and tooltips
Description
Amusement park with a double value layer: real wait prediction (the server models each ride queue with cycle capacity and duration, and list, map and detail ALWAYS show the same waitMinutes) and a complete transactional FastPass cycle: slot hold with server-side expiresAt (now + 15 min), a 30-second sweeper that expires stale holds and frees the slot, double-sale lock (mutex + 409 with alternative slots), pending → confirmed → used / expired / cancelled state machine and a downloadable SVG QR receipt plus simulated email. Tickets with server-calculated prices and 21% VAT, gamification with points derived from real check-ins (Σ check-ins × pointsPerVisit, never an arbitrary column), 8 badges with JSONB criteria and Explorer levels, and an admin panel with daily KPIs, per-hour occupancy and 7-day sales in SVG charts with axes, dates and tooltips. "Night Fair" dark-first UI (neon magenta + amber) with light mode. Login with username or email, persistent JWT. Angular 22 + NestJS 11 + SQLite.
Technologies used
Angular
TypeScript
SQLite