Node.js backend assignment for managing agents, users, accounts, policies, policy categories, and carriers using MongoDB.
- Node.js
- Express.js
- MongoDB
- Mongoose
- BullMQ + Redis
- Worker Threads
- Multer
- XLSX
- Upload XLSX/CSV policy data
- Process uploaded data using Worker Threads
- Store data in separate MongoDB collections
- Search policies using username/account name
- Aggregate policies by user
- Monitor Node.js CPU usage and restart at 70%
- Schedule messages using BullMQ + Redis
src/
├── config/
├── controllers/
├── db/
├── model/
├── routes/
├── workers/
└── server.js
Create a .env file:
PORT=
DB_URI=
REDIS_HOST=
REDIS_PORT=git clone https://github.com/Ashutosh-pixel/policy_backend.git
cd policy_backend
npm installMake sure Redis is running:
redis-serverpm2 restart backendpm2 stop backendThe BullMQ worker runs separately:
npm run worker POST /api/upload/Form-data:
file: policies.xlsx
Supports XLSX/CSV files.
GET /api/uploadGET /api/policy/search?username=GET /api/policy/?page=&limit=POST /api/messageRequest body:
{
"message": "Policy renewal reminder",
"day": "2026-08-25",
"time": "15:30"
}The message is inserted into MongoDB at the scheduled time.
UserAccount.accountNameis treated as the username.PolicyInfo.userIdis used to find all policies belonging to a user.- Redis stores scheduled BullMQ jobs, so scheduled jobs are not dependent on Node.js memory.
- The message worker must be running separately for scheduled jobs to be processed.
erDiagram
AGENT ||--o{ POLICY_INFO : "has"
USER ||--o{ USER_ACCOUNT : "has"
USER ||--o{ POLICY_INFO : "has"
POLICY_CATEGORY ||--o{ POLICY_INFO : "categorizes"
POLICY_CARRIER ||--o{ POLICY_INFO : "provides"
AGENT {
ObjectId _id PK
string agentName UK
}
USER {
ObjectId _id PK
string firstName
date dob
string address
string phone
string state
string zipCode
string email
string gender
string userType
}
USER_ACCOUNT {
ObjectId _id PK
string accountName UK
ObjectId userId FK
}
POLICY_INFO {
ObjectId _id PK
string policyNumber UK
date policyStartDate
date policyEndDate
ObjectId policyCategoryId FK
ObjectId carrierId FK
ObjectId userId FK
ObjectId agentId FK
}
POLICY_CATEGORY {
ObjectId _id PK
string categoryName UK
}
POLICY_CARRIER {
ObjectId _id PK
string companyName UK
}