1
0

Фиксы...

This commit is contained in:
2026-01-19 15:10:37 +07:00
parent 7d7b817d7e
commit 8e3cd770df
17 changed files with 281 additions and 111 deletions

View File

@@ -93,6 +93,14 @@ if ($method === 'POST') {
$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');
@@ -119,6 +127,14 @@ if ($method === 'POST') {
$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);

View File

@@ -77,6 +77,12 @@ if ($method === 'POST') {
// Проверяем право на создание задач
ProjectAccess::requirePermission($project_id, $user_id, 'create_task');
// Проверяем что у проекта есть колонки
$columns = Project::getColumns($project_id);
if (empty($columns)) {
RestApi::response(['success' => false, 'errors' => ['project' => 'У проекта нет колонок. Создайте хотя бы одну колонку.']], 400);
}
$task->id_project = $project_id;
$task->id_department = $data['id_department'] ?? null;

View File

@@ -30,8 +30,12 @@ class Comment extends BaseEntity {
return $errors;
}
// Проверяем что задача существует
Task::check_task($this->id_task);
// Проверяем что задача существует и не архивная
$task = Task::check_task($this->id_task);
if ((int)$task['archive'] === 1) {
$this->addError('task', 'Нельзя комментировать архивные задачи');
return $this->getErrors();
}
// Если это ответ — проверяем что родительский комментарий существует
if ($this->id_answer) {
@@ -75,6 +79,13 @@ class Comment extends BaseEntity {
// Проверяем что комментарий существует
$comment = self::checkComment($this->id);
// Проверяем что задача не архивная
$task = Database::get('cards_task', ['archive'], ['id' => $comment['id_task']]);
if ($task && (int)$task['archive'] === 1) {
$this->addError('task', 'Нельзя редактировать комментарии архивных задач');
return $this->getErrors();
}
// Проверяем что пользователь — автор комментария
if ((int)$comment['id_accounts'] !== (int)$this->id_accounts) {
$this->addError('access', 'Вы можете редактировать только свои комментарии');
@@ -99,8 +110,16 @@ class Comment extends BaseEntity {
// Проверяем что комментарий существует
$comment = self::checkComment($id);
// Получаем задачу для проверки админа проекта
$task = Database::get('cards_task', ['id_project'], ['id' => $comment['id_task']]);
// Получаем задачу для проверки админа проекта и архивации
$task = Database::get('cards_task', ['id_project', 'archive'], ['id' => $comment['id_task']]);
// Нельзя удалять комментарии архивных задач
if ($task && (int)$task['archive'] === 1) {
RestApi::response([
'success' => false,
'errors' => ['task' => 'Нельзя удалять комментарии архивных задач']
], 400);
}
// Проверяем права: автор комментария ИЛИ админ проекта
$isAuthor = (int)$comment['id_accounts'] === (int)$id_accounts;

View File

@@ -112,10 +112,10 @@ class Project extends BaseEntity {
// ==================== CRUD ПРОЕКТОВ ====================
// Создание проекта с дефолтными колонками
// Создание проекта БЕЗ колонок (колонки создаются на фронте)
public static function create($name, $user_id) {
// Получаем максимальный id_order
$maxOrder = Database::max('project', 'id_order') ?? 0;
$maxOrder = (int)(Database::max('project', 'id_order') ?? 0);
// Создаём проект с создателем как владельцем (id_admin)
Database::insert('project', [
@@ -129,34 +129,9 @@ class Project extends BaseEntity {
return ['success' => false, 'errors' => ['project' => 'Ошибка создания проекта']];
}
// Создаём дефолтные колонки
Database::insert('columns', [
'name_columns' => 'К выполнению',
'color' => '#6366f1',
'id_project' => $projectId,
'id_order' => 1
]);
$firstColumnId = Database::id();
Database::insert('columns', [
'name_columns' => 'Готово',
'color' => '#22c55e',
'id_project' => $projectId,
'id_order' => 2
]);
$readyColumnId = Database::id();
// Устанавливаем id_ready
Database::update('project', ['id_ready' => $readyColumnId], ['id' => $projectId]);
return [
'success' => true,
'id' => $projectId,
'columns' => [
['id' => $firstColumnId, 'name_columns' => 'К выполнению', 'color' => '#6366f1', 'id_order' => 1],
['id' => $readyColumnId, 'name_columns' => 'Готово', 'color' => '#22c55e', 'id_order' => 2]
],
'id_ready' => $readyColumnId,
'is_admin' => true
];
}
@@ -237,7 +212,7 @@ class Project extends BaseEntity {
}
// Получаем максимальный id_order для проекта
$maxOrder = Database::max('columns', 'id_order', ['id_project' => $project_id]) ?? 0;
$maxOrder = (int)(Database::max('columns', 'id_order', ['id_project' => $project_id]) ?? 0);
Database::insert('columns', [
'name_columns' => $name,

View File

@@ -61,6 +61,9 @@ class Task extends BaseEntity {
return $errors;
}
// Формируем дату создания (одна переменная для БД и ответа)
$date_create = date('Y-m-d H:i:s');
// Вставляем в базу
Database::insert($this->db_name, [
'id_project' => $this->id_project,
@@ -75,7 +78,7 @@ class Task extends BaseEntity {
'descript' => $this->descript ?: null,
'descript_full' => $this->descript_full ?: null,
'archive' => 0,
'date_create' => date('Y-m-d H:i:s'),
'date_create' => $date_create,
'file_img' => '[]'
]);
@@ -96,6 +99,9 @@ class Task extends BaseEntity {
return [
'success' => true,
'id' => $this->id,
'date' => $this->date ?: null,
'date_create' => $date_create,
'date_closed' => null,
'files' => $uploaded_files
];
}
@@ -108,12 +114,18 @@ class Task extends BaseEntity {
}
// Проверка что задача существует и получаем текущие данные
$task = Database::get($this->db_name, ['id', 'column_id', 'order', 'id_project'], ['id' => $this->id]);
$task = Database::get($this->db_name, ['id', 'column_id', 'order', 'id_project', 'archive'], ['id' => $this->id]);
if (!$task) {
$this->addError('task', 'Задача не найдена');
return $this->getErrors();
}
// Архивные задачи нельзя редактировать
if ((int)$task['archive'] === 1) {
$this->addError('task', 'Архивные задачи нельзя редактировать');
return $this->getErrors();
}
// Получаем текущую колонку
$old_column_id = (int)$task['column_id'];
@@ -179,14 +191,32 @@ class Task extends BaseEntity {
// Загрузка файла к задаче
public static function uploadFile($task_id, $file_base64, $file_name) {
// Проверка что задача существует
self::check_task($task_id);
$task = self::check_task($task_id);
// Архивные задачи нельзя редактировать
if ((int)$task['archive'] === 1) {
RestApi::response([
'success' => false,
'errors' => ['task' => 'Нельзя загружать файлы в архивную задачу']
], 400);
}
return FileUpload::upload('task', $task_id, $file_base64, $file_name);
}
// Удаление файлов задачи
public static function deleteFile($task_id, $file_names) {
// Проверка что задача существует
self::check_task($task_id);
$task = self::check_task($task_id);
// Архивные задачи нельзя редактировать
if ((int)$task['archive'] === 1) {
RestApi::response([
'success' => false,
'errors' => ['task' => 'Нельзя удалять файлы из архивной задачи']
], 400);
}
return FileUpload::delete('task', $task_id, $file_names);
}
@@ -199,6 +229,14 @@ class Task extends BaseEntity {
$new_column_id = (int)$column_id;
$archive = (int)$task['archive'];
// Архивные задачи нельзя перемещать
if ($archive === 1) {
RestApi::response([
'success' => false,
'errors' => ['task' => 'Архивные задачи нельзя перемещать']
], 400);
}
// Получаем id_ready (колонка "Готово") из проекта
$done_column_id = Project::getReadyColumnId($task['id_project']);