Express.js backend for the assignment shown in the image: employers can post jobs, candidates can upload resumes and apply, applications can be tracked, employers receive notifications, and admins can inspect users and reports.
- Node.js + Express.js
- Multer for resume uploads
- JSON file storage for easy local setup
- Manual model validation and service/repository layers
- REST API with search filters, pagination, status updates, notifications, and reports
cd outputs/job-board-express-backend
npm install
copy .env.example .env
npm run devThe API runs at:
http://localhost:5000/api
Health check:
curl http://localhost:5000/healthsrc/
app.js
server.js
config/
controllers/
data/
database/
middleware/
models/
routes/
services/
utils/
uploads/
scripts/
{
id,
companyName,
contactName,
email,
phone,
website,
location,
description,
createdAt,
updatedAt
}{
id,
fullName,
email,
phone,
location,
skills,
experienceYears,
createdAt,
updatedAt
}{
id,
employerId,
title,
description,
location,
jobType,
workplaceType,
salaryMin,
salaryMax,
skillsRequired,
status,
postedAt,
closingDate,
createdAt,
updatedAt
}{
id,
candidateId,
originalName,
storedName,
mimeType,
size,
path,
parsedSkills,
uploadedAt,
updatedAt
}{
id,
jobId,
candidateId,
resumeId,
coverLetter,
status,
statusHistory,
appliedAt,
updatedAt
}{
id,
employerId,
applicationId,
type,
message,
read,
createdAt
}POST /api/employersGET /api/employersGET /api/employers/:idPATCH /api/employers/:idDELETE /api/employers/:idGET /api/employers/:employerId/notifications
POST /api/candidatesGET /api/candidatesGET /api/candidates/:idPATCH /api/candidates/:idDELETE /api/candidates/:idGET /api/candidates/:candidateId/resumes
POST /api/jobsGET /api/jobsGET /api/jobs/:idPATCH /api/jobs/:idDELETE /api/jobs/:id
Job search supports:
q, location, jobType, workplaceType, skills, salaryMin, salaryMax, employerId, status, page, limit, sort
Example:
curl "http://localhost:5000/api/jobs?q=node&location=remote&skills=express,javascript&salaryMin=50000"POST /api/resumes/uploadGET /api/resumes/:idDELETE /api/resumes/:id
Upload example:
curl -X POST http://localhost:5000/api/resumes/upload \
-F "candidateId=cand_1" \
-F "parsedSkills=Node.js,Express,SQL" \
-F "resume=@resume.pdf"POST /api/applicationsGET /api/applicationsGET /api/applications/:idGET /api/applications/:id/timelinePATCH /api/applications/:id/status
Apply example:
curl -X POST http://localhost:5000/api/applications \
-H "Content-Type: application/json" \
-d "{\"jobId\":\"job_1\",\"candidateId\":\"cand_1\",\"resumeId\":\"res_1\",\"coverLetter\":\"I am interested.\"}"Status update example:
curl -X PATCH http://localhost:5000/api/applications/app_1/status \
-H "Content-Type: application/json" \
-d "{\"status\":\"shortlisted\",\"note\":\"Strong Node.js background\"}"GET /api/employers/:employerId/notificationsPATCH /api/notifications/:id/read
GET /api/admin/statsGET /api/admin/usersGET /api/admin/reports/applicationsGET /api/admin/reports/jobs
The project uses a JSON datastore so it is easy to run and inspect for coursework. In production, the repository layer can be replaced with MongoDB, PostgreSQL, Prisma, Sequelize, or another database without changing the controller API shape.