A full-stack web application built to digitize hotel reception operations from end to end. Guest records, room management, reservations, payments, parking tracking, and more β all managed from a single place.
The backend is powered by Spring Boot 3.4, the frontend by Angular 21. It uses PostgreSQL as the database, MinIO for file storage, Stripe for payments, and SendGrid for email delivery. Everything runs on Docker.
- Tech Stack
- Project Structure
- Features
- Prerequisites
- Setup
- Running the App
- Port Map
- API Documentation
- Technical Details
- Git Policies
| Layer | Technology |
|---|---|
| Backend | Java 17, Spring Boot 3.4.2, Spring Security, Spring Data JPA |
| Frontend | Angular 21, TypeScript 5.9, Bootstrap 5 (Bootswatch), Tailwind CSS 4 |
| Database | PostgreSQL 15 |
| File Storage | MinIO (S3-compatible object storage) |
| Payments | Stripe |
| SendGrid + Thymeleaf templates | |
| Authentication | JWT (JSON Web Token) |
| Migration | Flyway |
| Mapping | MapStruct + Lombok |
| Rate Limiting | Bucket4j + Caffeine Cache |
| API Docs | Springdoc OpenAPI (Swagger UI) |
| Testing | JUnit, Spring Security Test, H2 (in-memory), Vitest (frontend) |
| Containers | Docker & Docker Compose |
| Build | Maven (backend), npm (frontend), multi-stage Dockerfile |
Reception/
βββ docker-compose.yml # Spins up all services
βββ Dockerfile # Multi-stage build for the backend
βββ pom.xml # Maven dependencies
βββ .env # (You need to create this) Environment variables
β
βββ src/main/java/.../reception/
β βββ common/ # Shared infrastructure
β β βββ config/ # Application configuration
β β βββ entity/ # Base entity classes
β β βββ exception/ # Global error handling
β β βββ filter/ # JWT filters
β β βββ response/ # Standardized API response models
β β βββ security/ # Spring Security setup
β β βββ utility/ # Helper classes
β β
β βββ features/ # Business logic modules
β βββ admin/ # Admin management
β βββ audit/ # Audit logs
β βββ email/ # Email delivery
β βββ guest/ # Guest operations
β βββ images/ # Image management (MinIO)
β βββ parking/ # Parking tracking
β βββ profile/ # User profile
β βββ receptionist/ # Receptionist management
β βββ reservation/ # Reservation operations
β βββ room/ # Room management
β βββ schedule/ # Scheduling / Shifts
β βββ stripe/ # Payment integration
β βββ user/ # User authentication
β
βββ src/main/resources/
β βββ application.properties # Application settings
β βββ db/migration/ # Flyway SQL files (V1βV8)
β βββ templates/ # Thymeleaf email templates
β
βββ src/main/frontend/ # Angular application
βββ Dockerfile # Multi-stage build for the frontend
βββ nginx.conf # Nginx reverse proxy config
βββ src/app/
βββ core/ # Guards, interceptors, models, services
βββ features/ # Page components (16 modules)
βββ shared/ # Shared components
The application is built around three distinct roles:
| Role | Permissions |
|---|---|
| ADMIN | Full access β user, room, guest, reservation, receptionist, parking, image, and audit log management |
| RECEPTIONIST | Guest, reservation, parking, and schedule management |
| GUEST | View own profile, track reservations, make payments |
- Stateless authentication via JWT
- Role-based access control (route guards + backend filtering)
- Temporary password mechanism for account creation
- Rate limiting for brute-force protection (Bucket4j)
- Create, edit, and delete rooms
- Upload room images (via MinIO)
- Create and track reservations
- Guest-specific reservation history
- Secure online payments with Stripe integration
- Refund support
- Email delivery via SendGrid API
- Thymeleaf templates (reservation confirmation, temporary password)
- Assign and manage parking spaces for guests
- Automatic
created_by,created_at,updated_by,updated_attracking for all entities - Audit log viewer in the admin panel
- Image storage on MinIO (S3-compatible) object storage
- Room image upload and listing
Make sure you have the following installed before getting started:
- Java JDK 17 or higher
- Node.js v18+ and npm
- Docker Desktop
- Maven (comes bundled with most IDEs)
Create a .env file in the project root directory and fill in the following variables with your own values:
# Database
DB_USER=reception_admin
DB_PASSWORD=your_strong_password
# JWT
JWT_SECRET_KEY=your_unique_jwt_secret_key
# SendGrid (Email)
SENDGRID_API_KEY=your_sendgrid_api_key
SPRING_EMAIL=verified@email.com
MAIL_FROM_NAME=Reception Hotel
# Stripe (Payments)
STRIPE_SECRET_KEY=your_stripe_secret_key
# MinIO (File Storage)
MINIO_USER=minioadmin
MINIO_PASSWORD=minioadmin
MINIO_ENDPOINT=http://localhost:9000If you're running the app from your IDE, add these environment variables to the ReceptionApplication run configuration:
DB_USER=reception_admin
DB_PASSWORD=your_strong_password
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/reception_db
SPRING_DATASOURCE_USERNAME=reception_admin
SPRING_DATASOURCE_PASSWORD=your_strong_password
JWT=your_unique_jwt_secret_key
SENDGRID_API_KEY=your_sendgrid_api_key
SPRING_EMAIL=verified@email.com
MAIL_FROM_NAME=Reception Hotel
STRIPE_SECRET_KEY=your_stripe_secret_key
MINIO_USER=minioadmin
MINIO_PASSWORD=minioadmin
MINIO_ENDPOINT=http://localhost:9000
You can run the application in two ways:
The easiest way. A single command brings everything up:
docker compose up --build -dThis command starts the following services:
- reception_backend β Spring Boot application
- reception_frontend β Angular app (served via Nginx)
- reception_postgres β PostgreSQL database
- reception_flyway β Database migrations
- reception_minio β File storage service
Open the app: http://localhost:4200
To follow the logs:
docker logs -f reception_backendTo start fresh (including wiping the database):
docker compose down -v
docker compose up --build -dIdeal for active development. The database still runs via Docker, but the backend and frontend run locally.
Step 1 β Start the database and MinIO:
docker compose up --build -d db minioStep 2 β Start the backend:
- Run
ReceptionApplication.javafrom your IDE, or:
./mvnw spring-boot:runStep 3 β Start the frontend:
cd src/main/frontend
npm install
npm run build
ng serveFrontend: http://localhost:4200
Backend (Swagger): http://localhost:8080/swagger-ui/index.html
| Service | Port | Description |
|---|---|---|
| Frontend | 4200 |
Angular app (Nginx in Docker, ng serve locally) |
| Backend (Docker) | 8082 |
Spring Boot application (Docker container) |
| Backend (Local) | 8080 |
Spring Boot application (IDE / Maven) |
| PostgreSQL | 5432 |
Database |
| MinIO API | 9000 |
Object storage API |
| MinIO Console | 9001 |
MinIO management console |
Explore and test all API endpoints through Swagger UI.
- Local: http://localhost:8080/swagger-ui/index.html
- Docker: http://localhost:8082/swagger-ui/index.html
All REST endpoints are versioned with the /api/v1 prefix.
| Topic | Detail |
|---|---|
| Architecture | Feature-based package structure split into common (infrastructure) and features (business logic) |
| Security | Stateless JWT authentication with JwtAuthenticationFilter for request filtering |
| Database Migration | 8 SQL migration files (V1βV8) managed by Flyway |
| Error Handling | Global exception handler with standardized HTTP error responses |
| Auditing | JPA Auditing for automatic created_by/at, updated_by/at tracking |
| Logging | Structured logging via SLF4J (@Slf4j), configured in logback-spring.xml |
| Rate Limiting | API request throttling with Bucket4j + Caffeine Cache |
| Object Mapping | DTO β Entity conversions via MapStruct |
| Email Templates | HTML email templates with Thymeleaf (reservation-confirmation, temporary-password) |
| Frontend Build | Multi-stage Docker build (Node.js β Nginx), Tailwind CSS + Bootstrap |
| Testing | Backend: JUnit + Spring Security Test + H2, Frontend: Vitest |
The following are excluded via .gitignore for security and a clean repository:
.envβ Environment secrets, should never be committedtarget/β Java build artifactsnode_modules/β Frontend dependenciessrc/main/resources/static/*β Auto-generated frontend assets.idea/,.vscode/β IDE configurations
- Fork the repository
- Create a feature branch (
git checkout -b feature/awesome-feature) - Commit your changes (
git commit -m 'Add awesome feature') - Push to the branch (
git push origin feature/awesome-feature) - Open a Pull Request
Reception β Built to simplify hotel management. π¨