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 login
  • POST /api/admin/register - Register new admin (super-admin only)
  • GET /api/admin/me - Get current admin info

Rooms

  • GET /api/rooms - List all rooms
  • GET /api/rooms/:id - Get room details
  • POST /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 categories
  • GET /api/room-categories/:slug - Get category details
  • POST /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 details
  • POST /api/bookings - Create booking
  • PUT /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)
  • GET /api/gallery-categories - List gallery categories
  • GET /api/gallery-categories/:slug - Get category details
  • POST /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 settings
  • PUT /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
Readme 186 KiB
Languages
JavaScript 100%