ознакомление
This commit is contained in:
@@ -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 };
|
||||
Reference in New Issue
Block a user