125 lines
3.6 KiB
PHP
125 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace KupShop\UserBundle\Feed;
|
|
|
|
use KupShop\AdminBundle\Util\UsersFilterSpecs;
|
|
use KupShop\FeedGeneratorBundle\Feed\ConfigurableFeedTrait;
|
|
use KupShop\FeedGeneratorBundle\Feed\IConfigurableFeed;
|
|
use KupShop\FeedsBundle\Feed\IFeed;
|
|
use KupShop\UserBundle\Feed\Wrapper\UserWrapper;
|
|
use Query\Operator;
|
|
use Query\QueryBuilder;
|
|
use Symfony\Component\HttpFoundation\RequestStack;
|
|
use Symfony\Contracts\Service\Attribute\Required;
|
|
|
|
class UserConfigurableFeed implements IFeed, IConfigurableFeed
|
|
{
|
|
use \DatabaseCommunication;
|
|
use ConfigurableFeedTrait;
|
|
|
|
public static string $type = 'userConfigurable';
|
|
|
|
public static string $alias = 'Uživatelé';
|
|
|
|
public static string $objectType = 'user';
|
|
|
|
protected ?QueryBuilder $query;
|
|
|
|
protected RequestStack $requestStack;
|
|
|
|
protected UsersFilterSpecs $usersFilterSpecs;
|
|
|
|
public function __construct(UserWrapper $userWrapper, UsersFilterSpecs $usersFilterSpecs)
|
|
{
|
|
$this->objectWrapper = $userWrapper;
|
|
$this->usersFilterSpecs = $usersFilterSpecs;
|
|
}
|
|
|
|
#[Required]
|
|
public function setRequestStack(RequestStack $requestStack): void
|
|
{
|
|
$this->requestStack = $requestStack;
|
|
}
|
|
|
|
#[Required]
|
|
final public function setUsersFilterSpecs(UsersFilterSpecs $usersFilterSpecs): void
|
|
{
|
|
$this->usersFilterSpecs = $usersFilterSpecs;
|
|
}
|
|
|
|
public static function isAllowed(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function filterByObjectID($objectID): void
|
|
{
|
|
$this->specs[] = Operator::equals(['u.id' => $objectID]);
|
|
}
|
|
|
|
public function getQuery(array $feedRow): QueryBuilder
|
|
{
|
|
$qb = sqlQueryBuilder()
|
|
->select('u.*')
|
|
->from('users', 'u');
|
|
|
|
$filter = json_decode($feedRow['settings'] ?: '', true)['filter'] ?? [];
|
|
|
|
$date_from = $this->requestStack->getMainRequest()?->get('date_from');
|
|
$date_to = $this->requestStack->getMainRequest()?->get('date_to');
|
|
|
|
if ($date_from || $date_to) {
|
|
$qb->andWhere(Operator::orX(
|
|
Operator::between('u.date_reg', new \Range($date_from, $date_to)),
|
|
Operator::between('u.date_updated', new \Range($date_from, $date_to)),
|
|
));
|
|
}
|
|
|
|
if ($filterSpecs = ($filter ? $this->usersFilterSpecs->getSpecs($filter) : null)) {
|
|
$qb->andWhere($filterSpecs);
|
|
}
|
|
|
|
if ($this->specs) {
|
|
$qb->andWhere(Operator::andX($this->specs));
|
|
}
|
|
|
|
$this->query = $qb;
|
|
|
|
return $qb;
|
|
}
|
|
|
|
public function getData(array $feedRow, ?int $limit = null): \Generator
|
|
{
|
|
$qb = $this->query ?? $this->getQuery($feedRow);
|
|
|
|
$countQuery = (clone $qb)
|
|
->select('count(u.id) AS c')
|
|
->resetQueryPart('groupBy');
|
|
$count = (int) $countQuery->execute()->fetchOne();
|
|
|
|
// use batching only if limit is NOT set
|
|
$iterationLimit = isset($limit) ? 1 : ($count / (float) static::$batchSize);
|
|
for ($i = 0; $i < $iterationLimit; $i++) {
|
|
$qb->setFirstResult($i * static::$batchSize);
|
|
$qb->setMaxResults($limit ?? static::$batchSize);
|
|
|
|
$users = new FeedUserCollection();
|
|
foreach ($qb->execute() as $row) {
|
|
$user = new \User();
|
|
$user->loadData($row);
|
|
|
|
$users->set($row['id'], $user);
|
|
}
|
|
|
|
$this->objectWrapper->setFeedRow($feedRow);
|
|
$this->objectWrapper->setUsers($users);
|
|
|
|
foreach ($users as $user) {
|
|
yield $this->prepareSingleObject($user);
|
|
}
|
|
}
|
|
}
|
|
}
|