Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hotel Booking System

Full-stack hotel room booking application built with Spring Boot, PostgreSQL, Docker, React, and JWT authentication.

The project includes a realistic booking workflow: customers can register, browse rooms, create bookings, view reserved dates, and manage their own reservations. Admin users can manage rooms and approve or reject booking requests.


Tech Stack

Backend: Java 21, Spring Boot 3, Spring Security, Spring Data JPA, PostgreSQL, Flyway, JWT, Maven, Swagger/OpenAPI, Docker.

Frontend: React, Vite, React Router, Axios, React Datepicker, Plain CSS, nginx Docker image.


Features

Customer

  • Register and login
  • Browse available hotel rooms
  • View room type, capacity, price, and status
  • Create booking requests
  • Select dates using a date picker
  • Reserved dates are disabled in the calendar
  • View personal bookings
  • Cancel pending or confirmed bookings

Admin

  • Login as admin
  • Create rooms
  • Edit rooms
  • Delete rooms
  • View all booking requests
  • Approve pending bookings
  • Reject pending bookings

Backend

  • JWT-based authentication
  • Role-based authorization
  • PostgreSQL persistence
  • Flyway database migrations
  • Global exception handling
  • Booking conflict validation
  • Reserved date ranges API
  • Swagger API documentation

Frontend

  • Role-based navigation
  • Protected frontend routes
  • Booking modal with date picker
  • Admin room management UI
  • Admin booking management UI
  • Responsive layout

Project Structure

hotel-booking-system/
  client/
    src/
      api/
      auth/
      components/
      pages/
    Dockerfile
    nginx.conf
    .dockerignore

  server/
    src/main/java/com/wokioki/hotelbooking/
      auth/
      booking/
      room/
      user/
      security/
      config/
      common/
    src/main/resources/db/migration/
    Dockerfile
    .dockerignore

  docker-compose.yml
  README.md

Roles

Role Description
CUSTOMER Can browse rooms, create bookings, view own bookings, and cancel own bookings
ADMIN Can manage rooms and approve or reject bookings

Demo Accounts

The application creates demo users on startup.

Role Email Password
Admin admin@hotel.com admin123
Customer customer@hotel.com customer123

Main Booking Flow

Customer logs in
        ↓
Customer browses rooms
        ↓
Customer opens booking modal
        ↓
Frontend loads reserved dates
        ↓
Customer selects available dates
        ↓
Booking is created with PENDING status
        ↓
Admin reviews booking
        ↓
Admin approves or rejects booking
        ↓
Customer sees updated booking status

Run with Docker Compose

From the project root:

docker compose up --build

Services:

Service URL
Frontend http://localhost:5173
Backend API http://localhost:8080
Swagger UI http://localhost:8080/swagger-ui/index.html
Health Check http://localhost:8080/actuator/health
PostgreSQL localhost:5433

Stop containers:

docker compose down

Remove containers and database volume:

docker compose down -v

Run Backend Locally

Start PostgreSQL:

docker compose up postgres

Run the backend:

cd server
mvn spring-boot:run

Backend runs on:

http://localhost:8080

Run Frontend Locally

cd client
npm install
npm run dev

Frontend runs on:

http://localhost:5173

The frontend uses this backend URL by default:

http://localhost:8080

API Documentation

Swagger UI is available at:

http://localhost:8080/swagger-ui/index.html

To test protected endpoints:

  1. Login with /api/auth/login
  2. Copy the returned JWT token
  3. Click Authorize in Swagger UI
  4. Paste the token without the Bearer prefix

Important API Endpoints

Auth

Method Endpoint Description
POST /api/auth/register Register customer
POST /api/auth/login Login

Rooms

Method Endpoint Description
GET /api/rooms Get rooms
GET /api/rooms/available Search available rooms
POST /api/rooms Create room
PUT /api/rooms/{id} Update room
DELETE /api/rooms/{id} Delete room

Bookings

Method Endpoint Description
POST /api/bookings Create booking
GET /api/bookings/my Get current user's bookings
GET /api/bookings Get all bookings
GET /api/bookings/room/{roomId}/reserved-ranges Get reserved date ranges
PATCH /api/bookings/{id}/approve Approve booking
PATCH /api/bookings/{id}/reject Reject booking
PATCH /api/bookings/{id}/cancel Cancel booking

Booking Rules

  • Check-in date cannot be in the past.
  • Check-out date must be after check-in.
  • Only rooms with AVAILABLE status can be booked.
  • PENDING and CONFIRMED bookings block reserved dates.
  • CANCELLED and REJECTED bookings do not block dates.
  • Customers can access only their own bookings.
  • Admins can manage all bookings.

Database

Database schema is managed with Flyway.

Main tables:

app_users
room_types
rooms
bookings

Status

Implemented:

  • Authentication and registration
  • JWT security
  • Role-based access control
  • Room CRUD
  • Room type CRUD
  • Booking creation
  • Booking cancellation
  • Booking approval and rejection
  • Reserved date calendar
  • React frontend
  • Protected frontend routes
  • Dockerized backend
  • Dockerized frontend
  • Swagger API documentation

About

Full-stack hotel room booking system with date-based availability, pending reservations, and transaction-safe booking logic.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages