RESTful API for Smart Waste Management System MVP built with Node.js, Express, MongoDB, and Socket.IO.
- β Complete CRUD operations for all entities
- β OData-like query capabilities (filtering, sorting, pagination)
- β Real-time request/response logging with Socket.IO
- β Interactive Swagger API documentation
- β Real-time logger UI for debugging
- β Route optimization algorithm
- β Geospatial queries for nearby bins
- β Comprehensive error handling
- β 4 user role controllers (Citizen, Coordinator, Technician, Admin)
- Node.js 18+ installed
- MongoDB 6+ (local or MongoDB Atlas)
- npm or yarn package manager
cd waste-management-backendnpm installEdit the .env file with your MongoDB connection string:
NODE_ENV=development
PORT=5000
MONGODB_URI=mongodb://localhost:27017/waste-management
# For MongoDB Atlas:
# MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/waste-management
ENABLE_SWAGGER=true
ENABLE_LOGGER_UI=true
ENABLE_CORS=true
CORS_ORIGINS=http://localhost:3000,http://192.168.1.100:3000
DEFAULT_PAGE_SIZE=20
MAX_PAGE_SIZE=100# Windows
mongod
# macOS/Linux
sudo systemctl start mongod# Development with auto-reload
npm run dev
# Production
npm startThe server will start on http://localhost:5000
- Root:
http://localhost:5000/ - Health Check:
http://localhost:5000/health - API Documentation:
http://localhost:5000/api-docs - Real-time Logger:
http://localhost:5000/logs
POST /api/citizen/requests- Create waste pickup requestGET /api/citizen/requests- Get user's requests (with OData filtering)GET /api/citizen/requests/:id- Track specific request with timelinePUT /api/citizen/requests/:id/payment- Update payment statusPUT /api/citizen/requests/:id/cancel- Cancel requestGET /api/citizen/bins/nearby- Find nearby smart bins (geospatial)
GET /api/coordinator/dashboard- Get dashboard with statisticsGET /api/coordinator/bins- Get bins with fill levels (color-coded)GET /api/coordinator/requests/pending- Get pending special requestsPUT /api/coordinator/requests/:id/approve- Approve requestPUT /api/coordinator/requests/:id/reject- Reject requestPOST /api/coordinator/routes/optimize- Generate optimized routePOST /api/coordinator/routes- Create routeGET /api/coordinator/routes- Get routes (with filtering)PUT /api/coordinator/routes/:id/assign- Assign route to crewPUT /api/coordinator/routes/:id/status- Update route statusPUT /api/coordinator/routes/:id/stops/:stopIndex- Update stop status
GET /api/technician/work-orders- Get work orders (with priority filtering)GET /api/technician/work-orders/:id- Get work order detailsPUT /api/technician/work-orders/:id/assign- Assign work orderPUT /api/technician/work-orders/:id/start- Start work orderPUT /api/technician/work-orders/:id/resolve- Resolve work orderPUT /api/technician/work-orders/:id/escalate- Escalate work orderPOST /api/technician/devices/register- Register new deviceGET /api/technician/devices/:id- Get device details
GET /api/admin/users- Get all users (with filtering)POST /api/admin/users- Create new userPUT /api/admin/users/:id/role- Update user role/statusDELETE /api/admin/users/:id- Deactivate userGET /api/admin/reports/collections- Collection statisticsGET /api/admin/reports/efficiency- Route efficiency metricsGET /api/admin/reports/devices- Device uptime reportsGET /api/admin/system/health- System health statusGET /api/admin/dashboard- Admin dashboard statisticsGET /api/admin/export- Export data
The API supports OData-like querying with powerful filtering capabilities:
# Equal
GET /api/citizen/requests?status=pending
# Not equal
GET /api/coordinator/bins?status[ne]=offline
# Greater than
GET /api/coordinator/bins?fillLevel[gt]=70
# Greater than or equal
GET /api/admin/users?createdAt[gte]=2025-01-01
# Less than
GET /api/coordinator/bins?fillLevel[lt]=50
# Contains (case-insensitive)
GET /api/admin/users?name[contains]=john
# In (multiple values)
GET /api/citizen/requests?status[in]=pending,approved,scheduled
# Not in
GET /api/admin/users?role[nin]=admin,coordinator# Single field ascending
GET /api/citizen/requests?sort=createdAt:asc
# Single field descending
GET /api/coordinator/bins?sort=fillLevel:desc
# Multiple fields
GET /api/admin/users?sort=role:asc,createdAt:desc# Page 1, 20 items per page (default)
GET /api/citizen/requests?page=1&limit=20
# Page 2, 50 items per page
GET /api/coordinator/bins?page=2&limit=50# Select specific fields
GET /api/admin/users?select=name,email,role
# Alternative syntax
GET /api/admin/users?fields=name,email,status# Combine multiple filters
GET /api/citizen/requests?userId=123&status[in]=pending,scheduled&sort=createdAt:desc&page=1&limit=10
# Date range
GET /api/admin/users?createdAt[gte]=2025-01-01&createdAt[lte]=2025-12-31
# Multiple conditions
GET /api/coordinator/bins?fillLevel[gte]=70&status=active&binType=general&sort=fillLevel:desc- Open
http://localhost:5000/api-docs - Explore available endpoints
- Try out requests directly in the browser
# Create a waste request
curl -X POST http://localhost:5000/api/citizen/requests \
-H "Content-Type: application/json" \
-d '{
"userId": "USER_ID_HERE",
"wasteType": "household",
"quantity": "2 bags",
"address": {
"street": "123 Main St",
"city": "Colombo",
"coordinates": { "lat": 6.9271, "lng": 79.8612 }
},
"preferredDate": "2025-10-20",
"description": "Regular pickup"
}'
# Get user's requests with filtering
curl "http://localhost:5000/api/citizen/requests?userId=USER_ID&status[in]=pending,scheduled&sort=createdAt:desc"
# Get nearby bins
curl "http://localhost:5000/api/citizen/bins/nearby?lat=6.9271&lng=79.8612&radius=2000"Import the Swagger specification from /api-docs or manually create requests.
- Create account at MongoDB Atlas
- Create a free cluster
- Get connection string
- Update
.envwith connection string:MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/waste-management - Whitelist IP address (0.0.0.0/0 for all IPs or specific IPs)
- Push code to GitHub
- Create new App in Digital Ocean
- Connect GitHub repository
- Add environment variables
- Deploy
- Create Ubuntu droplet
- SSH into droplet
- Install Node.js and MongoDB
- Clone repository
- Install dependencies
- Configure environment
- Use PM2 for process management:
npm install -g pm2
pm2 start server.js --name waste-api
pm2 startup
pm2 saveFROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 5000
CMD ["npm", "start"]docker build -t waste-api .
docker run -p 5000:5000 --env-file .env waste-apiUpdate these in your deployment platform:
NODE_ENV=production
PORT=5000
MONGODB_URI=your_mongodb_atlas_connection_string
ENABLE_SWAGGER=true
ENABLE_LOGGER_UI=true
ENABLE_CORS=true
CORS_ORIGINS=https://your-frontend-domain.com,https://your-mobile-app-domain.com
DEFAULT_PAGE_SIZE=20
MAX_PAGE_SIZE=100Access the real-time logger at http://localhost:5000/logs
Features:
- Live request/response monitoring
- Color-coded by HTTP method and status
- Filter by method (GET, POST, PUT, DELETE)
- Search functionality
- Pause/Resume logging
- Clear logs
- Auto-scroll
Full interactive API documentation available at http://localhost:5000/api-docs
Features:
- Try out API endpoints directly
- View request/response schemas
- See example payloads
- Authentication support (for future auth implementation)
waste-management-backend/
βββ src/
β βββ config/
β β βββ database.js # MongoDB connection
β βββ models/
β β βββ User.model.js # User schema
β β βββ WasteRequest.model.js # Waste request schema
β β βββ SmartBin.model.js # Smart bin schema
β β βββ Route.model.js # Collection route schema
β β βββ WorkOrder.model.js # Work order schema
β β βββ Device.model.js # IoT device schema
β βββ controllers/
β β βββ citizen.controller.js # Citizen operations
β β βββ coordinator.controller.js # Coordinator operations
β β βββ technician.controller.js # Technician operations
β β βββ admin.controller.js # Admin operations
β βββ routes/
β β βββ citizen.routes.js
β β βββ coordinator.routes.js
β β βββ technician.routes.js
β β βββ admin.routes.js
β β βββ logs.routes.js # Logger UI route
β βββ middleware/
β β βββ logger.js # Request logger
β β βββ queryBuilder.js # OData query builder
β β βββ errorHandler.js # Error handler
β βββ services/
β β βββ socketLogger.service.js # Socket.IO logger
β β βββ routeOptimizer.service.js # Route optimization
β β βββ notification.service.js # Notifications (stub)
β βββ utils/
β βββ response.js # Response helpers
β βββ helpers.js # Utility functions
βββ docs/
β βββ swagger.js # Swagger configuration
βββ uploads/ # File uploads directory
βββ .env # Environment variables
βββ .env.example # Environment template
βββ .gitignore
βββ package.json
βββ server.js # Main server file
βββ README.md
{
"start": "node server.js",
"dev": "nodemon server.js"
}- Create controller method in
src/controllers/ - Add route in
src/routes/ - Document with Swagger annotations
- Test with Swagger UI or cURL
Real-time logs available at http://localhost:5000/logs
All requests are logged to console with:
- HTTP method
- Path
- Status code
- Duration
Test endpoints and view responses at /api-docs
For issues or questions, please contact the development team.
ISC
Version: 1.0.0
Last Updated: October 2025
Built with: Node.js, Express, MongoDB, Socket.IO