Skip to main content

Order up · service night

A reservation system that runs like the pass.

Guests request a table without an account, staff review and approve from a filtered queue, and a token-secured REST API exposes the same operations downstream.

Role
Full-Stack Developer
Type
Academic
Timeline
Winter 2026
Collaborator
Matheus Camilo Ferraro
Source
GitHub
Order #0412 Guest reservation
Flavor da Casa reservation form
>Requested [ pending ] >Reviewed [ staff ] >Served [ approved ]
Host stand note

This split shaped the whole system: public intent first, protected operations second.

Two rooms, one ticket.

A reservation platform serves two very different rooms. Guests want a seat with zero friction. Staff want control, filters, and a record of every call. The job was to let both work the same ticket without handing the wrong controls to the wrong person. I owned the multi-module architecture, the auth and validation layers, and the dining room model; Matheus built the event and reservation flows and the email confirmation service.

Room 01 Front of house

The guest

Browse events and seatings, request a table, and get a confirmation code. No account, no friction.

Room 02 Back of house

The staff

Sign in, filter the queue by event and status, assign a table, then approve or deny. Every call is logged.

Warm room, cool contrast.

Portfolio cream and charcoal hold the page together, while cinnamon, coffee, apricot, and blue-grey accents add the restaurant tone.

Grounded Cinnamon#8A4F2C
Cinnamon Wood#B0724A
Coffee Bean#6F4A35
Soft Apricot#EDD1B2
Dark Blue-Grey#26373B
Charcoal Blue#2E4348
Porcelain#FDFBF8

A reservation moves like a ticket through service.

Guest

Request a table

The public form validates event and seating choices before creating a UUID-tracked pending reservation.

Fired
System

Send confirmation

EmailService sends the guest a formatted confirmation with event, seating time, and confirmation code.

Sent
Staff

Filter the queue

The dashboard narrows reservations by event and status so staff can work the next service window.

Queued
Staff

Assign a table

Authenticated users review full guest details and attach a valid dining table before approval.

Plated
API

Expose operations

The separate REST app uses bearer tokens and OpenAPI docs for third-party access.

Served

Four rooms, one house.

Guests reserve without an account, staff work the queue behind a login, and integrators read a documented API. Different rooms, the same domain underneath.

01

The reservation book

The guest flow keeps attention on event, seating, and contact details. It behaves like a host stand: collect the request, confirm the code, then move the ticket into the queue.

guest/reservation
Flavor da Casa reservation form
02

The service queue

Staff do not need every record at once. They need the next decision. Event and status filters turn the reservation list into a working queue.

staff/reservations
Reservation Dashboard - filterable by event and status, with color-coded badges
03

The locked staff door

The login screen marks the boundary between public browsing and operational authority. That boundary matters because approvals change the guest experience.

security/login
Spring Security Login - form-based authentication for staff
04

The documented API

Swagger turns the backend into something reviewable. The API is secured with JWT bearer tokens and kept separate from the Thymeleaf web app so future clients, a mobile app or a partner system, can consume the same domain without touching the staff interface.

api/swagger
Swagger API Documentation - JWT-secured REST endpoints

Host Stand Seating Simulator.

Interact with the reservation pipeline to see how guest requests, seating validation, and table assignments coordinate in real-time.

Host Stand // Controls

Run the reservation validation cycle. See how table availability checks prevent overlapping seatings.

Pipeline States
Host Stand Actions
Host Terminal Output
STATION // HOST STAND PENDING CHECKING APPROVED

Chef's Tasting Menu

  • > Date: Friday night, 7:00 PM
  • > Guests: 4 persons
  • > Contact: guest@moncton.ca
  • ? Table: Awaiting assignment
  • Table: Table 4 (Capacity: 4)
> Awaiting seating validation query...

One system, wired like infrastructure.

HTTP HTTPS · JWT verifies JWT depends on JPA · JDBC Staff browserfront of house API clientthird-party app-webThymeleaf: 8080 restaurant-apiREST: 8081 auth-apitokens: 8082 restaurantevents · reservations authaccess commonshared domain · application · web · infrastructure MySQLSpring Data JPA

01 Clients

Staff browser

front of house

API client

third-party

02 Delivery apps

app-web

Thymeleaf : 8080

restaurant-api

REST : 8081

auth-api

tokens : 8082

03 Domain modules

restaurant

events · reservations

auth

access

04 Shared foundation

common

domain · application · web · infrastructure

05 Persistence

MySQL

Spring Data JPA

The stack follows the service boundary.

  • Java 21
  • Spring Boot
  • Maven (Multi-Module)
  • Spring Security
  • JWT / OAuth2
  • Spring Data JPA
  • MySQL
  • Thymeleaf
  • Bootstrap 5
  • Swagger / OpenAPI

Proof the service holds.

Architecture

Multi-Module Clean Architecture

Maven multi-module project with shared common libraries. Each module (restaurant, auth, common) has its own Domain, Application, Infrastructure, and Presentation layers with strict dependency inversion.

Rules

Validation Framework

Custom ValidationService pattern per entity with Result/ValidatedResult wrapper types, field-level error binding to BindingResult, and dedicated validation services for Events, Seatings, Menus, MenuItems, DiningTables, and Reservations.

Dining room

Seating & Dining Table System

Seating CRUD with table assignments (many-to-many via SeatingTableEntity), capacity tracking, overlapping seating conflict detection, and cascade delete management.

Service prep

Data Initialization Service

InitializeDataServiceImpl seeds the database with default dining tables, events, seatings, menus, and menu items on first startup, enabling immediate demo readiness.

Let's build something that holds up.