FindRedDrop is a MERN-stack blood donation support application. This repository contains the REST API backend server that powers user registration helpers, blood request management, funding records, admin analytics, and public donor search.
- Backend type: REST API server
- Framework: Express.js
- Database: MongoDB
- Auth: JWT verification via JWKS
- Primary role: Manage blood donation requests, user data, funding records, and admin operations
- Frontend repository: https://github.com/pritom-banik/FindRedDrop
- Live frontend: https://find-red-drop.vercel.app/
index.js— main server entrypointconfig/database.js— MongoDB connection helpermiddlewire/middlewire.js— authentication middlewaremodules/registration— registration helper routes and controllersmodules/request— blood request CRUD routes and controllersmodules/userinfo— user request and funding endpointsmodules/admin— admin analytics, user management, and public donor searchextras/welcome.js— root welcome response
- Node.js installed
- MongoDB instance or MongoDB Atlas cluster
.envfile with required environment variables
npm installThe .env file structure :
PORT=
MONGODB_URI=
DATABASE_NAME=
CLIENT_URL=PORT— port to run the server on (default5002)MONGODB_URI— MongoDB connection stringDATABASE_NAME— the database name used by this backendCLIENT_URL— URL of the frontend/auth provider used to resolve JWKS
npm startThe server starts after MongoDB connects successfully.
All endpoints are mounted under:
/api
The root route is available at GET / and returns a simple welcome message.
Protected endpoints require an Authorization header:
Authorization: Bearer <token>The middleware verifies JWTs using JWKS resolved from:
${process.env.CLIENT_URL}/api/auth/jwks
- Returns a sorted list of districts.
- Response fields:
name,id
- Returns upazilas for a given district.
- Path parameter:
districtId - Response fields:
id,name
- Creates a new blood request.
- Protected route
- Request body: any fields required by the client, plus backend adds
createdAtandupdatedAt. - Response: insert result with inserted ID.
- Returns pending blood requests.
- Query params:
page(default1)limit(default10)
- Response includes:
recipientNamedistrictupazilabloodGroupdonationDatedonationTimestatus
- Returns details of a single blood request.
- Protected route
- Path parameter:
id
- Updates status of a blood request.
- Protected route
- Path parameter:
id - Request body must include
status. - Supported
statusvalues:doneinprogresscancel
- For
inprogress, body may also containdonorEmailanddonorName.
- Updates a blood request record.
- Protected route
- Path parameter:
id - Requires
requesterIdin the body for authorization. - Any other request fields are updated and
updatedAtis refreshed.
- Deletes a blood request with
status: pendingonly. - Protected route
- Path parameter:
id
- Returns blood requests created by a user.
- Protected route
- Path parameter:
id= requester/user ID - Query params:
page(default1)limit(default5)status(useallto disable status filtering)
- Stores funding details.
- Protected route
- Request body: funding data from client
- Backend adds
createdAt
- Returns funding records.
- Protected route
- Query params:
page(default1)limit(default10)
- Response includes
name,amount,createdAt
- Returns blood requests for admin review.
- Protected route
- Request body must contain
roleequal toadminorvolunteer. - Query params:
page(default1)limit(default5)status(useallto skip status filtering)
- Returns users for admin management.
- Protected route
- Request body must contain
roleequal toadmin. - Query params:
page(default1)limit(default5)status(useallto skip status filtering)
- Updates user
status. - Protected route
- Path parameter:
id - Request body must include:
statusme=admin
- Updates user
role. - Protected route
- Path parameter:
id - Request body must include:
roleme=admin
- Returns the total count of users.
- Protected route
- Returns the total funding amount across all funding records.
- Protected route
- Returns aggregated blood request counts:
totalRequeststotalPendingtotalInprogresstotalDonetotalCancel
- Protected route
- Public donor search endpoint.
- Optional query params:
page(default1)limit(default5)bloodGroupdistrictupazila
- Returns active donors and volunteers.
- Only users with
status: activeandroleindonororvolunteerare returned.
- The backend accepts JSON requests via
express.json(). - CORS is enabled for cross-origin support.
- Admin and protected routes rely on
middlewire.verifyToken. - The server logs
Welcome to FindRedDrop at port <PORT>after successful startup.
- Pritom Banik (Jun 30, 2026)