tao-test/app/taoEventLog/model/export/implementation/LogEntryRepository.php

144 lines
4.3 KiB
PHP
Raw Normal View History

2022-08-29 20:14:13 +02:00
<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2019 (original work) Open Assessment Technologies SA;
*/
namespace oat\taoEventLog\model\export\implementation;
use common_session_SessionManager;
use DateTime;
use DateTimeImmutable;
use DateTimeZone;
use oat\oatbox\service\ServiceManager;
use oat\taoEventLog\model\eventLog\LoggerService;
use oat\taoEventLog\model\export\LogEntryRepositoryInterface;
class LogEntryRepository implements LogEntryRepositoryInterface
{
/** @var LoggerService $loggerService */
private $loggerService;
/**
* @var array
*/
private $filters;
/**
* @var string
*/
private $sortColumn;
/**
* @var string
*/
private $sortOrder;
/**
* @param array $filters
* @param string $sortColumn
* @param string $sortOrder
*/
public function __construct(array $filters = [], $sortColumn = null, $sortOrder = null)
{
$this->loggerService = ServiceManager::getServiceManager()->get(LoggerService::SERVICE_ID);
$this->filters = $filters;
$this->sortColumn = $sortColumn;
$this->sortOrder = $sortOrder;
}
/**
* @return \Generator
*
* @throws \common_exception_Error
*/
public function fetch()
{
$internalLimit = $this->loggerService->hasOption(LoggerService::OPTION_FETCH_LIMIT)
? $this->loggerService->getOption(LoggerService::OPTION_FETCH_LIMIT)
: 500;
$limit = $this->loggerService->getOption(LoggerService::OPTION_EXPORTABLE_QUANTITY);
$options = [
'sort' => $this->sortColumn,
'order' => $this->sortOrder,
];
$preparedFilters = $this->prepareFilters($this->filters);
$lastId = null;
$fetched = 0;
do {
$extendedPreparedFilters = (null !== $lastId)
? array_merge($preparedFilters, [['id', '<', $lastId]])
: $preparedFilters;
$leftToFetch = $limit - $fetched;
$options['limit'] = $leftToFetch < $internalLimit ? $leftToFetch : $internalLimit;
$logs = $this->loggerService->search($extendedPreparedFilters, $options);
$count = count($logs);
if ($count > 0) {
$fetched += $count;
$lastId = $logs[$count - 1]['id'];
foreach ($logs as $log) {
yield $log;
}
}
} while ($count > 0 && $fetched < $limit);
}
/**
* @param array $filters
*
* @return array
*
* @throws \common_exception_Error
* @throws \Exception
*/
private function prepareFilters(array $filters = [])
{
/** @var \common_session_Session $session */
$session = common_session_SessionManager::getSession();
$timeZone = new DateTimeZone($session->getTimeZone());
$utc = new DateTimeZone('UTC');
$result = [];
foreach ($filters as $name => $value) {
if (!empty($value)) {
switch ($name) {
case 'from':
$from = new DateTimeImmutable($filters['from'], $timeZone);
$result[] = ['occurred', '>', $from->setTimezone($utc)->format(DateTime::ISO8601)];
break;
case 'to':
$to = new DateTimeImmutable($filters['to'], $timeZone);
$result[] = ['occurred', '<=', $to->setTimezone($utc)->format(DateTime::ISO8601)];
break;
default:
$result[] = [$name, 'LIKE', "%$value%"];
}
}
}
return $result;
}
}