exampleapp/modules/Tasks/Application/Api.php

186 lines
6.1 KiB
PHP
Raw Permalink 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
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;
}
}