91 lines
3.5 KiB
PHP
91 lines
3.5 KiB
PHP
<?php
|
||
|
||
namespace Modules\Tasks\Infrastructure\Storage;
|
||
|
||
use Modules\Src\TraitStorage;
|
||
use Modules\Tasks\Infrastructure\DBQueries\TasksQuery;
|
||
use Modules\Tasks\Infrastructure\OtherQueries\OtherQuery;
|
||
|
||
/**
|
||
* Класс TasksStorage - репозиторий для работы с задачами.
|
||
* Обеспечивает:
|
||
* - Получение списка задач с пагинацией
|
||
* - Получение конкретной задачи по ID
|
||
* - Загрузку дополнительных связанных данных
|
||
*/
|
||
class TasksStorage
|
||
{
|
||
// Используем трейт с общими методами работы с хранилищем
|
||
use TraitStorage;
|
||
|
||
// Запросы к основной таблице задач
|
||
private TasksQuery $tasksQuery;
|
||
|
||
// Запросы для получения дополнительных данных
|
||
private OtherQuery $otherQuery;
|
||
|
||
/**
|
||
* Установка сервиса запросов к задачам
|
||
*/
|
||
public function setTasksQuery(TasksQuery $query): void
|
||
{
|
||
$this->tasksQuery = $query;
|
||
}
|
||
|
||
/**
|
||
* Установка сервиса запросов к дополнительным данным
|
||
*/
|
||
public function setOtherQuery(OtherQuery $query): void
|
||
{
|
||
$this->otherQuery = $query;
|
||
}
|
||
|
||
/**
|
||
* Получение списка задач с пагинацией
|
||
*
|
||
* @param int $limit - количество записей
|
||
* @param int $offset - смещение
|
||
* @param array $dsl - запрашиваемые поля и прочие правила для сборки данных (включая дополнительные данные)
|
||
* @return array - массив задач
|
||
*/
|
||
public function getList(int $limit, int $offset, array $dsl = []): array
|
||
{
|
||
$data = $this->tasksQuery->select($dsl)->limit($limit, $offset)->all();
|
||
$this->receiveAdditionalData($data, $dsl);
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* Получение задачи по ID
|
||
*
|
||
* @param string $id - идентификатор задачи
|
||
* @param array $dsl - запрашиваемые поля и прочие правила для сборки данных
|
||
* @return array - данные задачи
|
||
*/
|
||
public function getById(string $id, array $dsl): array
|
||
{
|
||
$data = $this->tasksQuery->select($dsl)->whereId($id)->all();
|
||
$this->receiveAdditionalData($data, $dsl);
|
||
return array_pop($data) ?? [];
|
||
}
|
||
|
||
/**
|
||
* Загрузка дополнительных данных для задач
|
||
*
|
||
* @param array &$data - ссылка на массив задач (для модификации)
|
||
* @param array $dsl - запрашиваемые поля и прочие правила для сборки данных (определяет какие данные подгружать)
|
||
*/
|
||
private function receiveAdditionalData(array &$data, array $dsl): void
|
||
{
|
||
if (in_array('options', $dsl)) {
|
||
$tasksIds = $this->pluck('id', $data);
|
||
$otherData = $this->otherQuery->getForTasks($tasksIds);
|
||
foreach ($data as &$row) {
|
||
// $myOtherData = $otherData[$row['id']] ?? []; // Правильная реализация была бы такой
|
||
$myOtherData = $otherData[0]; // Текущая упрощенная реализация
|
||
$row['options'] = $myOtherData;
|
||
}
|
||
}
|
||
}
|
||
}
|