Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions BACKEND/middleware/rateLimiter.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,37 @@ export const checkoutLimiter = rateLimit({
success: false,
message: "Too many checkout attempts. Please try again later.",
},
});

export const productCreateLimiter = rateLimit({
windowMs: 60 * 60 * 1000,
max: 30,
standardHeaders: true,
legacyHeaders: false,
message: {
success: false,
message: "Too many product creation requests. Please try again after 1 hour.",
},
});

export const productUpdateLimiter = rateLimit({
windowMs: 60 * 60 * 1000,
max: 60,
standardHeaders: true,
legacyHeaders: false,
message: {
success: false,
message: "Too many product update requests. Please try again after 1 hour.",
},
});

export const productDeleteLimiter = rateLimit({
windowMs: 60 * 60 * 1000,
max: 20,
standardHeaders: true,
legacyHeaders: false,
message: {
success: false,
message: "Too many product deletion requests. Please try again after 1 hour.",
},
});
9 changes: 5 additions & 4 deletions BACKEND/routes/product.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { createProduct, deleteProduct, getProducts, getProductCategories, update
import reviewRoutes from './review.route.js';
import authMiddleware from "../middleware/authMiddleware.js";
import adminMiddleware from "../middleware/adminMiddleware.js";
import { productCreateLimiter, productUpdateLimiter, productDeleteLimiter } from "../middleware/rateLimiter.js";

const router = express.Router();

Expand All @@ -13,10 +14,10 @@ router.get("/related/:id", getRelatedProducts);
router.get("/search", searchProducts);
router.get("/:id/bundle", getProductBundle);
router.get("/:id", getProductById);
router.post("/", authMiddleware, adminMiddleware, upload.single("image"), handleUploadError, createProduct);
router.put("/:id", authMiddleware, adminMiddleware, upload.single("image"), handleUploadError, updateProduct);
router.patch("/:id/restock", authMiddleware, adminMiddleware, restockProduct);
router.delete("/:id", authMiddleware, adminMiddleware, deleteProduct);
router.post("/", productCreateLimiter, authMiddleware, adminMiddleware, upload.single("image"), handleUploadError, createProduct);
router.put("/:id", productUpdateLimiter, authMiddleware, adminMiddleware, upload.single("image"), handleUploadError, updateProduct);
router.patch("/:id/restock", productUpdateLimiter, authMiddleware, adminMiddleware, restockProduct);
router.delete("/:id", productDeleteLimiter, authMiddleware, adminMiddleware, deleteProduct);

router.use('/:productId/reviews', reviewRoutes);

Expand Down
Loading