ideas-generator/server/middleware/rateLimiter.js
DJP 88d18619bb Complete migration from OpenAI Assistants API to Chat Completions API with Vue.js frontend
Major Features Implemented:
- Full Vue.js 3 admin interface with Vite build system
- OpenAI Chat Completions API integration (replaced deprecated Assistants API)
- PostgreSQL database with Sequelize ORM
- Complete conversation management system
- User authentication system (admin@oliver.agency, user@oliver.agency)
- AI-powered conversation title generation
- Server-Sent Events for streaming responses
- Conversation soft delete functionality
- Rate limiting middleware with development bypass

Backend Infrastructure:
- Node.js/Express server with comprehensive error handling
- Database models: User, Assistant, Conversation, Message
- Chat API endpoints with full conversation history context
- Conversation CRUD operations with soft delete
- Migration and seeding scripts
- Environment-based configuration

Frontend Features:
- Responsive Vue.js interface with router
- Real-time chat with streaming responses
- Conversation sidebar with delete functionality
- Agent selection dropdown
- Persistent user sessions with hash-based user IDs
- Conversation history loading and continuity
- Login system with user role management
- Prominent logout functionality

Technical Improvements:
- Fixed conversation continuity by loading full message history
- Implemented conversation title generation using GPT-4o-mini
- Added conversation persistence mechanisms (periodic refresh, window focus)
- Enhanced error handling and rate limiting
- Proper environment variable management
- Clean project structure with separated concerns

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 13:08:26 -04:00

35 lines
No EOL
915 B
JavaScript

const rateLimit = require('express-rate-limit');
const createRateLimiter = (windowMs, max, message) => {
return rateLimit({
windowMs,
max,
message: {
error: 'Too Many Requests',
message,
retryAfter: Math.ceil(windowMs / 1000),
},
standardHeaders: true,
legacyHeaders: false,
skip: (req) => {
return process.env.SKIP_RATE_LIMITING === 'true';
},
});
};
const chatLimiter = createRateLimiter(
15 * 60 * 1000, // 15 minutes
20, // limit each IP to 20 requests per windowMs
'Too many chat requests from this IP, please try again later.'
);
const generalLimiter = createRateLimiter(
15 * 60 * 1000, // 15 minutes
1000, // limit each IP to 1000 requests per windowMs (high limit for development)
'Too many requests from this IP, please try again later.'
);
module.exports = {
chatLimiter,
generalLimiter,
};