Комментарии, файлы и права проекта
- Система комментариев к задачам с вложенными ответами - Редактирование и удаление комментариев - Прикрепление файлов к задачам и комментариям (картинки, архивы до 10 МБ) - Система прав проекта: админ проекта может удалять чужие комментарии и файлы - Универсальный класс FileUpload для загрузки файлов - Защита загрузки: только автор комментария может добавлять файлы - Каскадное удаление: задача → комментарии → файлы - Автообновление комментариев в реальном времени
This commit is contained in:
81
backend/api/comment.php
Normal file
81
backend/api/comment.php
Normal 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]);
|
||||
}
|
||||
|
||||
?>
|
||||
25
backend/api/server.php
Normal file
25
backend/api/server.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
if ($method === 'POST') {
|
||||
$data = RestApi::getInput();
|
||||
$action = $data['action'] ?? null;
|
||||
|
||||
// Получение настроек сервера (публичный action)
|
||||
if ($action === 'get_settings') {
|
||||
$timezone = date_default_timezone_get();
|
||||
$offset = date('P'); // +03:00 формат
|
||||
|
||||
RestApi::response([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'timezone' => $timezone, // Europe/Moscow
|
||||
'timezone_offset' => $offset, // +03:00
|
||||
'server_time' => date('c') // 2026-01-15T18:30:00+03:00
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -13,7 +13,7 @@ if ($method === 'POST') {
|
||||
$file_base64 = $data['file_data'] ?? null;
|
||||
$file_name = $data['file_name'] ?? null;
|
||||
|
||||
$result = TaskImage::upload($task_id, $file_base64, $file_name);
|
||||
$result = Task::uploadFile($task_id, $file_base64, $file_name);
|
||||
RestApi::response($result);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ if ($method === 'POST') {
|
||||
$task_id = $data['task_id'] ?? null;
|
||||
$file_names = $data['file_names'] ?? $data['file_name'] ?? null;
|
||||
|
||||
$result = TaskImage::delete($task_id, $file_names);
|
||||
$result = Task::deleteFile($task_id, $file_names);
|
||||
RestApi::response($result);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user