Files
kupshop/bundles/KupShop/UserBundle/Feed/UserConfigurableFeed.php
2025-08-02 16:30:27 +02:00

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);
}
}
}
}