Skip to content

Commit bcf6ff0

Browse files
Merge pull request #116 from Amitjoiya/Amitjoiya/92
feat: add rate limiting to AI roadmap generation endpoint
2 parents 65f143f + 79b33b7 commit bcf6ff0

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import rateLimit from "express-rate-limit";
2+
3+
// Rate limiting for AI roadmap generation to prevent abuse and API quota drains
4+
export const aiRoadmapLimiter = rateLimit({
5+
windowMs: 60 * 60 * 1000, // 1 hour window
6+
max: 5, // Limit each IP or User to 5 requests per window
7+
standardHeaders: true,
8+
legacyHeaders: false,
9+
keyGenerator: (req) => {
10+
// Prefer user ID if authenticated, fallback to IP
11+
const defaultIp = req.ip || "unknown_ip";
12+
const user = (req as any).user;
13+
if (user && user.id) {
14+
return `user_${user.id}`;
15+
}
16+
return defaultIp;
17+
},
18+
message: {
19+
message: "Too many AI roadmap generation requests. Please try again later."
20+
},
21+
});

server/src/module/roadmap/roadmap.routes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Router } from "express";
22
import { authMiddleware } from "../../middleware/auth.middleware.js";
3+
import { aiRoadmapLimiter } from "../../middleware/rate-limit.middleware.js";
34
import {
45
downloadPdf,
56
enroll,
@@ -16,7 +17,7 @@ import {
1617
export const roadmapRouter = Router();
1718

1819
// ── AI generation (registered BEFORE /:slug to avoid conflicts) ──────────
19-
roadmapRouter.post("/ai/generate", authMiddleware, postAiGenerate);
20+
roadmapRouter.post("/ai/generate", authMiddleware, aiRoadmapLimiter, postAiGenerate);
2021

2122
// ── Authenticated "me" routes (also BEFORE /:slug) ────────────────────────
2223
roadmapRouter.get("/me/enrollments", authMiddleware, getMyEnrollments);

0 commit comments

Comments
 (0)