A modern Flight Booking System built with Node.js, Express.js, MySQL, Sequelize ORM, JWT Authentication, API Gateway, and Microservices Architecture.
Designed with production-level practices including Authentication, Role-Based Access Control (RBAC), Refresh Token Rotation (RTR), Rate Limiting, Health Monitoring, Structured Logging, Security Headers, and Centralized API Gateway.
β If you like this project, consider giving it a Star on GitHub!
The Flight Booking System is a production-inspired backend microservices application that demonstrates how modern distributed systems are designed, secured, and managed.
Unlike a traditional monolithic application, this project separates responsibilities into independent services that communicate through an API Gateway, allowing better scalability, maintainability, and fault isolation.
The system includes:
- π Secure Authentication Service
βοΈ Flight Management Service- π« Booking Management Service
- π API Gateway
- π‘οΈ Enterprise Security Middleware
- π Health Monitoring
- π Centralized Request Logging
- β‘ Rate Limiting
- π Refresh Token Rotation
- π₯ Role-Based Access Control
The project follows industry-standard backend engineering practices and demonstrates how multiple services collaborate while remaining independently deployable.
Modern software companies rarely build everything inside one large application.
Instead, they use Microservices Architecture, where every service owns a single responsibility.
This project demonstrates many real-world backend engineering concepts, including:
- API Gateway Pattern
- Reverse Proxy Routing
- JWT Authentication
- Refresh Token Rotation (RTR)
- Replay Attack Protection
- Role-Based Authorization (RBAC)
- Health Aggregation
- Structured Request Logging
- Request Tracing
- Security Headers (Helmet)
- Cross-Origin Resource Sharing (CORS)
- IP-Based Rate Limiting
- Failure Recovery
- Production Health Monitoring
This repository was built as a learning project while following production engineering practices as closely as possible.
- User Registration
- User Login
- JWT Authentication
- Access Token Validation
- Refresh Token Rotation (RTR)
- Replay Attack Detection
- Session Management
- Secure Logout
- Role-Based Access Control (RBAC)
Supported Roles:
- ADMIN
- AIRLINE_ADMIN
- CUSTOMER
Write operations are protected using reusable authorization middleware.
- Create Flights
- Update Flights
- Delete Flights
- Search Flights
- Airport Management
- City Management
- Airplane Management
- Create Booking
- Seat Reservation
- Booking Status Management
- Automatic Seat Release
- Transaction Safety
- Reverse Proxy
- Centralized Routing
- Health Aggregation
- Request Logging
- Request Tracing
- Rate Limiting
- Helmet Security
- CORS Handling
- JWT Authentication
- RBAC
- Replay Protection
- Refresh Token Rotation
- Helmet Security Headers
- CORS Protection
- Rate Limiting
- Sanitized Logs
- Gateway Health Check
- Aggregated Service Health
- Structured Logs
- Response Time Tracking
- Request IDs
- Failure Detection
Client
β
β
βΌ
ββββββββββββββββββββ
β API Gateway β
β Port 3005 β
ββββββββββ¬ββββββββββ
β
βββββββββββββββββββββββΌββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Auth Service β βFlight Serviceβ βBookingServiceβ
β Port 3002 β β Port 3000 β β Port 3001 β
ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ
β β β
ββββββββββββββββ¬βββββββ΄βββββββββββββββ¬βββββββ
β β
βΌ βΌ
MySQL Database Internal HTTP APIs
- Node.js
- Express.js
- MySQL
- Sequelize ORM
- JWT (JSON Web Tokens)
- bcrypt
- Axios
- HTTP Proxy Middleware
- Helmet
- CORS
- Express Rate Limit
- Winston
- Health Aggregation
- Request Tracing
- Nodemon
- Dotenv
- Git
- GitHub
- End-to-End Test Suites
- Integration Testing
- Gateway Validation
- Authentication Validation
- Production Readiness Testing
The project follows a Microservices Architecture, where each service owns a specific business responsibility and can be developed, deployed, and scaled independently.
Flight-Booking-System/
β
βββ Gateway-Service/
β βββ src/
β β βββ config/
β β βββ controllers/
β β βββ middlewares/
β β βββ routes/
β β βββ services/
β β βββ index.js
β β
β βββ gateway.log
β βββ package.json
β βββ .env.example
β
βββ Auth-Service/
β βββ src/
β β βββ config/
β β βββ controllers/
β β βββ middlewares/
β β βββ models/
β β βββ repositories/
β β βββ routes/
β β βββ services/
β β βββ utils/
β β
β βββ migrations/
β βββ seeders/
β βββ package.json
β
βββ Flight-Service/
β βββ src/
β β βββ controllers/
β β βββ middlewares/
β β βββ models/
β β βββ repositories/
β β βββ routes/
β β βββ services/
β β βββ utils/
β β
β βββ migrations/
β βββ seeders/
β βββ package.json
β
βββ Booking-Service/
β βββ src/
β β βββ controllers/
β β βββ middlewares/
β β βββ models/
β β βββ repositories/
β β βββ routes/
β β βββ services/
β β βββ utils/
β β
β βββ migrations/
β βββ seeders/
β βββ package.json
β
βββ docs/
β
βββ scratch/
β
βββ README.md
The system is divided into four independent services, each with a single responsibility.
| Service | Port | Responsibility |
|---|---|---|
| Gateway-Service | 3005 | Reverse Proxy, Routing, Logging, Rate Limiting, Health Aggregation |
| Auth-Service | 3002 | Authentication, JWT, Refresh Tokens, User Sessions, RBAC |
| Flight-Service | 3000 | Flight Management, Airports, Cities, Airplanes |
| Booking-Service | 3001 | Booking Creation, Seat Reservation, Booking Lifecycle |
The API Gateway is the single entry point into the system.
Every client request first reaches the Gateway.
The Gateway then:
- Routes requests
- Adds security headers
- Applies rate limiting
- Generates request IDs
- Writes request logs
- Aggregates health checks
- Forwards requests to downstream services
Client
β
βΌ
βββββββββββββββββββββ
β API Gateway β
βββββββββββ¬ββββββββββ
β
ββββββββββββββββΌββββββββββββββββ
βΌ βΌ βΌ
Auth Service Flight Service Booking Service
The authentication lifecycle follows industry-standard JWT authentication with Refresh Token Rotation (RTR).
User Login
β
βΌ
Auth Service validates
username/password
β
βΌ
Access Token + Refresh Token
β
βΌ
Client stores tokens
β
βΌ
Gateway receives request
β
βΌ
JWT Authentication Middleware
β
Valid Access Token?
β β
YES NO
β β
βΌ βΌ
Protected Route HTTP 401
Unlike traditional JWT authentication, refresh tokens are rotated after every use.
Old Refresh Token
β
βΌ
Refresh Endpoint
β
βΌ
Generate
β’ New Access Token
β’ New Refresh Token
β
βΌ
Old Refresh Token Revoked
β
βΌ
Replay Attack?
β
Yes
β
βΌ
Revoke Entire Session
- Prevents replay attacks
- Prevents stolen refresh token reuse
- Forces attackers out immediately
Every protected route passes through reusable authorization middleware.
Incoming Request
β
βΌ
Authenticate JWT
β
βΌ
Decode User Roles
β
βΌ
Authorize Roles
β
βββββββ΄ββββββ
β β
βΌ βΌ
Allowed Forbidden
| Role | Permissions |
|---|---|
| ADMIN | Full System Access |
| AIRLINE_ADMIN | Flight Management |
| CUSTOMER | Booking & Read Operations |
Customer
β
βΌ
Create Booking
β
βΌ
Booking Service
β
βΌ
Reserve Seat
β
βΌ
Flight Service
β
βΌ
Seat Reserved
β
βΌ
Booking Status
β
ββββ΄ββββββββββββββββ
β β
βΌ βΌ
Confirmed Expired
β β
βΌ βΌ
Keep Seat Release Seat
Every API request follows the same pipeline.
Client
β
βΌ
Request Logger
β
βΌ
Rate Limiter
β
βΌ
Helmet
β
βΌ
CORS
β
βΌ
Reverse Proxy
β
βΌ
Target Microservice
Instead of checking every service manually, the Gateway exposes a single endpoint.
GET /health
β
βΌ
Gateway
β
ββββββββββββββββ
β β
βΌ βΌ
Auth Booking
β β
ββββββββ¬ββββββββ
βΌ
Flight Service
β
βΌ
Aggregated JSON Response
Example:
{
"success": true,
"gateway": {
"status": "UP"
},
"services": {
"auth": "UP",
"booking": "UP",
"flight": "UP"
}
}Each service owns its own data.
MySQL
ββββββββββββββΌβββββββββββββ
βΌ βΌ βΌ
Auth DB Flight DB Booking DB
This avoids shared database coupling, one of the key principles of microservices.
Client
β
βΌ
API Gateway
β
βββββββββββββββΌβββββββββββββββ
βΌ βΌ βΌ
Auth Service Flight Service Booking Service
β
βΌ
Reserve Seat API
β
βΌ
Flight Service
This project follows several backend engineering principles:
- β Separation of Concerns
- β Layered Architecture
- β Single Responsibility Principle
- β Stateless Authentication
- β Secure Token Rotation
- β Least Privilege Authorization
- β Independent Service Ownership
- β Centralized Gateway
- β Production-Ready Middleware
- β Scalable Microservices Design
Follow the steps below to set up and run the Flight Booking System on your local machine.
Make sure you have the following installed:
| Software | Version |
|---|---|
| Node.js | 22.x or later |
| npm | 10.x or later |
| MySQL | 8.x |
| Git | Latest |
| Postman (Optional) | Latest |
Verify your installation:
node -v
npm -v
mysql --version
git --versiongit clone https://github.com/<your-username>/Flight-Booking-System.git
cd Flight-Booking-SystemInstall dependencies for each microservice.
cd Gateway-Service
npm installcd ../Auth-Service
npm installcd ../Flight-Service
npm installcd ../Booking-Service
npm installEach microservice contains a .env.example file.
Create a .env file inside every service by copying the example.
Example:
cp .env.example .envor manually:
.env.example
β
.env
PORT=3005
AUTH_SERVICE_URL=http://localhost:3002
FLIGHT_SERVICE_URL=http://localhost:3000
BOOKING_SERVICE_URL=http://localhost:3001
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX_REQUESTS=100
TRUST_PROXY=false
CORS_ORIGIN=*
CORS_METHODS=GET,POST,PUT,PATCH,DELETE,OPTIONS
CORS_CREDENTIALS=falsePORT=3002
DB_HOST=localhost
DB_PORT=3306
DB_NAME=<YOUR_DB_NAME>
DB_USER=<YOUR_DB_USER>
DB_PASSWORD=<YOUR_DB_PASSWORD>
JWT_SECRET=<YOUR_JWT_SECRET>
JWT_REFRESH_SECRET=<YOUR_REFRESH_SECRET>
JWT_EXPIRY=15m
JWT_REFRESH_EXPIRY=7dPORT=3000
DB_HOST=localhost
DB_PORT=3306
DB_NAME=<YOUR_DB_NAME>
DB_USER=<YOUR_DB_USER>
DB_PASSWORD=<YOUR_DB_PASSWORD>
JWT_SECRET=<SAME_JWT_SECRET_AS_AUTH>PORT=3001
DB_HOST=localhost
DB_PORT=3306
DB_NAME=<YOUR_DB_NAME>
DB_USER=<YOUR_DB_USER>
DB_PASSWORD=<YOUR_DB_PASSWORD>
JWT_SECRET=<SAME_JWT_SECRET_AS_AUTH>
FLIGHT_SERVICE_URL=http://localhost:3000Create the required MySQL databases.
Example:
CREATE DATABASE auth_service;
CREATE DATABASE flight_service;
CREATE DATABASE booking_service;Inside each service:
npx sequelize-cli db:migrateRun the seeders for services that require initial data.
npx sequelize-cli db:seed:allThis initializes:
- Roles
- Airports
- Cities
- Airplanes
- Sample Flights (if available)
Open four separate terminals.
cd Auth-Service
npm startRuns on:
http://localhost:3002
cd Flight-Service
npm startRuns on:
http://localhost:3000
cd Booking-Service
npm startRuns on:
http://localhost:3001
cd Gateway-Service
npm startRuns on:
http://localhost:3005
Once all services are running, verify the Gateway:
GET http://localhost:3005/healthExpected response:
{
"success": true,
"gateway": {
"status": "UP"
},
"services": {
"auth": {
"status": "UP"
},
"booking": {
"status": "UP"
},
"flight": {
"status": "UP"
}
}
}| Service | Port |
|---|---|
| Gateway Service | 3005 |
| Flight Service | 3000 |
| Booking Service | 3001 |
| Auth Service | 3002 |
Run the automated validation scripts from the project root or the scratch/ directory (depending on your project structure).
Examples:
node scratch/test-e2e-real.jsnode scratch/test-gateway-proxy.jsnode scratch/test-gateway-health-agg.jsnode scratch/test-gateway-logging.jsnode scratch/test-gateway-rate-limiting.jsnode scratch/test-gateway-security.jsnode scratch/test-gateway-e2e.js- β All dependencies installed
- β MySQL databases created
- β Environment variables configured
- β Database migrations completed
- β Seeders executed
- β All four services running
- β
Gateway
/healthreports all services UP - β End-to-end test suite passes successfully
All client requests should be sent through the API Gateway.
Gateway Base URL
http://localhost:3005
The gateway transparently routes requests to the appropriate microservice.
| Gateway Route | Target Service | Internal Route |
|---|---|---|
/api/auth/* |
Auth Service | /api/v1/auth/* |
/api/flights/* |
Flight Service | /api/v1/* |
/api/bookings/* |
Booking Service | /api/v1/bookings/* |
/health |
Gateway | Local Endpoint |
POST /api/auth/register{
"email": "john@example.com",
"password": "Password123",
"firstname": "John",
"lastname": "Doe"
}{
"success": true,
"data": {
"id": 1,
"email": "john@example.com"
}
}POST /api/auth/login{
"email": "john@example.com",
"password": "Password123"
}{
"success": true,
"data": {
"accessToken": "...",
"refreshToken": "..."
}
}POST /api/auth/refresh{
"refreshToken": "<refresh_token>"
}Returns
- New Access Token
- New Refresh Token
The previous Refresh Token is revoked immediately.
POST /api/auth/logoutRevokes the current session.
GET /api/auth/meRequires:
Authorization: Bearer <access_token>
POST /api/flights/flightAuthorization Required
Bearer Token
Allowed Roles
- ADMIN
- AIRLINE_ADMIN
Example Request
{
"flightNumber": "AI202",
"airplaneId": 1,
"departureAirportId": 2,
"arrivalAirportId": 5,
"departureTime": "2026-09-20T09:00:00Z",
"arrivalTime": "2026-09-20T11:30:00Z",
"price": 4500
}GET /api/flights/flightExample
GET /api/flights/flight?departureAirportId=2&arrivalAirportId=5
PATCH /api/flights/flight/:idRequires ADMIN privileges.
DELETE /api/flights/flight/:idRequires ADMIN privileges.
POST /api/bookingsAuthorization Required
Bearer Token
Example
{
"flightId": 12,
"userId": 5,
"noOfSeats": 2
}PENDING
β
CONFIRMED
β
COMPLETED
or
EXPIRED
Gateway exposes a centralized health endpoint.
GET /healthExample Response
{
"success": true,
"gateway": {
"status": "UP"
},
"services": {
"auth": {
"status": "UP"
},
"booking": {
"status": "UP"
},
"flight": {
"status": "UP"
}
},
"timestamp": "2026-08-07T10:00:00Z"
}Protected routes require:
Authorization: Bearer <JWT_TOKEN>
Example
Authorization: Bearer eyJhbGciOi...| API | CUSTOMER | AIRLINE_ADMIN | ADMIN |
|---|---|---|---|
| Register | β | β | β |
| Login | β | β | β |
| View Flights | β | β | β |
| Search Flights | β | β | β |
| Create Booking | β | β | β |
| Create Flight | β | β | β |
| Update Flight | β | β | β |
| Delete Flight | β | β | β |
Register
β
Login
β
Access Token
β
Gateway
β
Protected API
β
Access Token Expired
β
Refresh Token
β
New Access Token
β
Continue
The project implements several production-grade security mechanisms.
| Feature | Status |
|---|---|
| JWT Authentication | β |
| Refresh Token Rotation | β |
| Replay Attack Protection | β |
| RBAC | β |
| Helmet Security Headers | β |
| CORS | β |
| Rate Limiting | β |
| Structured Logging | β |
| Request Tracing | β |
| Health Monitoring | β |
| Status | Meaning |
|---|---|
| 200 | Success |
| 201 | Resource Created |
| 204 | No Content |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Resource Not Found |
| 409 | Conflict |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
All APIs return a consistent error structure.
{
"success": false,
"message": "Unauthorized",
"error": {}
}β API Gateway
β Reverse Proxy Routing
β JWT Authentication
β Refresh Token Rotation (RTR)
β Replay Attack Detection
β Role-Based Access Control
β Health Aggregation
β Structured Request Logging
β Request ID Tracing
β Rate Limiting
β Helmet Security
β CORS
β Failure Recovery
β End-to-End Production Validation
The Flight Booking System has been extensively tested through unit, integration, and end-to-end (E2E) validation to ensure reliability, security, and production readiness.
The project follows a multi-layered testing approach.
Testing Strategy
β
ββββββββββββββββββΌββββββββββββββββββ
βΌ βΌ βΌ
Unit Tests Integration Tests E2E Tests
β
βΌ
Production Validation
| Category | Status |
|---|---|
| Authentication | β |
| Authorization (RBAC) | β |
| JWT Validation | β |
| Refresh Token Rotation | β |
| Replay Attack Protection | β |
| Flight Management | β |
| Booking Management | β |
| API Gateway | β |
| Reverse Proxy | β |
| Health Aggregation | β |
| Request Logging | β |
| Request Tracing | β |
| Rate Limiting | β |
| Helmet Security | β |
| CORS | β |
| Failure Recovery | β |
| End-to-End Validation | β |
The entire microservices ecosystem was validated using automated test suites.
- Gateway Service
- Auth Service
- Flight Service
- Booking Service
β User Registration
β Login
β JWT Generation
β Access Token Validation
β Refresh Token Rotation
β Logout
β Session Revocation
β Replay Attack Detection
Verified role-based access for:
| Role | Read | Write |
|---|---|---|
| CUSTOMER | β | β |
| AIRLINE_ADMIN | β | β |
| ADMIN | β | β |
Unauthorized write requests correctly return 403 Forbidden.
The API Gateway was validated for:
- Reverse Proxy Routing
- Transparent Header Forwarding
- Query Parameter Preservation
- Request Body Preservation
- Request ID Propagation
- Health Aggregation
- Request Logging
- Security Middleware
Verified:
- Per-IP request limiting
- Sliding window reset
- OPTIONS preflight bypass
- Health endpoint bypass
- Standard RateLimit headers
- Independent client isolation
The following security mechanisms were verified.
| Security Feature | Verified |
|---|---|
| JWT Authentication | β |
| Refresh Token Rotation | β |
| Replay Protection | β |
| Helmet Headers | β |
| CORS | β |
| RBAC | β |
| Structured Logging | β |
| Request Tracing | β |
Every service exposes a health endpoint.
| Service | Endpoint |
|---|---|
| Gateway | /health |
| Auth | /api/v1/info |
| Flight | /api/v1/info |
| Booking | /api/v1/info |
The Gateway aggregates all downstream health checks into a single response.
Measured during end-to-end validation.
| Operation | Average Latency |
|---|---|
| Gateway Middleware | < 1 ms |
| Reverse Proxy | ~20β30 ms |
| Health Aggregation | ~70β80 ms |
| Flight Creation | ~200β250 ms |
| Booking Creation | ~150β250 ms |
Actual timings may vary depending on hardware and database performance.
Every incoming request passing through the Gateway generates a structured JSON log entry.
Example:
{
"requestId": "eb722fdb-58fa-41ac-87d7-1a3f57e07462",
"method": "POST",
"url": "/api/bookings",
"statusCode": 201,
"responseTimeMs": 63.9,
"clientIp": "::1",
"userAgent": "node",
"service": "Gateway"
}Sensitive information such as:
- Passwords
- JWT Tokens
- Cookies
- Authorization Headers
- Request Bodies
are intentionally excluded.
| Feature | Status |
|---|---|
| JWT Authentication | β |
| Refresh Token Rotation | β |
| Replay Attack Detection | β |
| RBAC | β |
| Helmet | β |
| CORS | β |
| Rate Limiting | β |
| Structured Logging | β |
| Request Tracing | β |
| Health Monitoring | β |
| Category | Score |
|---|---|
| Architecture | 9.0 / 10 |
| Security | 9.5 / 10 |
| Reliability | 9.0 / 10 |
| Performance | 9.0 / 10 |
| Maintainability | 9.5 / 10 |
| Scalability | 8.5 / 10 |
Status: β Ready with Minor Improvements
Before deploying to production:
- JWT Authentication
- RBAC
- API Gateway
- Reverse Proxy
- Health Monitoring
- Structured Logging
- Request Tracing
- Helmet Security
- CORS
- Rate Limiting
- End-to-End Testing
- Production Review
The current implementation is production-ready, with the following enhancements recommended for enterprise-scale deployments:
- Redis-backed distributed rate limiting
- Docker & Docker Compose
- Kubernetes deployment
- OpenTelemetry distributed tracing
- Circuit breakers (e.g., Opossum)
- Service discovery (Consul/Eureka)
- Asynchronous messaging (RabbitMQ/Kafka)
- CI/CD pipeline (GitHub Actions)
- Prometheus & Grafana monitoring
β Microservices Architecture
β API Gateway
β JWT Authentication
β Refresh Token Rotation (RTR)
β Replay Attack Protection
β Role-Based Access Control (RBAC)
β Health Aggregation
β Structured Logging
β Request Tracing
β Rate Limiting
β Helmet Security
β CORS
β Failure Recovery
β End-to-End Production Validation
β Production Readiness Review
Screenshots and GIFs will be added here.
A complete walkthrough of the project is available here:
πΊ YouTube Demo: (Coming Soon)
The demo covers:
- User Registration
- Login
- Flight Creation
- Flight Search
- Booking Creation
- Gateway Routing
- Health Aggregation
- Request Logging
- Rate Limiting
- Security Headers
- Failure Recovery
- End-to-End Validation
- Authentication Service
- Flight Service
- Booking Service
- API Gateway
- JWT Authentication
- Refresh Token Rotation
- Replay Attack Protection
- Role-Based Access Control (RBAC)
- Reverse Proxy
- Health Aggregation
- Request Logging
- Request Tracing
- Rate Limiting
- Helmet Security
- CORS
- End-to-End Validation
- Production Readiness Review
- Docker Support
- Docker Compose
- Kubernetes Deployment
- Redis Rate Limiting
- OpenTelemetry
- Grafana Dashboard
- Prometheus Monitoring
- RabbitMQ
- Kafka Event Streaming
- Circuit Breakers
- Service Discovery
- CI/CD Pipeline
- GitHub Actions
- Terraform Deployment
- AWS Deployment
Contributions are welcome!
If you would like to improve this project:
-
Fork the repository
-
Create a new branch
git checkout -b feature/your-feature- Commit your changes
git commit -m "feat: add new feature"- Push the branch
git push origin feature/your-feature- Open a Pull Request
This project helped me gain practical experience with:
- Microservices Architecture
- API Gateway Pattern
- JWT Authentication
- Refresh Token Rotation (RTR)
- Replay Attack Protection
- Role-Based Access Control (RBAC)
- Reverse Proxy
- REST API Design
- Database Transactions
- MySQL & Sequelize ORM
- Structured Logging
- Request Tracing
- Health Monitoring
- Rate Limiting
- Helmet Security
- CORS
- Production Validation
- Backend System Design
- Node.js
- Express.js
- Sequelize ORM
- MySQL
- JWT
- Winston
- Helmet
- Express Rate Limit
- HTTP Proxy Middleware
Backend Developer | Computer Science Student
Passionate about building scalable backend systems, distributed architectures, and secure APIs.
If you found this project helpful:
β Star this repository
π΄ Fork the repository
π οΈ Suggest improvements
π’ Share it with others
This project is licensed under the MIT License.
See the LICENSE file for more information.
Special thanks to the open-source community and the maintainers of:
- Node.js
- Express.js
- Sequelize
- MySQL
- Winston
- Helmet
- express-rate-limit
- http-proxy-middleware
for providing the tools that made this project possible.




