mirror of
https://github.com/donpat1to/Schichtenplaner.git
synced 2025-11-30 22:45:46 +01:00
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import rateLimit from 'express-rate-limit';
|
|
import { Request } from 'express';
|
|
|
|
// Helper to check if request should be limited
|
|
const shouldSkipLimit = (req: Request): boolean => {
|
|
const skipPaths = [
|
|
'/api/health',
|
|
'/api/setup/status',
|
|
'/api/auth/validate'
|
|
];
|
|
|
|
// Skip for successful GET requests (data fetching)
|
|
if (req.method === 'GET' && req.path.startsWith('/api/')) {
|
|
return true;
|
|
}
|
|
|
|
return skipPaths.includes(req.path);
|
|
};
|
|
|
|
// Main API limiter - nur für POST/PUT/DELETE
|
|
export const apiLimiter = rateLimit({
|
|
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
max: 200, // 200 non-GET requests per 15 minutes
|
|
message: {
|
|
error: 'Zu viele Anfragen, bitte verlangsamen Sie Ihre Aktionen'
|
|
},
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
skip: (req) => {
|
|
// ✅ Skip für GET requests (Data Fetching)
|
|
if (req.method === 'GET') return true;
|
|
|
|
// ✅ Skip für Health/Status Checks
|
|
return shouldSkipLimit(req);
|
|
}
|
|
});
|
|
|
|
// Strict limiter for auth endpoints
|
|
export const authLimiter = rateLimit({
|
|
windowMs: 15 * 60 * 1000,
|
|
max: 5,
|
|
message: {
|
|
error: 'Zu viele Login-Versuche, bitte versuchen Sie es später erneut'
|
|
},
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
skipSuccessfulRequests: true,
|
|
}); |