61 lines
2.2 KiB
JavaScript
61 lines
2.2 KiB
JavaScript
// task-timeout.js
|
|
// Хранилище времени последнего создания задачи для каждого пользователя
|
|
const lastTaskCreationTime = new Map();
|
|
|
|
// Middleware для проверки таймаута между созданием задач
|
|
const checkTaskCreationTimeout = (req, res, next) => {
|
|
const userId = req.session?.user?.id;
|
|
|
|
if (!userId) {
|
|
return next();
|
|
}
|
|
|
|
const now = Date.now();
|
|
const timeoutMs = 15000; // 15 секунд в миллисекундах
|
|
|
|
if (lastTaskCreationTime.has(userId)) {
|
|
const lastCreation = lastTaskCreationTime.get(userId);
|
|
const timeSinceLastCreation = now - lastCreation;
|
|
|
|
if (timeSinceLastCreation < timeoutMs) {
|
|
const remainingSeconds = Math.ceil((timeoutMs - timeSinceLastCreation) / 1000);
|
|
return res.status(429).json({
|
|
error: `Слишком частое создание задач. Подождите ${remainingSeconds} секунд.`,
|
|
remainingSeconds: remainingSeconds,
|
|
timeout: true
|
|
});
|
|
}
|
|
}
|
|
|
|
// Помечаем, что проверка пройдена
|
|
req.taskCreationCheckPassed = true;
|
|
next();
|
|
};
|
|
|
|
// Функция для обновления времени создания
|
|
const updateLastTaskCreationTime = (userId) => {
|
|
if (userId) {
|
|
lastTaskCreationTime.set(userId, Date.now());
|
|
console.log(`✅ Время создания задачи обновлено для пользователя ${userId}`);
|
|
}
|
|
};
|
|
|
|
// Очистка старых записей (раз в час)
|
|
setInterval(() => {
|
|
const oneHourAgo = Date.now() - 3600000;
|
|
let deletedCount = 0;
|
|
for (const [userId, creationTime] of lastTaskCreationTime.entries()) {
|
|
if (creationTime < oneHourAgo) {
|
|
lastTaskCreationTime.delete(userId);
|
|
deletedCount++;
|
|
}
|
|
}
|
|
if (deletedCount > 0) {
|
|
console.log(`🧹 Очищено ${deletedCount} устаревших записей времени создания задач`);
|
|
}
|
|
}, 3600000); // Каждый час
|
|
|
|
module.exports = {
|
|
checkTaskCreationTimeout,
|
|
updateLastTaskCreationTime
|
|
}; |