The Old Vine Hotel - CMS Backend
Complete Content Management System (CMS) backend API for The Old Vine Hotel website.
🌐 Repository
https://github.com/t-sharabi/oldvine_cms
✨ Features
- 🔐 Admin Authentication - JWT-based authentication with role-based permissions
- 🏨 Room Management - Full CRUD operations for rooms and room categories
- 📅 Booking System - Complete booking management with guest tracking
- 💳 Payment Processing - Stripe integration for secure payments
- 📝 Content Management - Manage pages, blog posts, and site content
- 📸 Media Library - Upload and manage images and media files
- 🔗 Third-Party Integrations - Booking.com, Expedia, Opera PMS, Trip.com
- 📧 Email Notifications - Automated email sending for bookings and contacts
- 📊 Analytics & Reporting - Revenue reports and booking analytics
- 🛡️ Security - Helmet, rate limiting, CORS protection
🛠️ Technology Stack
- Runtime: Node.js
- Framework: Express.js
- Database: MongoDB with Mongoose ODM
- Authentication: JWT (JSON Web Tokens)
- Payment: Stripe
- Email: Nodemailer
- Logging: Winston
- Security: Helmet, express-rate-limit
📋 Prerequisites
- Node.js (v16 or higher)
- MongoDB (v5 or higher) - Can use Docker container
- npm or yarn
🚀 Quick Start
1. Clone the Repository
git clone https://github.com/t-sharabi/oldvine_cms.git
cd oldvine_cms
2. Install Dependencies
npm install
3. Environment Configuration
Create a .env file in the root directory:
# Server Configuration
PORT=5080
NODE_ENV=development
# MongoDB
MONGODB_URI=mongodb://localhost:27017/oldvinehotel
# JWT Secret
JWT_SECRET=your-super-secret-jwt-key-change-in-production
# Client URL (for CORS)
CLIENT_URL=http://localhost:3060
# Email Configuration (Optional)
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=your-email@gmail.com
EMAIL_PASS=your-app-password
# Stripe (Optional)
STRIPE_SECRET_KEY=sk_test_your_stripe_secret_key
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret
# Cloudinary (Optional - for media uploads)
CLOUDINARY_CLOUD_NAME=your-cloud-name
CLOUDINARY_API_KEY=your-api-key
CLOUDINARY_API_SECRET=your-api-secret
4. Start MongoDB
Using Docker:
docker run -d -p 27017:27017 --name mongodb mongo:7
Or using local MongoDB:
# macOS (Homebrew)
brew services start mongodb-community@7.0
# Linux
sudo systemctl start mongod
5. Seed Initial Data
# Create admin user
npm run seed:admin
# Seed content
npm run seed:content
Default admin credentials:
- Username:
admin - Password:
Admin@123456(⚠️ Change in production!)
6. Start the Server
# Development mode (with auto-reload)
npm run dev
# Production mode
npm start
The API will be available at http://localhost:5080
📚 API Endpoints
Authentication
POST /api/admin/login- Admin loginPOST /api/admin/register- Register new admin (super-admin only)GET /api/admin/me- Get current admin info
Rooms
GET /api/rooms- List all roomsGET /api/rooms/:id- Get room detailsPOST /api/rooms- Create room (admin)PUT /api/rooms/:id- Update room (admin)DELETE /api/rooms/:id- Delete room (admin)
Room Categories
GET /api/room-categories- List all categoriesGET /api/room-categories/:slug- Get category detailsPOST /api/room-categories- Create category (admin)PUT /api/room-categories/:id- Update category (admin)
Bookings
GET /api/bookings- List all bookings (admin)GET /api/bookings/:id- Get booking detailsPOST /api/bookings- Create bookingPUT /api/bookings/:id- Update booking (admin)GET /api/bookings/analytics/revenue- Revenue analytics (admin)
Content Management
GET /api/content/:page- Get page content (home, about, etc.)PUT /api/content/:page- Update page content (admin)
Gallery
GET /api/gallery-categories- List gallery categoriesGET /api/gallery-categories/:slug- Get category detailsPOST /api/gallery-categories- Create category (admin)
Media
GET /api/media- List media files (admin)POST /api/upload- Upload media file (admin)
Settings
GET /api/settings- Get site settingsPUT /api/settings- Update settings (admin)
🔧 Development
Project Structure
server/
├── index.js # Main server file
├── models/ # MongoDB models
│ ├── Admin.js
│ ├── Room.js
│ ├── Booking.js
│ └── ...
├── routes/ # API routes
│ ├── admin.js
│ ├── rooms.js
│ ├── bookings.js
│ └── ...
├── middleware/ # Express middleware
│ ├── adminAuth.js
│ └── errorHandler.js
├── services/ # External service integrations
│ ├── BookingComService.js
│ ├── ExpediaService.js
│ └── ...
├── utils/ # Utility functions
│ ├── logger.js
│ └── sendEmail.js
└── scripts/ # Database seeding scripts
├── seedAdmin.js
└── seedContent.js
Available Scripts
# Start development server (with nodemon)
npm run dev
# Start production server
npm start
# Run tests
npm test
# Seed admin user
npm run seed:admin
# Seed content
npm run seed:content
🔐 Security Features
- JWT Authentication - Secure token-based authentication
- Role-Based Access Control - Super-admin, admin, editor, manager roles
- Rate Limiting - 100 requests per 15 minutes per IP
- Helmet.js - Security headers
- CORS Protection - Configured for specific origins
- Input Validation - express-validator for request validation
- Password Hashing - bcryptjs for secure password storage
📊 Database Models
- Admin - Admin users with roles and permissions
- Room - Hotel rooms with amenities and pricing
- RoomCategory - Room categories (Single, Double, Suite, etc.)
- Booking - Guest bookings with payment tracking
- Guest - Guest information and history
- Content - Page content (home, about, etc.)
- BlogPost - Blog articles
- GalleryCategory - Photo gallery categories
- Media - Uploaded media files
- SiteSettings - Site-wide settings
🔗 Integrations
Supported Services
- Booking.com API - OTA integration
- Expedia EQC - Channel connectivity
- Trip.com API - Asian market integration
- Opera PMS - Property Management System sync
- Stripe - Payment processing
- Cloudinary - Media storage (optional)
📝 Environment Variables
See .env.example for all available environment variables.
🚀 Deployment
Using PM2
npm install -g pm2
pm2 start index.js --name oldvine-cms
pm2 save
pm2 startup
Using Docker
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5080
CMD ["npm", "start"]
📄 License
MIT License
👥 Support
For issues or questions, please open an issue on GitHub.
Note: This is the backend CMS only. The frontend website is in a separate repository: oldvine
Description
The Hotel CMS system that will help the client users to manage the website and hotel contents
Languages
JavaScript
100%