A full-stack web application for discovering and booking unique experiences. Built with React 19, Node.js, Express 5, and MongoDB.
Deployed Link: bookit.gammerce.in
Email: test@gmail.com
Password: 123456
Browse and search experiences with responsive design
Detailed view with image gallery, time slots, and booking summary
Secure login with email/password and Google OAuth 2.0
- Browse and search experiences
- User authentication (Email/Password & Google OAuth)
- Mobile OTP verification
- Apply promo codes for discounts
- Fully responsive design (mobile-first)
- Lazy loading images with skeleton loaders
- JWT-based authentication
- 📦 AWS S3 integration for file storage
- 🎯 RESTful API architecture
| Category | Technology |
|---|---|
| Frontend | React 19, Vite, Tailwind CSS |
| Backend | Node.js, Express 5 |
| Database | MongoDB, Mongoose |
| Authentication | JWT, Google OAuth 2.0, bcrypt |
| File Storage | AWS S3 |
Before you begin, ensure you have the following installed:
- Node.js (v18 or higher)
- npm or yarn
- MongoDB (local or MongoDB Atlas account)
- Git
git clone https://github.com/Abdul-Rakib/Bookit.git
cd Bookit# Navigate to backend directory
cd backend
# Install dependencies
npm install
# Create .env file
touch .envCreate a .env file in the backend directory with the following variables:
# Server Configuration
PORT=5000
NODE_ENV=development
# Database
MONGO_URI=mongodb://localhost:27017/bookit
# Or use MongoDB Atlas:
# MONGO_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/bookit
# JWT Secret (generate a strong random string)
JWT_SECRET=your_jwt_secret_key_here
# Google OAuth 2.0
GOOGLE_CLIENT_ID=your_google_client_id_here
# CORS Origins (comma-separated)
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000
# SMS API (Optional - for OTP verification)
ONEAPI_SMS_API_KEY=your_sms_api_key_here
# AWS S3 Configuration (Optional - if using file uploads)
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
AWS_REGION=ap-south-1
AWS_S3_BUCKET=your_bucket_name# Navigate to frontend directory (from project root)
cd frontend
# Install dependencies
npm installThe frontend is configured to use a proxy in vite.config.js. If you need to change the backend URL, update the proxy configuration:
// frontend/vite.config.js
export default defineConfig({
server: {
proxy: {
'/api': 'http://localhost:5000' // Update if your backend runs on a different port
}
}
})Terminal 1 - Backend:
cd backend
npm run dev
# Server will run on http://localhost:5000Terminal 2 - Frontend:
cd frontend
npm run dev
# App will run on http://localhost:5173cd backend
npm start# Build frontend
cd frontend
npm run build
# The built files will be in frontend/dist
# Backend will serve these static files in production mode
# Run backend in production
cd ../backend
NODE_ENV=production npm startBOOKIT/
├── backend/
│ ├── controllers/ # Request handlers
│ │ ├── auth.js
│ │ ├── booking.js
│ │ ├── experience.js
│ │ └── user.js
│ ├── data/ # Sample/seed data
│ │ └── sampleData.js
│ ├── middlewares/ # Custom middleware
│ │ └── auth.js
│ ├── models/ # Mongoose schemas
│ │ ├── booking.js
│ │ ├── experience.js
│ │ ├── otp.js
│ │ ├── promoCode.js
│ │ └── user.js
│ ├── routes/ # API routes
│ │ ├── auth.js
│ │ ├── booking.js
│ │ ├── experience.js
│ │ ├── promo.js
│ │ └── user.js
│ ├── utils/ # Utility functions
│ │ ├── s3Utils.js
│ │ └── smsUtils.js
│ ├── .env # Environment variables
│ ├── package.json
│ └── server.js # Entry point
│
├── frontend/
│ ├── public/ # Static assets
│ ├── src/
│ │ ├── assets/ # Images, fonts, etc.
│ │ ├── components/ # Reusable components
│ │ │ ├── navbar/
│ │ │ └── profile/
│ │ ├── context/ # React Context
│ │ │ └── globalContext.jsx
│ │ ├── hooks/ # Custom hooks
│ │ │ ├── useAuth.jsx
│ │ │ └── useLogin.jsx
│ │ ├── pages/ # Page components
│ │ │ ├── Auth/
│ │ │ ├── dashboard/
│ │ │ ├── experiences/
│ │ │ └── footer/
│ │ ├── routes/ # Route protection
│ │ │ └── ProtectedRoutes.jsx
│ │ ├── services/ # API services
│ │ │ └── api.js
│ │ ├── utils/ # Utility functions
│ │ ├── App.jsx # Main app component
│ │ ├── main.jsx # Entry point
│ │ └── index.css # Global styles
│ ├── package.json
│ └── vite.config.js
│
├── screenshots/ # Application screenshots
└── README.md
POST /api/auth/google- Google OAuth loginPOST /api/auth/send-otp- Send OTP for phone verificationPOST /api/auth/verify-otp- Verify OTPPOST /api/auth/logout- User logoutGET /experiences- Get all experiences (with search/filter)GET /experiences/:id- Get single experience detailsPOST /bookings- Create a new bookingGET /bookings/user/:userId- Get user's bookingsPOST /promo/validate- Validate promo code
- Start both backend and frontend servers
- Open browser to
http://localhost:5173 - Use test credentials or sign up with Google
- Browse experiences and make a test booking
ISC
Abdul Rakib