This repository contains a small LeetCode-style backend split into three Node.js microservices:
ProblemServiceSubmissionServiceEvaluationService
Together they provide problem management, submission intake, asynchronous judging, and verdict persistence.
ProblemService- Owns coding problems and test cases
- Stores data in MongoDB
- Sanitizes markdown content before persistence
SubmissionService- Accepts user code submissions
- Verifies the referenced problem through
ProblemService - Stores submissions in MongoDB
- Publishes jobs to Redis/BullMQ
EvaluationService- Consumes queued submission jobs
- Runs code in Docker containers
- Compares outputs against test cases
- Pushes verdicts back to
SubmissionService
- MongoDB
- One database for problems
- One database for submissions
- Redis
- Shared queue transport between submission and evaluation services
- Docker
- Sandboxed code execution in the evaluation layer
- A problem is created in
ProblemService. - A client submits code to
SubmissionServicewithproblemId,code, andlanguage. SubmissionServicefetches the problem definition fromProblemService.- The submission is saved with status
pending. - A BullMQ job is pushed to Redis queue
submissionQueue. EvaluationServiceconsumes the job.- The submitted code is run once per test case inside Docker.
EvaluationServicecomputes a final verdict.EvaluationServicecalls back toSubmissionServiceto update the submission record.
.
├── ProblemService
├── SubmissionService
└── EvaluationService
Each service is independently installable and runnable.
| Service | Default Port | Key Dependencies |
|---|---|---|
ProblemService |
3000 |
MongoDB |
SubmissionService |
3001 |
MongoDB, Redis, ProblemService |
EvaluationService |
3002 |
Redis, Docker, SubmissionService |
- Start MongoDB
- Start Redis
- Start
ProblemService - Start
SubmissionService - Start
EvaluationService
Install dependencies inside each service:
cd ProblemService && npm install
cd ../SubmissionService && npm install
cd ../EvaluationService && npm installCreate .env files for each service using the defaults documented in the service-specific README files.
Run the services in separate terminals:
cd ProblemService && npm run dev
cd SubmissionService && npm run dev
cd EvaluationService && npm run devPOST /api/v1/problemsGET /api/v1/problemsGET /api/v1/problems/:idPUT /api/v1/problems/:idDELETE /api/v1/problems/:idGET /api/v1/problems/difficulty/:difficultyGET /api/v1/problems/search/:query
POST /api/v1/submissionsGET /api/v1/submissions/:idGET /api/v1/submissions/problem/:problemIdPUT /api/v1/submissions/:idDELETE /api/v1/submissions/:id
GET /api/v1/pingGET /api/v1/ping/health
SubmissionService publishes jobs shaped like:
{
"submissionId": "string",
"problem": {
"id": "string",
"title": "string",
"description": "string",
"difficulty": "easy",
"editorial": "string",
"testcases": [
{
"input": "string",
"output": "string"
}
]
},
"code": "string",
"language": "python"
}EvaluationService updates SubmissionService with:
{
"status": "accepted",
"submissionData": {
"status": "accepted",
"output": ["AC", "AC"]
}
}All three services:
- generate a correlation ID per request
- use
AsyncLocalStorageto make it available to logs - write logs to console and rotating log files under
logs/
- There is no shared root-level orchestration for all services; only
EvaluationServiceincludes adocker-compose.yml. ProblemServiceandSubmissionServiceeach expose an empty/api/v2router.ProblemServicesearch routing andSubmissionServiceproblem-filter routing have parameter mismatches in controller usage.EvaluationServiceis configured for both Python and C++, but startup image pre-pull currently covers Python only.- No automated tests are present in the repository at the moment.
- Add a root
docker-compose.ymlfor MongoDB, Redis, and all three services. - Normalize environment variable names, especially
DB_URLvsDB_URI. - Fix route/controller mismatches and validate all update endpoints.
- Add integration tests for the full submission-to-verdict flow.
- Harden code execution input handling beyond shell
echoinjection.