false, 'errors' => ['access' => 'Нет прав на создание комментария']], 403); } $comment->id_task = $id_task; $comment->id_accounts = $current_user_id; $comment->id_answer = $data['id_answer'] ?? null; $comment->text = $data['text'] ?? ''; $result = $comment->create(); RestApi::response($result); } // Обновление комментария if ($action === 'update') { $comment_id = $data['id'] ?? null; // Проверяем доступ к проекту через комментарий -> задачу $commentData = Comment::checkComment($comment_id); $taskData = Task::check_task($commentData['id_task']); ProjectAccess::requireAccess($taskData['id_project'], $current_user_id); $comment->id = $comment_id; $comment->id_accounts = $current_user_id; $comment->text = $data['text'] ?? ''; $result = $comment->update(); RestApi::response($result); } // Удаление комментария if ($action === 'delete') { $id = $data['id'] ?? null; // Проверяем доступ к проекту через комментарий -> задачу $commentData = Comment::checkComment($id); $taskData = Task::check_task($commentData['id_task']); $project_id = $taskData['id_project']; ProjectAccess::requireAccess($project_id, $current_user_id); // Проверяем права на удаление $isAuthor = (int)$commentData['id_accounts'] === (int)$current_user_id; $isAdmin = ProjectAccess::isAdmin($project_id, $current_user_id); $canDeleteAll = ProjectAccess::can($project_id, $current_user_id, 'delete_all_comments'); $canDeleteOwn = ProjectAccess::can($project_id, $current_user_id, 'delete_own_comments'); if (!$isAdmin && !$canDeleteAll && !($isAuthor && $canDeleteOwn)) { RestApi::response([ 'success' => false, 'errors' => ['access' => 'Нет прав на удаление комментария'] ], 403); } $result = Comment::deleteWithAccess($id); RestApi::response($result); } // Загрузка файла к комментарию if ($action === 'upload_image') { $comment_id = $data['comment_id'] ?? null; $file_base64 = $data['file_data'] ?? null; $file_name = $data['file_name'] ?? null; // Проверяем доступ к проекту $commentData = Comment::checkComment($comment_id); $taskData = Task::check_task($commentData['id_task']); $project_id = $taskData['id_project']; ProjectAccess::requireAccess($project_id, $current_user_id); // Проверяем право на загрузку картинок ProjectAccess::requirePermission($project_id, $current_user_id, 'upload_images'); // Только автор может загружать к своему комментарию if ((int)$commentData['id_accounts'] !== (int)$current_user_id) { RestApi::response([ 'success' => false, 'errors' => ['access' => 'Вы можете загружать файлы только к своим комментариям'] ], 403); } $result = Comment::uploadFileSimple($comment_id, $file_base64, $file_name); RestApi::response($result); } // Удаление файлов комментария if ($action === 'delete_image') { $comment_id = $data['comment_id'] ?? null; $file_names = $data['file_names'] ?? $data['file_name'] ?? null; // Проверяем доступ к проекту $commentData = Comment::checkComment($comment_id); $taskData = Task::check_task($commentData['id_task']); $project_id = $taskData['id_project']; ProjectAccess::requireAccess($project_id, $current_user_id); // Проверка прав: автор комментария ИЛИ админ проекта $isAuthor = (int)$commentData['id_accounts'] === (int)$current_user_id; $isAdmin = ProjectAccess::isAdmin($project_id, $current_user_id); if (!$isAuthor && !$isAdmin) { RestApi::response([ 'success' => false, 'errors' => ['access' => 'Нет прав на удаление файлов'] ], 403); } $result = Comment::deleteFileSimple($comment_id, $file_names); RestApi::response($result); } // Метод не указан if (!$action) { RestApi::response(['success' => false, 'error' => 'Укажите метод'], 400); } } if ($method === 'GET') { // Получение комментариев задачи // ?id_task=X (обязательный) $current_user_id = RestApi::getCurrentUserId(); $id_task = $_GET['id_task'] ?? null; if (!$id_task) { RestApi::response(['success' => false, 'errors' => ['id_task' => 'Задача не указана']], 400); } // Проверяем доступ к проекту через задачу $taskData = Task::check_task($id_task); ProjectAccess::requireAccess($taskData['id_project'], $current_user_id); $comment = new Comment(); $comments = $comment->getByTask($id_task); RestApi::response(['success' => true, 'data' => $comments]); } ?>