Production-ready backend system for managing multi-level approval workflows with secure role-based access control, audit trails, and cloud deployment.
Base URL:
https://workflow-approval-system-production.up.railway.app
Health Check:
/actuator/health
This system enables organizations to manage structured approval workflows instead of relying on emails or spreadsheets.
- Employees submit requests
- Managers review at Level 1
- Admins provide final approval
- Full audit tracking of every action
- Strict workflow state transition validation
- Layered Architecture (Controller → Service → Repository)
- DTO Pattern using MapStruct
- Stateless JWT Authentication
- PostgreSQL relational database
- Dockerized container setup
- Cloud deployment via Railway
- Role-Based Access Control (ADMIN, MANAGER, EMPLOYEE)
- Multi-level sequential approval workflow
- Approve / Reject / Request Changes
- Full workflow history & audit trail
- JWT authentication & authorization
- Global exception handling
- Environment-based configuration
- Docker & docker-compose support
| Technology | Version |
|---|---|
| Java | 17 |
| Spring Boot | 3.2.3 |
| Spring Security | Latest |
| JWT (JJWT) | 0.11.5 |
| PostgreSQL | 15 |
| Maven | 3.x |
| Docker | Latest |
| MapStruct | 1.5.5.Final |
| Lombok | 1.18.30 |
- Java 17
- Maven
- PostgreSQL running locally
CREATE DATABASE workflow_db;
Default configuration:
Host: localhost Port: 5432 Database: workflow_db Username: postgres Password: 1234
mvn clean install mvn spring-boot:run
Application URL:
http://localhost:8080
Health Check:
http://localhost:8080/actuator/health
docker-compose up --build
Stop containers:
docker-compose down
Remove database volume:
docker-compose down -v
Deployed using Railway with managed PostgreSQL and environment-based configuration.
Required environment variables:
DATABASE_URL= DATABASE_USERNAME= DATABASE_PASSWORD= JWT_SECRET= JWT_EXPIRATION_MS=86400000 DDL_AUTO=update
Postman collection included:
WorkflowApprovalSystem.postman_collection.json
POST /api/auth/register
POST /api/auth/login
Use JWT token in header:
Authorization: Bearer <TOKEN>
POST /api/workflows
POST /api/workflows/{id}/submit
POST /api/workflows/{id}/approve
Supported actions:
- APPROVE
- REJECT
- REQUEST_CHANGES
GET /api/workflows/{id}/history
src/main/java/com/workflow/ ├── config/ ├── controller/ ├── dto/ ├── entity/ ├── enums/ ├── exception/ ├── mapper/ ├── repository/ ├── security/ └── service/
- BCrypt password hashing
- JWT token validation filter
- Role-based endpoint protection
- Stateless authentication
- Secure REST API design
- Business rule enforcement
- Database relationship modeling
- Multi-level workflow logic
- Production containerization
- Cloud deployment configuration
MIT License