ознакомление

This commit is contained in:
2026-03-26 17:20:04 +05:00
parent 3a866762a5
commit f5f4f12ff1
9 changed files with 360 additions and 7 deletions

View File

@@ -2056,6 +2056,112 @@ app.post('/api/tasks/:taskId/copy', requireAuth, checkTaskCreationTimeout, (req,
);
});
});
// API для создания задачи ознакомления с указанием автора
app.post('/api/tasks/acquaintance', requireAuth, checkTaskCreationTimeout, (req, res) => {
const { originalTaskId, dueDate, assignedUserIds, creatorId, comment } = req.body;
const currentUserId = req.session.user.id;
const currentUser = req.session.user;
// Валидация
if (!originalTaskId) return res.status(400).json({ error: 'Не указана исходная задача' });
if (!dueDate) return res.status(400).json({ error: 'Дата выполнения обязательна' });
if (!assignedUserIds || assignedUserIds.length === 0) return res.status(400).json({ error: 'Не указаны исполнители' });
if (!creatorId) return res.status(400).json({ error: 'Не указан автор задачи' });
// Проверка прав: только admin и tasks могут создавать задачу от имени другого пользователя
if (currentUser.role !== 'admin' && currentUser.role !== 'tasks') {
return res.status(403).json({ error: 'Недостаточно прав для создания задачи от имени другого пользователя' });
}
// Исполнителем должен быть только текущий пользователь
if (assignedUserIds.length !== 1 || parseInt(assignedUserIds[0]) !== currentUserId) {
return res.status(400).json({ error: 'Исполнителем может быть только текущий пользователь' });
}
if (!req.taskCreationCheckPassed) {
return res.status(429).json({ error: 'Слишком частое создание задач' });
}
// Получаем исходную задачу с именем автора
db.get(`
SELECT t.*, u.name as creator_name
FROM tasks t
LEFT JOIN users u ON t.created_by = u.id
WHERE t.id = ?
`, [originalTaskId], (err, originalTask) => {
if (err || !originalTask) {
return res.status(404).json({ error: 'Исходная задача не найдена' });
}
const startDate = new Date().toISOString();
const taskType = 'acquaintance';
const newTitle = `Ознакомление: ${originalTask.title}`;
const newDescription = `Задача для ознакомления
Оригинал: задача №${originalTask.id} "${originalTask.title}"
Автор оригинала: ${originalTask.creator_name || 'Неизвестно'}
${comment ? `Комментарий: ${comment}\n` : ''}
---
${originalTask.description || ''}`;
// Создаём задачу с указанным автором (creatorId)
db.run(
`INSERT INTO tasks
(title, description, created_by, original_task_id, start_date, due_date, task_type)
VALUES (?, ?, ?, ?, ?, ?, ?)`,
[newTitle, newDescription, creatorId, originalTaskId, startDate, dueDate, taskType],
function(err) {
if (err) {
console.error('❌ Ошибка создания задачи ознакомления:', err);
return res.status(500).json({ error: err.message });
}
const newTaskId = this.lastID;
// Обновляем таймаут создания
if (typeof updateLastTaskCreationTime === 'function') {
updateLastTaskCreationTime(currentUserId);
}
// Сохраняем метаданные
if (typeof saveTaskMetadata === 'function') {
saveTaskMetadata(newTaskId, newTitle, newDescription, creatorId, originalTaskId, startDate, dueDate);
}
// Назначаем исполнителя (текущий пользователь)
db.run(
`INSERT INTO task_assignments (task_id, user_id, start_date, due_date, status)
VALUES (?, ?, ?, ?, 'assigned')`,
[newTaskId, currentUserId, startDate, dueDate],
function(err) {
if (err) {
console.error('❌ Ошибка назначения исполнителя:', err);
db.run("DELETE FROM tasks WHERE id = ?", [newTaskId]);
return res.status(500).json({ error: err.message });
}
if (typeof logActivity === 'function') {
logActivity(newTaskId, currentUserId, 'TASK_CREATED',
`Создана задача ознакомления: ${newTitle} (автор: ${creatorId}, исполнитель: ${currentUserId})`);
}
if (typeof sendTaskNotifications === 'function') {
sendTaskNotifications('created', newTaskId, newTitle, newDescription, currentUserId);
}
res.json({
success: true,
taskId: newTaskId,
message: 'Задача ознакомления успешно создана',
timeoutInfo: { nextAllowedIn: 15 }
});
}
);
}
);
});
});
}
module.exports = { setupTaskEndpoints, getApproverUsers };