mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
85 lines
2.6 KiB
PHP
85 lines
2.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Chill is a software for social workers.
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph;
|
|
|
|
use Chill\MainBundle\Entity\User;
|
|
use DateInterval;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Doctrine\ORM\Query\ResultSetMapping;
|
|
use Doctrine\ORM\Query\ResultSetMappingBuilder;
|
|
use function strtr;
|
|
|
|
/**
|
|
* Contains classes and methods for fetching users with some calendar metadatas.
|
|
*/
|
|
class MSGraphUserRepository
|
|
{
|
|
private const MOST_OLD_SUBSCRIPTION_OR_ANY_MS_GRAPH = <<<'SQL'
|
|
select
|
|
{select}
|
|
from users u
|
|
where
|
|
NOT attributes ?? 'msgraph'
|
|
OR NOT attributes->'msgraph' ?? 'subscription_events_expiration'
|
|
OR (attributes->'msgraph' ?? 'subscription_events_expiration' AND (attributes->'msgraph'->>'subscription_events_expiration')::int < EXTRACT(EPOCH FROM (NOW() + :interval::interval)))
|
|
LIMIT :limit OFFSET :offset
|
|
;
|
|
SQL;
|
|
|
|
private EntityManagerInterface $entityManager;
|
|
|
|
public function __construct(EntityManagerInterface $entityManager)
|
|
{
|
|
$this->entityManager = $entityManager;
|
|
}
|
|
|
|
public function countByMostOldSubscriptionOrWithoutSubscriptionOrData(DateInterval $interval): int
|
|
{
|
|
$rsm = new ResultSetMapping();
|
|
$rsm->addScalarResult('c', 'c');
|
|
|
|
$sql = strtr(self::MOST_OLD_SUBSCRIPTION_OR_ANY_MS_GRAPH, [
|
|
'{select}' => 'COUNT(u) AS c',
|
|
'LIMIT :limit OFFSET :offset' => '',
|
|
]);
|
|
|
|
return $this->entityManager->createNativeQuery($sql, $rsm)->setParameters([
|
|
'interval' => $interval,
|
|
])->getSingleScalarResult();
|
|
}
|
|
|
|
/**
|
|
* @return array<User>
|
|
*/
|
|
public function findByMostOldSubscriptionOrWithoutSubscriptionOrData(DateInterval $interval, int $limit = 50, int $offset = 0): array
|
|
{
|
|
$rsm = new ResultSetMappingBuilder($this->entityManager);
|
|
$rsm->addRootEntityFromClassMetadata(User::class, 'u');
|
|
|
|
return $this->entityManager->createNativeQuery(
|
|
strtr(self::MOST_OLD_SUBSCRIPTION_OR_ANY_MS_GRAPH, ['{select}' => $rsm->generateSelectClause()]),
|
|
$rsm
|
|
)->setParameters([
|
|
'interval' => $interval,
|
|
'limit' => $limit,
|
|
'offset' => $offset,
|
|
])->getResult();
|
|
}
|
|
}
|