Skip to content

Commit 667acc0

Browse files
committed
feat:implements backend routes and db
1 parent 7f74aa2 commit 667acc0

17 files changed

Lines changed: 2488 additions & 28 deletions

api/package-lock.json

Lines changed: 1911 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/package.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "monkeycode-api",
3+
"version": "1.0.0",
4+
"description": "API for storing MonkeyCode scan reports",
5+
"main": "dist/index.js",
6+
"scripts": {
7+
"build": "tsc",
8+
"start": "node dist/index.js",
9+
"dev": "ts-node-dev --respawn src/index.ts"
10+
},
11+
"dependencies": {
12+
"axios": "^1.9.0",
13+
"cors": "^2.8.5",
14+
"dotenv": "^16.3.1",
15+
"express": "^4.18.2",
16+
"mongoose": "^8.1.0"
17+
},
18+
"devDependencies": {
19+
"@types/cors": "^2.8.17",
20+
"@types/express": "^4.17.21",
21+
"ts-node": "^10.9.2",
22+
"ts-node-dev": "^2.0.0",
23+
"typescript": "^5.3.3"
24+
}
25+
}

api/src/index.js

Lines changed: 55 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/src/index.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/src/index.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import express from 'express';
2+
import mongoose from 'mongoose';
3+
import cors from 'cors';
4+
import dotenv from 'dotenv';
5+
import { ScanReport } from './models/ScanReport';
6+
7+
dotenv.config();
8+
9+
const app = express();
10+
const port = process.env.PORT || 3000;
11+
12+
// Middleware
13+
app.use(cors());
14+
app.use(express.json());
15+
16+
// Connect to MongoDB
17+
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/monkeycode')
18+
.then(() => console.log('Connected to MongoDB'))
19+
.catch(err => console.error('MongoDB connection error:', err));
20+
21+
// Store scan report endpoint
22+
app.post('/api/scan-reports', async (req, res) => {
23+
try {
24+
const scanReport = new ScanReport(req.body);
25+
await scanReport.save();
26+
res.status(201).json({ message: 'Scan report stored successfully', scanId: scanReport.scanId });
27+
} catch (error: unknown) {
28+
console.error('Error storing scan report:', error);
29+
if (error instanceof mongoose.Error.ValidationError) {
30+
res.status(400).json({ error: 'Invalid scan report data' });
31+
} else if (error && typeof error === 'object' && 'code' in error && error.code === 11000) {
32+
res.status(409).json({ error: 'Scan report with this ID already exists' });
33+
} else {
34+
res.status(500).json({ error: 'Internal server error' });
35+
}
36+
}
37+
});
38+
39+
// Get scan report by ID
40+
app.get('/api/scan-reports/:scanId', async (req, res) => {
41+
try {
42+
const scanReport = await ScanReport.findOne({ scanId: req.params.scanId });
43+
if (!scanReport) {
44+
return res.status(404).json({ error: 'Scan report not found' });
45+
}
46+
res.json(scanReport);
47+
} catch (error) {
48+
console.error('Error retrieving scan report:', error);
49+
res.status(500).json({ error: 'Internal server error' });
50+
}
51+
});
52+
53+
app.listen(port, () => {
54+
console.log(`Server running on port ${port}`);
55+
});

api/src/models/ScanReport.js

Lines changed: 45 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/src/models/ScanReport.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/src/models/ScanReport.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import mongoose from 'mongoose';
2+
3+
const scanReportSchema = new mongoose.Schema({
4+
scanId: { type: String, required: true, unique: true },
5+
timestamp: { type: String, required: true },
6+
summary: {
7+
totalVulnerabilities: { type: Number, required: true },
8+
criticalVulnerabilities: { type: Number, required: true },
9+
highVulnerabilities: { type: Number, required: true },
10+
mediumVulnerabilities: { type: Number, required: true },
11+
lowVulnerabilities: { type: Number, required: true },
12+
totalUsages: { type: Number, required: true }
13+
},
14+
dependencyTree: [{
15+
id: { type: String, required: true },
16+
path: { type: String, required: true },
17+
version: { type: String, required: true },
18+
indirect: { type: Boolean, required: true },
19+
depth: { type: Number, required: true }
20+
}],
21+
vulnerabilities: [{
22+
id: { type: String, required: true },
23+
modulePath: { type: String, required: true },
24+
moduleVersion: { type: String, required: true },
25+
vulnerabilityId: { type: String, required: true },
26+
severity: { type: String, required: true, enum: ['low', 'medium', 'high', 'critical', 'unknown'] },
27+
summary: { type: String, required: true },
28+
details: { type: String, required: true },
29+
published: { type: String, required: true },
30+
modified: { type: String, required: true },
31+
aliases: [String],
32+
usages: [{
33+
id: { type: String, required: true },
34+
file: { type: String, required: true },
35+
line: { type: Number, required: true },
36+
column: { type: Number, required: true },
37+
type: { type: String, required: true },
38+
details: { type: String, required: true }
39+
}]
40+
}]
41+
}, { timestamps: true });
42+
43+
export const ScanReport = mongoose.model('ScanReport', scanReportSchema);

api/test-api.js

Lines changed: 99 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/test-api.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)