Enterprise-grade logistics management system with intelligent package routing, capacity optimization, and state machine validation.
Live Demo β’ Features β’ Quick Start β’ API Docs β’ Contributing
- Overview
- Key Features
- Demo
- Tech Stack
- Architecture
- Quick Start
- API Documentation
- Project Structure
- Testing
- GitHub Pages Setup
- Troubleshooting
- Contributing
- License
Smart Logistic is a production-ready logistics management system built with Spring Boot 3 and Clean Architecture principles. It demonstrates enterprise software development best practices including:
- β Domain-Driven Design (DDD) - Rich domain models with business logic
- β Clean Architecture - Layered design with clear separation of concerns
- β SOLID Principles - Maintainable and extensible codebase
- β Test-Driven Development - Comprehensive unit tests (12 tests, 100% pass rate)
- β RESTful API Design - Industry-standard REST endpoints
- β Transaction Management - ACID guarantees with Spring @Transactional
Validates vehicle capacity before package assignment to prevent overloading.
// Validation Logic: src/main/java/.../service/DeliveryService.java:47-56
if (!vehicle.canLoad(totalPackageWeight)) {
throw VehicleOverloadedException.forPackage(
vehicle.getLicensePlate(),
totalPackageWeight,
vehicle.getRemainingCapacityKg()
);
}Business Rule: totalWeight + currentLoad <= vehicleCapacity
Enforces valid package status transitions to maintain data integrity.
// State Machine: src/main/java/.../domain/entity/Package.java:55-65
public boolean canTransitionTo(PackageStatus newStatus) {
return switch (this.status) {
case CREATED -> newStatus == PackageStatus.LOADED;
case LOADED -> newStatus == PackageStatus.DELIVERED;
case DELIVERED -> false; // Terminal state
};
}Valid Flow: CREATED β LOADED β DELIVERED (no skipping allowed)
Automatically sorts packages by delivery deadline for optimal route planning.
// Routing Algorithm: src/main/java/.../service/DeliveryService.java:58-61
List<Package> sortedPackages = packages.stream()
.sorted(Comparator.comparing(Package::getDeliveryDeadline))
.toList();Result: Earliest deadline packages are delivered first.
Access the modern web interface at http://localhost:8080 after starting the application.
curl -X POST http://localhost:8080/api/delivery/assign \
-H "Content-Type: application/json" \
-d '{
"vehicleId": 1,
"packageIds": [4, 2, 5]
}'
# Response: 200 OK (packages sorted by deadline)curl -X POST http://localhost:8080/api/delivery/assign \
-H "Content-Type: application/json" \
-d '{
"vehicleId": 1,
"packageIds": [1, 3]
}'
# Response: 400 Bad Request
{
"status": 400,
"error": "Vehicle Overload",
"message": "Vehicle 'ABC-1234' cannot load package of 450.00 kg..."
}curl -X PATCH http://localhost:8080/api/packages/1/status \
-H "Content-Type: application/json" \
-d '{"status": "DELIVERED"}'
# Response: 400 Bad Request
{
"status": 400,
"error": "Invalid Status Transition",
"message": "Package cannot transition from CREATED to DELIVERED"
}| Category | Technology |
|---|---|
| Language | Java 17+ |
| Framework | Spring Boot 3.2.1 |
| Database | PostgreSQL 16 (Docker) |
| ORM | Spring Data JPA + Hibernate |
| Validation | Jakarta Bean Validation |
| Mapping | MapStruct + Lombok |
| Testing | JUnit 5 + Mockito |
| Build Tool | Maven 3.6+ |
| Containerization | Docker & Docker Compose |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Controller Layer β
β (REST API Endpoints + DTO Validation) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Service Layer β
β (Business Logic: Capacity Guard, State Machine) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Repository Layer β
β (Spring Data JPA Repositories) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Database Layer β
β (PostgreSQL 16) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β Vehicle βββββββββββDeliveryRoute ββββββββββΊβ Package β
βββββββββββββββ€ ββββββββββββββββ€ βββββββββββββββ€
β id β β id β β id β
β licensePlateβ β vehicle β β address β
β capacityKg β β packages[] β β weightKg β
β currentLoad β β createdAt β β status β
β status β β completedAt β β deadline β
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
Ensure you have the following installed:
java -version # Java 17 or higher
mvn -version # Maven 3.6+
docker --version # Docker Desktopgit clone https://github.com/yourusername/logiroute.git
cd logiroute# Start PostgreSQL container
docker-compose up -d
# Verify database is ready (wait 10-15 seconds)
docker exec logiroute-postgres psql -U postgres -d logiroute -c "SELECT 1"Note: If you have a local PostgreSQL running on port 5432, stop it first:
brew services stop postgresql@14 # macOS
# or
sudo systemctl stop postgresql # Linuxmvn test
# Expected output: Tests run: 12, Failures: 0, Errors: 0mvn spring-boot:runWait for: Started LogiRouteApplication in X.XXX seconds
- Web UI: http://localhost:8080
- API Base URL: http://localhost:8080/api
- Health Check: http://localhost:8080/actuator/health
The application automatically loads test data:
- 2 vehicles: ABC-1234 (1000kg), XYZ-5678 (1500kg)
- 5 packages: Various weights and deadlines
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/vehicles |
List all vehicles |
| GET | /api/vehicles/{id} |
Get vehicle by ID |
| GET | /api/vehicles/available |
Get available vehicles |
| POST | /api/vehicles |
Create new vehicle |
| PUT | /api/vehicles/{id} |
Update vehicle |
| DELETE | /api/vehicles/{id} |
Delete vehicle |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/packages |
List all packages |
| GET | /api/packages/{id} |
Get package by ID |
| GET | /api/packages/unassigned |
Get unassigned packages |
| GET | /api/packages/status/{status} |
Filter by status |
| POST | /api/packages |
Create new package |
| PUT | /api/packages/{id} |
Update package |
| PATCH | /api/packages/{id}/status |
Update status (validates state machine) |
| DELETE | /api/packages/{id} |
Delete package |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/delivery/assign |
Assign packages to vehicle (capacity guard) |
| GET | /api/delivery/routes |
Get all active routes |
| GET | /api/delivery/routes/{id} |
Get route by ID |
| GET | /api/delivery/routes/vehicle/{vehicleId} |
Get routes by vehicle |
| PATCH | /api/delivery/routes/{id}/complete |
Complete delivery route |
src/main/java/com/logistics/logiroute/
βββ config/
β βββ DataLoader.java # Seed data configuration
βββ controller/
β βββ DeliveryController.java # Delivery operations REST API
β βββ PackageController.java # Package CRUD operations
β βββ VehicleController.java # Vehicle CRUD operations
βββ domain/
β βββ entity/
β β βββ DeliveryRoute.java # Route entity
β β βββ Package.java # Package entity (State Machine)
β β βββ Vehicle.java # Vehicle entity (Capacity logic)
β βββ enums/
β βββ PackageStatus.java # CREATED, LOADED, DELIVERED
β βββ VehicleStatus.java # AVAILABLE, IN_TRANSIT
βββ dto/ # Data Transfer Objects
β βββ request/ # Request DTOs
β βββ response/ # Response DTOs
βββ exception/
β βββ GlobalExceptionHandler.java # Centralized error handling
β βββ VehicleOverloadedException.java
β βββ InvalidStatusTransitionException.java
β βββ ResourceNotFoundException.java
βββ mapper/ # MapStruct mappers
β βββ DeliveryRouteMapper.java
β βββ PackageMapper.java
β βββ VehicleMapper.java
βββ repository/ # Spring Data JPA repositories
β βββ DeliveryRouteRepository.java
β βββ PackageRepository.java
β βββ VehicleRepository.java
βββ service/
βββ DeliveryService.java # Core business logic
βββ PackageService.java
βββ VehicleService.java
mvn testmvn test -Dtest=DeliveryServiceTest12 comprehensive unit tests covering:
β Capacity Guard:
- Success: Packages within capacity
- Failure: Single package exceeds capacity
- Failure: Multiple packages exceed capacity
β State Machine:
- Valid transitions (CREATEDβLOADED, LOADEDβDELIVERED)
- Invalid transition prevention (CREATEDβDELIVERED)
- Backward transition prevention
- No transitions from DELIVERED state
β Smart Routing:
- Packages sorted by earliest deadline
β Additional:
- Resource not found handling
- Route completion
- Package state validation
To enable GitHub Pages for this project:
- Go to your repository on GitHub
- Navigate to Settings β Pages
- Under Source, select "GitHub Actions" (not "Deploy from a branch")
- Click Save
The deployment will automatically trigger when you push changes to the docs/ directory. The site will be available at:
https://meliharik.github.io/smart_logistic/
You can also trigger the deployment manually:
- Go to the Actions tab in your repository
- Select the Deploy to GitHub Pages workflow
- Click Run workflow β Run workflow
Note: If the badge shows "failing", it means GitHub Pages hasn't been enabled yet in repository settings. Follow the steps above to enable it.
Solution:
# Find process using port 8080
lsof -i :8080
# Kill the process
kill -9 <PID>
# Or kill all Java processes
pkill -9 javaSolution:
# Stop local PostgreSQL if running
brew services stop postgresql@14 # macOS
sudo systemctl stop postgresql # Linux
# Reset Docker PostgreSQL
docker-compose down -v
docker-compose up -d
sleep 15
# Restart application
mvn spring-boot:runSolution:
# Clean and rebuild
mvn clean compile
# Run tests with detailed output
mvn test -XSolution:
# Check Docker is running
docker ps
# View logs
docker logs logiroute-postgres
# Complete reset
docker-compose down -v
docker-compose up -dWe welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow the existing code style
- Write unit tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting PR
This project is licensed under the MIT License - see the LICENSE file for details.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Built with:
- Spring Boot - Application framework
- PostgreSQL - Database
- MapStruct - Bean mapping
- Lombok - Boilerplate reduction
β If you find this project useful, please consider giving it a star! β
Made with β€οΈ using Spring Boot 3, Clean Architecture, and Domain-Driven Design