1
0
Files
TaskBoard/backend/app/class/enity/class_project.php
Falknat 719aecd09e Добавление проектов
Добавили возможность создавания разных проектов.
2026-01-14 10:46:38 +07:00

242 lines
7.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
class Project extends BaseEntity {
protected $db_name = 'project';
// Свойства проекта
public $id;
public $id_order;
public $name;
public $id_ready;
// Валидация данных
protected function validate() {
static::$error_message = [];
if (!$this->id) {
$this->addError('id', 'ID проекта не указан');
}
if (!$this->name) {
$this->addError('name', 'Название проекта не может быть пустым');
}
return $this->getErrors();
}
// Валидация данных (для create)
protected function validateCreate() {
static::$error_message = [];
if (!$this->name) {
$this->addError('name', 'Название проекта не может быть пустым');
}
return $this->getErrors();
}
// Создание проекта
public function create() {
// Валидация
if ($errors = $this->validateCreate()) {
return $errors;
}
// Получаем максимальный order
$maxOrder = Database::max($this->db_name, 'id_order') ?? 0;
// Вставляем в базу
Database::insert($this->db_name, [
'name' => $this->name,
'id_order' => $maxOrder + 1,
'id_ready' => $this->id_ready
]);
$this->id = Database::id();
return [
'success' => true,
'id' => $this->id
];
}
// Обновление проекта
public function update() {
// Валидация
if ($errors = $this->validate()) {
return $errors;
}
// Проверка что проект существует
$project = Database::get($this->db_name, ['id'], ['id' => $this->id]);
if (!$project) {
$this->addError('project', 'Проект не найден');
return $this->getErrors();
}
// Формируем данные для обновления
$update_data = [
'name' => $this->name
];
// id_ready обновляем только если передан
if ($this->id_ready !== null) {
$update_data['id_ready'] = $this->id_ready;
}
// id_order обновляем только если передан
if ($this->id_order !== null) {
$update_data['id_order'] = $this->id_order;
}
// Обновляем в БД
Database::update($this->db_name, $update_data, [
'id' => $this->id
]);
return ['success' => true];
}
// Удаление проекта
public static function delete($id) {
// Проверка что проект существует
$project = self::checkProject($id);
if (!$project) {
return ['success' => false, 'errors' => ['project' => 'Проект не найден']];
}
// Удаляем все связанные данные
// Удаляем задачи проекта (и их файлы)
$tasks = Database::select('cards_task', ['id'], ['id_project' => $id]);
foreach ($tasks as $task) {
Task::delete($task['id']);
}
// Удаляем колонки проекта
Database::delete('columns', ['id_project' => $id]);
// Удаляем отделы проекта
Database::delete('departments', ['id_project' => $id]);
// Удаляем сам проект
Database::delete('project', ['id' => $id]);
return ['success' => true];
}
// Получение всех проектов
public function getAll() {
return Database::select($this->db_name, [
'id',
'id_order',
'name',
'id_ready'
], [
'ORDER' => ['id_order' => 'ASC']
]);
}
// Получение одного проекта
public static function get($id) {
return Database::get('project', [
'id',
'id_order',
'name',
'id_ready'
], ['id' => $id]);
}
// Получение 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;
}
// Установка id_ready для проекта
public static function setReadyColumn($project_id, $column_id) {
// Проверка что проект существует
$project = self::checkProject($project_id);
if (!$project) {
return ['success' => false, 'errors' => ['project' => 'Проект не найден']];
}
// Проверка что колонка существует и принадлежит этому проекту
$column = Database::get('columns', ['id', 'id_project'], ['id' => $column_id]);
if (!$column || (int)$column['id_project'] !== (int)$project_id) {
return ['success' => false, 'errors' => ['column' => 'Колонка не найдена или не принадлежит проекту']];
}
// Обновляем id_ready
Database::update('project', [
'id_ready' => $column_id
], [
'id' => $project_id
]);
return ['success' => true, 'id_ready' => $column_id];
}
// Получение колонок проекта
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) {
$project = self::get($project_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 checkProject($project_id) {
return Database::get('project', '*', ['id' => $project_id]);
}
// Проверка проекта с ответом (при ошибке — сразу ответ и exit)
public static function check($project_id) {
$project = self::checkProject($project_id);
if (!$project_id || !$project) {
RestApi::response(['success' => false, 'errors' => ['project' => 'Проект не найден']], 400);
}
return $project;
}
}
?>