1
0
Files
TaskBoard/backend/api/comment.php
2026-01-19 15:10:37 +07:00

180 lines
7.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'POST') {
$data = RestApi::getInput();
$action = $data['action'] ?? null;
$comment = new Comment();
// Получаем ID текущего пользователя из сессии
$current_user_id = RestApi::getCurrentUserId();
// Создание комментария
if ($action === 'create') {
$id_task = $data['id_task'] ?? null;
// Проверяем доступ к проекту через задачу
$taskData = Task::check_task($id_task);
ProjectAccess::requireAccess($taskData['id_project'], $current_user_id);
// Проверяем право на создание комментариев (с учётом create_comment_own_task_only)
if (!ProjectAccess::canCreateComment(
$taskData['id_project'],
$current_user_id,
(int)($taskData['id_account'] ?? 0),
(int)($taskData['create_id_account'] ?? 0)
)) {
RestApi::response(['success' => 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);
// Нельзя загружать файлы к комментариям архивных задач
if ((int)$taskData['archive'] === 1) {
RestApi::response([
'success' => false,
'errors' => ['task' => 'Нельзя загружать файлы к комментариям архивных задач']
], 400);
}
// Проверяем право на загрузку картинок
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);
// Нельзя удалять файлы из комментариев архивных задач
if ((int)$taskData['archive'] === 1) {
RestApi::response([
'success' => false,
'errors' => ['task' => 'Нельзя удалять файлы из комментариев архивных задач']
], 400);
}
// Проверка прав: автор комментария ИЛИ админ проекта
$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]);
}
?>