1
0

Комментарии, файлы и права проекта

- Система комментариев к задачам с вложенными ответами
- Редактирование и удаление комментариев
- Прикрепление файлов к задачам и комментариям (картинки, архивы до 10 МБ)
- Система прав проекта: админ проекта может удалять чужие комментарии и файлы
- Универсальный класс FileUpload для загрузки файлов
- Защита загрузки: только автор комментария может добавлять файлы
- Каскадное удаление: задача → комментарии → файлы
- Автообновление комментариев в реальном времени
This commit is contained in:
2026-01-15 06:40:47 +07:00
parent 8ac497df63
commit 3bfa1e9e1b
25 changed files with 3353 additions and 904 deletions

81
backend/api/comment.php Normal file
View File

@@ -0,0 +1,81 @@
<?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') {
$comment->id_task = $data['id_task'] ?? null;
$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;
$comment->id_accounts = $current_user_id;
$comment->text = $data['text'] ?? '';
$result = $comment->update();
RestApi::response($result);
}
// Удаление комментария
if ($action === 'delete') {
$id = $data['id'] ?? null;
$result = Comment::delete($id, $current_user_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;
$result = Comment::uploadFile($comment_id, $file_base64, $file_name, $current_user_id);
RestApi::response($result);
}
// Удаление файлов комментария (автор или админ проекта)
if ($action === 'delete_image') {
$comment_id = $data['comment_id'] ?? null;
$file_names = $data['file_names'] ?? $data['file_name'] ?? null;
$result = Comment::deleteFile($comment_id, $file_names, $current_user_id);
RestApi::response($result);
}
// Метод не указан
if (!$action) {
RestApi::response(['success' => false, 'error' => 'Укажите метод'], 400);
}
}
if ($method === 'GET') {
// Получение комментариев задачи
// ?id_task=X (обязательный)
$id_task = $_GET['id_task'] ?? null;
if (!$id_task) {
RestApi::response(['success' => false, 'errors' => ['id_task' => 'Задача не указана']], 400);
}
$comment = new Comment();
$comments = $comment->getByTask($id_task);
RestApi::response(['success' => true, 'data' => $comments]);
}
?>