Skip to content
PT.
All projects

Project case study

RoomHub.

Internal Room Booking System

An internal classroom reservation system for students and administrators, split across separate backend and frontend repositories. The Java 25 backend handles multi-slot bookings, database-level concurrency protection, UTC-safe scheduling, and real-time notifications, and uses a Docker Compose and Nginx deployment setup. The public demo currently opens at the sign-in screen; authenticated workflows require an authorized account.

Timeline
Mar 2026 - May 2026
Context
Personal software project
Repository
Separate backend and frontend Git repositories
Stage
Deployed demo · Academic / personal scope

The problem

Multiple requests can compete for the same room and time range.

My contribution

Implemented reservation APIs, OAuth2/JWT authentication, RabbitMQ notifications, WebSocket updates, migrations, and delivery configuration.

Current scope

Personal software project. A live sign-in screen and source repositories are available; authenticated booking screens require an authorized account.

A decision in context.

Choice

Use database constraints and application-level version checks to help reject overlapping reservations and stale updates.

Verification

A k6 script covers concurrent booking writes and room reads. It is available in the source project, but no verified result report is available to publish.

Limits

No throughput, latency, or zero-error claim is published here without a matching test report and environment description.

Key takeaway

Handling overlapping bookings and local time requires more care than a calendar suggests.

Project decisions

What went into
the project.

01

Multi-Slot Booking & Concurrency Protection

Students can request multiple consecutive slots in one transaction. The backend README describes database-level locks and atomic updates to protect availability and prevent two bookings from claiming the same room time.

02

UTC-Safe Scheduling & Automatic Follow-Up

Booking times are stored and processed in UTC, then presented in Vietnam time (GMT+7). ShedLock-protected background jobs handle missed check-ins and bookings awaiting administrator approval.

03

RabbitMQ & Real-Time Notifications

Booking status changes trigger notifications delivered to the interface over Spring WebSockets. RabbitMQ provides the message broker for asynchronous delivery.

04

Authentication & Frontend Foundation

The backend uses Spring Security with OAuth2/JWT. The React 18 and Vite frontend README documents a feature-based structure, typed Axios API client, Zustand auth state, TanStack Query, protected routing, and an implemented login module.

05

Bilingual UI & Delivery Setup

The system includes English and Vietnamese language support. The backend uses Flyway, Docker Compose, and Nginx, with deployment automation handled by GitHub Actions. Deployment and interface behavior can be explored through the source repositories and the sign-in demo.

Implementation

Tools & systems

  • BE · Java 25
  • BE · Spring Boot
  • BE · PostgreSQL
  • BE · Flyway
  • BE · Redis
  • BE · RabbitMQ
  • BE · Spring WebSockets
  • BE · Spring Security OAuth2 / JWT
  • BE · Mailjet API
  • BE · Docker / Compose
  • BE · Nginx
  • BE · GitHub Actions
  • FE · React 18
  • FE · Vite 5
  • FE · TypeScript 5
  • FE · Tailwind CSS 3.4
  • FE · Axios
  • FE · TanStack Query
  • FE · Zustand
  • FE · React Hook Form + Zod
  • FE · React Router 6