Welcome to the backend of a full-fledged real-time chat system β built from scratch using Node.js, Express, MongoDB, and Socket.IO π
π’ From real-time messaging, offline delivery, read receipts, profile editing, admin tools, and even a chatbot β this backend is loaded.
β Tested purely with Postman & Socket.IO Client Tool β no frontend needed.
- Node.js + Express β API and server logic
- MongoDB + Mongoose β Database and models
- Socket.IO β Real-time messaging, delivery, typing, read events
- Postman + Socket.IO Client Tool β API and event testing
- JWT Auth β Secure user endpoints
- Nodemon β Auto-reload during dev
POST /registerβ New user registrationPOST /loginβ Login and receive JWT token- JWT-protected routes for profile and admin
- On socket connect, emit
register - Backend:
- Stores
username β socketIdin memory - Marks user as online
- Pushes undelivered messages
- Stores
- Instantly delivers if receiver online
- Saves to DB regardless
- Handles
deliveredstatus
- When a user connects:
- All
delivered: falsemessages are pushed - Status updated in DB
- All
- Mark messages as
seen: true - Notifies original sender via
seenAckevent
typingandstop-typingevents supported
- Emits
onlineStatusupdates to all users GET /api/users/onlinereturns list of active users
- Send messages to Bot like:
"hello","who are you","joke","bye"
- Bot responds with hardcoded replies
JWT role-based admin with these routes:
| Route | Description |
|---|---|
DELETE /admin/users/:id |
Delete any user |
DELETE /admin/messages/:id |
Delete any message |
POST /admin/freeze/:id |
Freeze a user (disable sending) |
POST /admin/unfreeze/:id |
Unfreeze a user |
GET /api/users/profile/meβ Get your profilePUT /api/users/profile/meβ Edit bio or avatarGET /api/users/profile/:usernameβ View others' profilesGET /api/users/β List all users (except self)
-
GET /api/messages/analytics
β Returns:{ "totalMessages": 145, "delivered": 140, "seen": 100, "undelivered": 5 } -
GET /api/messages/export
β Download all your messages in.txtformat
Socket.IO Client Tool:
- Emit
registerβ"mehul" - Emit
sendMessageβ{ sender, receiver, message } - Emit
messageSeenβ{ sender, receiver } - Emit
typingβ{ to }, thenstop-typing
Postman:
- Auth:
POST /register,POST /login - Protected routes (use Bearer token in header):
GET /api/users/GET /api/users/profile/mePUT /api/users/profile/meGET /api/messages/history?user1=A&user2=B- Admin routes (
/admin/...) - Bot via regular
sendMessagewithreceiver: "Bot"
chat-backend/
βββ server.js
βββ config/
β βββ db.js
βββ models/
β βββ User.js
β βββ Message.js
βββ routes/
β βββ messageRoutes.js
β βββ userRoutes.js
β βββ statusRoutes.js
β βββ adminRoutes.js
β βββ onlineRoute.js
βββ sockets/
β βββ chat.js
βββ utils/
β βββ userStore.js
βββ middleware/
β βββ auth.js
βββ .env
βββ package.json
βββ README.md
Mehul Khanna
Backend Developer Intern Β· 2025
Passionate about building real-time scalable systems π»π₯
Donβt forget to star β the repo and fork if you'd like to build on top of it!