186 lines
6.1 KiB
PHP
186 lines
6.1 KiB
PHP
<?php
|
||
|
||
namespace Modules\Tasks\Application;
|
||
|
||
use Modules\Src\TraitDomain;
|
||
use Modules\Src\ResponsesCode;
|
||
use Illuminate\Support\Facades\Log;
|
||
use Modules\Tasks\Infrastructure\Storage\TasksStorage;
|
||
use Modules\Tasks\Dto\Factory as DtoFactory;
|
||
use Modules\Tasks\Infrastructure\DBPersistLayer\TasksLayer;
|
||
|
||
/**
|
||
* Класс Api - основной рабочий класс для операций с задачами.
|
||
* Обеспечивает взаимодействие между:
|
||
* - Валидацией входных данных
|
||
* - Преобразованием DTO
|
||
* - Хранением данных
|
||
*/
|
||
class Api
|
||
{
|
||
// Используем трейт для общих методов
|
||
use TraitDomain;
|
||
|
||
// Валидатор входных данных
|
||
private Validator $validator;
|
||
|
||
// Хранилище задач (доступ к данным)
|
||
private TasksStorage $tasksStorage;
|
||
|
||
// Фабрика для создания DTO объектов
|
||
private DtoFactory $dtoFactory;
|
||
|
||
// Слой персистентности (работа с БД)
|
||
private TasksLayer $tasksLayer;
|
||
|
||
// Внутренний кеш задач
|
||
private array $tasks = [];
|
||
|
||
/**
|
||
* Установка валидатора (внедрение зависимости)
|
||
*/
|
||
public function setValidator(Validator $validator): void
|
||
{
|
||
$this->validator = $validator;
|
||
}
|
||
|
||
/**
|
||
* Установка хранилища задач (внедрение зависимости)
|
||
*/
|
||
public function setTasksStorage(TasksStorage $storage): void
|
||
{
|
||
$this->tasksStorage = $storage;
|
||
}
|
||
|
||
/**
|
||
* Установка фабрики DTO (внедрение зависимости)
|
||
*/
|
||
public function setDtoFactory(DtoFactory $factory): void
|
||
{
|
||
$this->dtoFactory = $factory;
|
||
}
|
||
|
||
/**
|
||
* Установка слоя персистентности (внедрение зависимости)
|
||
*/
|
||
public function setTasksLayer(TasksLayer $layer): void
|
||
{
|
||
$this->tasksLayer = $layer;
|
||
}
|
||
|
||
/**
|
||
* Создание новой задачи
|
||
* @param array $data Входные данные
|
||
* @return bool Успешность операции
|
||
*/
|
||
public function insert(array $data): bool
|
||
{
|
||
// Валидация входных данных
|
||
if (!$this->validator->insert($data)) {
|
||
$this->responseCode = ResponsesCode::VALIDATION_FAILED_CODE;
|
||
$this->errors = $this->validator->getErrors();
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
// Получение очищенных данных после валидации
|
||
$cleanData = $this->validator->getCleanData();
|
||
|
||
// Создание DTO для сохранения
|
||
$task = $this->dtoFactory->createTaskPersist();
|
||
$task->load($cleanData);
|
||
|
||
// Сохранение в БД
|
||
$this->tasksLayer->insert($task);
|
||
return true;
|
||
} catch (\Throwable $e) {
|
||
// Логирование ошибок
|
||
Log::error($e);
|
||
$this->errors['except'][] = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получение задачи по ID
|
||
* @param array $data Входные данные (должен содержать 'id')
|
||
* @return bool Успешность операции
|
||
*/
|
||
public function getById(array $data): bool
|
||
{
|
||
// Валидация входных данных
|
||
if (!$this->validator->getById($data)) {
|
||
$this->responseCode = ResponsesCode::VALIDATION_FAILED_CODE;
|
||
$this->errors = $this->validator->getErrors();
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
// Получение очищенных данных
|
||
$cleanData = $this->validator->getCleanData();
|
||
$id = $cleanData['id'];
|
||
|
||
// Получение данных из хранилища
|
||
$taskData = $this->tasksStorage->getById($id, ['*', 'options']);
|
||
|
||
// Создание DTO и добавление в кеш
|
||
$task = $this->dtoFactory->createTaskResource();
|
||
$task->load($taskData);
|
||
$this->tasks[$task->getId()] = $task;
|
||
|
||
return true;
|
||
} catch (\Throwable $e) {
|
||
Log::error($e);
|
||
$this->errors['except'][] = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получение списка задач с пагинацией
|
||
* @param array $data Входные данные (должны содержать 'limit' и 'offset')
|
||
* @return bool Успешность операции
|
||
*/
|
||
public function getList(array $data): bool
|
||
{
|
||
// Валидация входных данных
|
||
if (!$this->validator->getList($data)) {
|
||
$this->responseCode = ResponsesCode::VALIDATION_FAILED_CODE;
|
||
$this->errors = $this->validator->getErrors();
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
// Получение параметров пагинации
|
||
$cleanData = $this->validator->getCleanData();
|
||
$limit = $cleanData['limit'];
|
||
$offset = $cleanData['offset'];
|
||
|
||
// Получение списка из хранилища
|
||
$tasksData = $this->tasksStorage->getList($limit, $offset, ['*', 'options']);
|
||
|
||
// Преобразование в DTO и сохранение в кеш
|
||
foreach ($tasksData as $taskData) {
|
||
$task = $this->dtoFactory->createTaskResource();
|
||
$task->load($taskData);
|
||
$this->tasks[$task->getId()] = $task;
|
||
}
|
||
|
||
return true;
|
||
} catch (\Throwable $e) {
|
||
Log::error($e);
|
||
$this->errors['except'][] = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получение кешированных задач
|
||
* @return array Массив задач
|
||
*/
|
||
public function getTasks(): array
|
||
{
|
||
return $this->tasks;
|
||
}
|
||
}
|