A full-stack event booking platform built as a SESD college project.
Demonstrates OOP principles, design patterns, and clean software architecture through a real, working application.
Eventify is a mini event ticketing system β think BookMyShow, but built from scratch for a Software Engineering course.
A user lands on the app, browses upcoming events, selects seats from an interactive seat map, picks a ticket type (VIP / General / Early Bird), chooses a payment method, and gets their booking confirmed β all in two clean pages.
The real purpose: showcase that every layer of the system is engineered properly β backend patterns, OOP models, database design, and a professional frontend that makes it all visible.
| Feature | Details |
|---|---|
| π Auth | JWT-based login with role-based access |
| πͺ Events | Browse, create, publish, and cancel events |
| πΊ Seat Map | Interactive grid β Available (green), Locked (yellow), Booked (red) |
| π« Tickets | Multi-tier pricing β VIP, General, Early Bird |
| π³ Payments | Strategy Pattern β Credit Card, PayPal, Bank Transfer |
| π Notifications | Observer Pattern β Email, SMS, Push |
| π My Bookings | View complete booking history with live statuses |
π Note on UI Scope: The backend and database are fully architected and secured for all three roles (
Attendee,Organizer,Admin). However, the frontend demo strictly focuses on the Attendee flow. This was a deliberate choice to visually demonstrate the most complex transaction pipelines (seat state management, factory pattern tickets, and strategy pattern payments) for presentation purposes.
| Technology | Role |
|---|---|
| Node.js + Express | REST API server |
| TypeScript | Type-safe code |
| PostgreSQL | Relational database (18 tables) |
| JWT + bcrypt | Authentication & password hashing |
| Jest | Unit testing |
| Technology | Role |
|---|---|
| React 19 + Vite | Fast, modern UI |
| Tailwind CSS | Dark-themed styling |
| Axios | API client with JWT interceptors |
| React Router | Two-page routing |
| Lucide React | Clean iconography |
βββββββββββββββββββββββββββββββββββββββββββ
β Frontend (React) β
β EventExplorer β BookingDashboard β
ββββββββββββββββββ¬βββββββββββββββββββββββββ
β HTTP (Axios)
ββββββββββββββββββΌβββββββββββββββββββββββββ
β Backend (Express) β
β Routes β Middleware β Controllers β
β β β
β Services β
β β β
β Models + Design Patterns β
ββββββββββββββββββ¬βββββββββββββββββββββββββ
β
ββββββββββββββββββΌβββββββββββββββββββββββββ
β PostgreSQL Database β
βββββββββββββββββββββββββββββββββββββββββββ
Swap payment methods without changing business logic.
interface PaymentStrategy {
pay(amount: number, info: PaymentInfo): Promise<PaymentResult>;
}
class CreditCardStrategy implements PaymentStrategy { ... }
class PayPalStrategy implements PaymentStrategy { ... }
class BankTransferStrategy implements PaymentStrategy { ... }Seats transition through defined states.
interface SeatState {
lock(seat: Seat): boolean;
book(seat: Seat): boolean;
}
class AvailableState implements SeatState { ... } // π’ Green
class LockedState implements SeatState { ... } // π‘ Yellow
class BookedState implements SeatState { ... } // π΄ RedNotify multiple channels on booking events.
class NotificationService {
notify(event: NotificationEvent): void {
this.observers.forEach(obs => obs.update(event));
}
}
// Observers: EmailNotification, SMSNotification, PushNotificationclass TicketFactory {
static createTicket(type: TicketCategory): Ticket {
if (type === 'VIP') return new VIPTicket();
if (type === 'EARLY_BIRD') return new EarlyBirdTicket();
return new GeneralTicket();
}
}class Logger {
private static instance: Logger;
static getInstance(): Logger {
if (!Logger.instance) Logger.instance = new Logger();
return Logger.instance;
}
}abstract class User {
protected id: string;
protected email: string;
abstract getRole(): string;
}
class Attendee extends User { getRole() { return 'attendee'; } }
class Organizer extends User { getRole() { return 'organizer'; } }
class Admin extends User { getRole() { return 'admin'; } }class Seat {
private status: SeatStatus;
private state: SeatState;
public lock(userId: string): boolean {
return this.state.lock(this, userId); // Controlled access
}
}interface NotificationObserver {
update(event: NotificationEvent): void;
}
class EmailNotification implements NotificationObserver { ... }
class SMSNotification implements NotificationObserver { ... }The application is fully configured for production deployment using modern cloud platforms:
- Node.js 18+
- PostgreSQL 15+
- npm
# 1. Clone the repo
git clone https://github.com/YashSharma64/SESD-Eventify.git
cd SESD-Eventify
# 2. Setup Backend
cd backend
npm install
cp .env.example .env # Fill in your DB credentials
npm run db:init # Initialize database tables
npm run dev # Starts on http://localhost:3000
# 3. Setup Frontend (new terminal)
cd ../frontend
npm install
npm run dev # Starts on http://localhost:5173The frontend auto-authenticates using a test user on first load β no manual login needed for demo purposes.
| Method | Endpoint | Access |
|---|---|---|
| POST | /api/auth/register |
Public |
| POST | /api/auth/login |
Public |
| GET | /api/auth/me |
Authenticated |
| Method | Endpoint | Access |
|---|---|---|
| GET | /api/events |
Public |
| GET | /api/events/:id |
Public |
| POST | /api/events |
Organizer / Admin |
| PATCH | /api/events/:id/publish |
Organizer / Admin |
| GET | /api/events/venues/:venueId/seats |
Public |
| Method | Endpoint | Access |
|---|---|---|
| POST | /api/bookings |
Attendee |
| GET | /api/bookings/my-bookings |
Authenticated |
| GET | /api/bookings/:id |
Authenticated |
| PATCH | /api/bookings/:id/cancel |
Authenticated |
| POST | /api/bookings/:bookingId/payment |
Authenticated |
PostgreSQL schema with 18 tables including proper normalization, foreign keys, indexes, and constraints.
See β ErDiagram.md
# Run backend unit tests
cd backend && npm test| Document | Description |
|---|---|
| idea.md | Project concept and scope |
| classDiagram.md | Full class diagram |
| sequenceDiagram.md | Booking flow sequence |
| useCaseDiagram.md | Use cases by role |
| ErDiagram.md | Database ER diagram |
Yash Sharma β @YashSharma64