- Система комментариев к задачам с вложенными ответами - Редактирование и удаление комментариев - Прикрепление файлов к задачам и комментариям (картинки, архивы до 10 МБ) - Система прав проекта: админ проекта может удалять чужие комментарии и файлы - Универсальный класс FileUpload для загрузки файлов - Защита загрузки: только автор комментария может добавлять файлы - Каскадное удаление: задача → комментарии → файлы - Автообновление комментариев в реальном времени
130 lines
4.2 KiB
PHP
130 lines
4.2 KiB
PHP
<?php
|
||
|
||
class Project extends BaseEntity {
|
||
|
||
protected $db_name = 'project';
|
||
|
||
// Получение всех проектов
|
||
public function getAll() {
|
||
$current_user_id = RestApi::getCurrentUserId();
|
||
|
||
$projects = Database::select($this->db_name, [
|
||
'id',
|
||
'id_order',
|
||
'name',
|
||
'id_ready',
|
||
'id_admin'
|
||
], [
|
||
'ORDER' => ['id_order' => 'ASC']
|
||
]);
|
||
|
||
// Обрабатываем id_admin для каждого проекта
|
||
return array_map(function($project) use ($current_user_id) {
|
||
$admins = $project['id_admin'] ? json_decode($project['id_admin'], true) : [];
|
||
|
||
if ($current_user_id && in_array((int)$current_user_id, $admins, true)) {
|
||
$project['id_admin'] = true;
|
||
} else {
|
||
unset($project['id_admin']);
|
||
}
|
||
|
||
return $project;
|
||
}, $projects);
|
||
}
|
||
|
||
// Получение одного проекта
|
||
// $current_user_id — ID текущего пользователя для проверки админства
|
||
public static function get($id, $current_user_id = null) {
|
||
$project = Database::get('project', [
|
||
'id',
|
||
'id_order',
|
||
'name',
|
||
'id_ready',
|
||
'id_admin'
|
||
], ['id' => $id]);
|
||
|
||
if ($project) {
|
||
$admins = $project['id_admin'] ? json_decode($project['id_admin'], true) : [];
|
||
|
||
// Если передан user_id — проверяем админство
|
||
if ($current_user_id && in_array((int)$current_user_id, $admins, true)) {
|
||
$project['id_admin'] = true;
|
||
} else {
|
||
// Не админ — убираем поле
|
||
unset($project['id_admin']);
|
||
}
|
||
}
|
||
|
||
return $project;
|
||
}
|
||
|
||
// Получение id_ready (ID колонки "Готово") по ID проекта
|
||
public static function getReadyColumnId($project_id) {
|
||
$project = Database::get('project', ['id_ready'], ['id' => $project_id]);
|
||
return $project ? (int)$project['id_ready'] : null;
|
||
}
|
||
|
||
// Получение колонок проекта
|
||
public static function getColumns($project_id) {
|
||
return Database::select('columns', [
|
||
'id',
|
||
'name_columns',
|
||
'color',
|
||
'id_order'
|
||
], [
|
||
'id_project' => $project_id,
|
||
'ORDER' => ['id_order' => 'ASC']
|
||
]);
|
||
}
|
||
|
||
// Получение отделов проекта
|
||
public static function getDepartments($project_id) {
|
||
return Database::select('departments', [
|
||
'id',
|
||
'name_departments',
|
||
'color'
|
||
], [
|
||
'id_project' => $project_id
|
||
]);
|
||
}
|
||
|
||
// Получение всех данных проекта (проект + колонки + отделы + метки)
|
||
public static function getProjectData($project_id) {
|
||
// Получаем ID текущего пользователя для проверки админства
|
||
$current_user_id = RestApi::getCurrentUserId();
|
||
|
||
$project = self::get($project_id, $current_user_id);
|
||
if (!$project) {
|
||
return null;
|
||
}
|
||
|
||
// Получаем метки (глобальные)
|
||
$labels = Database::select('labels', [
|
||
'id',
|
||
'name_labels',
|
||
'icon',
|
||
'color'
|
||
]);
|
||
|
||
return [
|
||
'project' => $project,
|
||
'columns' => self::getColumns($project_id),
|
||
'departments' => self::getDepartments($project_id),
|
||
'labels' => $labels
|
||
];
|
||
}
|
||
|
||
// Проверка является ли пользователь админом проекта
|
||
public static function isAdmin($project_id, $user_id): bool {
|
||
$project = Database::get('project', ['id_admin'], ['id' => $project_id]);
|
||
if (!$project || !$project['id_admin']) {
|
||
return false;
|
||
}
|
||
|
||
$admins = json_decode($project['id_admin'], true) ?: [];
|
||
return in_array((int)$user_id, $admins, true);
|
||
}
|
||
}
|
||
|
||
?>
|