Bengal Booking





About this Project
Full-stack Event Discovery & Ticket Booking Platform (MVP)
Bengal Booking is an event marketplace designed to connect event organizers with people looking for things to do. Users can browse published events by category, location, and search terms, select different ticket types, and reserve tickets through a short-lived pending booking. Sellers can create and manage their own events and inventory, while super administrators have full control over users, categories, locations, events, tickets, and payments.
The project was built as a separate Next.js frontend and NestJS backend with a strong focus on a reliable booking foundation. The core challenge was preventing two users from successfully reserving the same ticket during concurrent checkout attempts. This was solved using ticket-level inventory, immediate Redis-backed distributed locks, a ten-minute payment window, payment confirmation, and automatic expiry handling.
Key Features
For Users
Browse and filter published events by category, division/area, and text search View detailed event information including venue, dates, ticket types, prices, and booking limits Register with email/password or Google OAuth and verify email Reserve available tickets, submit buyer details, and confirm payment View personal booking history and status For Sellers Create and manage owned events Configure event dates, venue details, booking/cancellation deadlines, payment type, and max tickets per booking Create multiple ticket types with name, description, price, and inventory Track bookings and view seller dashboard For Super Admins Manage users and account status Manage categories, divisions, and areas Oversee all events, tickets, and payments Access platform-level dashboard summaries Concurrency control: Redis locks (ticket_lock:{ticketId}) ensure only one booking can hold a ticket at a time. Locks are acquired before creating a pending booking and released on confirm, expire, or failure. Booking lifecycle: Select tickets → Acquire Redis locks → Create pending booking (10-min expiry) → Confirm payment (tickets marked SOLD) or Expire (tickets released back to AVAILABLE). No waiting queue: Unavailable tickets fail immediately instead of putting users in an indefinite queue. Role-based authorization with JWT (HttpOnly cookie) and Google OAuth. Clean separation of concerns with dedicated modules for Auth, Booking, Event, Ticket, Payment, Dashboard, etc. Frontend: Next.js 15 (App Router), React 19, TypeScript, Tailwind CSS, TanStack Query, Zustand, React Hook Form, Zod, Recharts Backend: NestJS 11, TypeScript, Prisma ORM, Passport JWT, Google OAuth2, class-validator, Vitest Database & Cache: PostgreSQL + Redis (ioredis) Infrastructure: Docker Compose for local development I designed and implemented the complete booking system — from ticket selection and Redis locking to pending bookings, payment confirmation, expiry handling, and role-based access control. The focus was on building a dependable foundation that keeps ticket availability consistent under concurrent load while remaining simple and maintainable. This is currently an MVP. The core domain model and concurrency-sensitive booking flow are complete. Future work includes real payment-provider integration, email notifications, richer dashboards, and additional production hardening.Technical Highlights
Tech Stack
My Contribution
System Design