Большое обновление
1. Создание личных проектов 2. Управление командой 3. Приглашение участников 4. Уведомления и многое другое...
This commit is contained in:
@@ -4,55 +4,49 @@ class Project extends BaseEntity {
|
||||
|
||||
protected $db_name = 'project';
|
||||
|
||||
// Получение всех проектов
|
||||
// Получение всех проектов (только те, где пользователь участник)
|
||||
public function getAll() {
|
||||
$current_user_id = RestApi::getCurrentUserId();
|
||||
|
||||
if (!$current_user_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Получаем ID проектов где пользователь участник
|
||||
$projectIds = ProjectAccess::getUserProjectIds($current_user_id);
|
||||
|
||||
if (empty($projectIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$projects = Database::select($this->db_name, [
|
||||
'id',
|
||||
'id_order',
|
||||
'name',
|
||||
'id_ready',
|
||||
'id_admin'
|
||||
'id_ready'
|
||||
], [
|
||||
'id' => $projectIds,
|
||||
'ORDER' => ['id_order' => 'ASC']
|
||||
]);
|
||||
|
||||
// Обрабатываем id_admin для каждого проекта
|
||||
// Добавляем флаг is_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']);
|
||||
}
|
||||
|
||||
$project['is_admin'] = ProjectAccess::isAdmin($project['id'], $current_user_id);
|
||||
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_ready'
|
||||
], ['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']);
|
||||
}
|
||||
if ($project && $current_user_id) {
|
||||
$project['is_admin'] = ProjectAccess::isAdmin($id, $current_user_id);
|
||||
}
|
||||
|
||||
return $project;
|
||||
@@ -114,17 +108,6 @@ class Project extends BaseEntity {
|
||||
];
|
||||
}
|
||||
|
||||
// Проверка является ли пользователь админом проекта
|
||||
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);
|
||||
}
|
||||
|
||||
// ==================== CRUD ПРОЕКТОВ ====================
|
||||
|
||||
// Создание проекта с дефолтными колонками
|
||||
@@ -132,12 +115,11 @@ class Project extends BaseEntity {
|
||||
// Получаем максимальный id_order
|
||||
$maxOrder = Database::max('project', 'id_order') ?? 0;
|
||||
|
||||
// Создаём проект
|
||||
// Создаём проект с создателем как владельцем (id_admin)
|
||||
Database::insert('project', [
|
||||
'name' => $name,
|
||||
'id_order' => $maxOrder + 1,
|
||||
'id_admin' => json_encode([(int)$user_id]),
|
||||
'id_member' => json_encode([])
|
||||
'id_admin' => json_encode([$user_id])
|
||||
]);
|
||||
|
||||
$projectId = Database::id();
|
||||
@@ -172,14 +154,14 @@ class Project extends BaseEntity {
|
||||
['id' => $firstColumnId, 'name_columns' => 'К выполнению', 'color' => '#6366f1', 'id_order' => 1],
|
||||
['id' => $readyColumnId, 'name_columns' => 'Готово', 'color' => '#22c55e', 'id_order' => 2]
|
||||
],
|
||||
'id_ready' => $readyColumnId
|
||||
'id_ready' => $readyColumnId,
|
||||
'is_admin' => true
|
||||
];
|
||||
}
|
||||
|
||||
// Обновление проекта
|
||||
public static function update($id, $name, $user_id) {
|
||||
// Проверяем права
|
||||
if (!self::isAdmin($id, $user_id)) {
|
||||
if (!ProjectAccess::isAdmin($id, $user_id)) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на редактирование']];
|
||||
}
|
||||
|
||||
@@ -189,8 +171,7 @@ class Project extends BaseEntity {
|
||||
|
||||
// Удаление проекта (каскадно: колонки, задачи, комментарии, файлы)
|
||||
public static function delete($id, $user_id) {
|
||||
// Проверяем права
|
||||
if (!self::isAdmin($id, $user_id)) {
|
||||
if (!ProjectAccess::isAdmin($id, $user_id)) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на удаление']];
|
||||
}
|
||||
|
||||
@@ -225,6 +206,12 @@ class Project extends BaseEntity {
|
||||
// Удаляем отделы проекта
|
||||
Database::delete('departments', ['id_project' => $id]);
|
||||
|
||||
// Удаляем участников проекта
|
||||
Database::delete('project_members', ['id_project' => $id]);
|
||||
|
||||
// Удаляем приглашения в проект
|
||||
Database::delete('project_invites', ['id_project' => $id]);
|
||||
|
||||
// Удаляем проект
|
||||
Database::delete('project', ['id' => $id]);
|
||||
|
||||
@@ -243,9 +230,8 @@ class Project extends BaseEntity {
|
||||
|
||||
// Добавление колонки
|
||||
public static function addColumn($project_id, $name, $color, $user_id) {
|
||||
// Проверяем права
|
||||
if (!self::isAdmin($project_id, $user_id)) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на редактирование']];
|
||||
if (!ProjectAccess::can($project_id, $user_id, 'create_column')) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на создание колонок']];
|
||||
}
|
||||
|
||||
// Получаем максимальный id_order для проекта
|
||||
@@ -279,9 +265,8 @@ class Project extends BaseEntity {
|
||||
return ['success' => false, 'errors' => ['column' => 'Колонка не найдена']];
|
||||
}
|
||||
|
||||
// Проверяем права
|
||||
if (!self::isAdmin($column['id_project'], $user_id)) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на редактирование']];
|
||||
if (!ProjectAccess::can($column['id_project'], $user_id, 'edit_column')) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на редактирование колонок']];
|
||||
}
|
||||
|
||||
$updateData = [];
|
||||
@@ -308,9 +293,8 @@ class Project extends BaseEntity {
|
||||
return ['success' => false, 'errors' => ['column' => 'Колонка не найдена']];
|
||||
}
|
||||
|
||||
// Проверяем права
|
||||
if (!self::isAdmin($column['id_project'], $user_id)) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на удаление']];
|
||||
if (!ProjectAccess::can($column['id_project'], $user_id, 'delete_column')) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на удаление колонок']];
|
||||
}
|
||||
|
||||
// Проверяем, не является ли это последней колонкой перед "Готово"
|
||||
@@ -360,9 +344,8 @@ class Project extends BaseEntity {
|
||||
|
||||
// Обновление порядка колонок
|
||||
public static function updateColumnsOrder($project_id, $ids, $user_id) {
|
||||
// Проверяем права
|
||||
if (!self::isAdmin($project_id, $user_id)) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на редактирование']];
|
||||
if (!ProjectAccess::can($project_id, $user_id, 'edit_column')) {
|
||||
return ['success' => false, 'errors' => ['access' => 'Нет прав на редактирование колонок']];
|
||||
}
|
||||
|
||||
foreach ($ids as $order => $id) {
|
||||
|
||||
Reference in New Issue
Block a user