Lines 100.00% 15 / 15
Methods 100.00% 3 / 3
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 findByOwner 100.00% 1 / 1 100.00% 1 / 1 1
 findOverlappingTravel 100.00% 13 / 13 100.00% 1 / 1 2
15class TimelineEventRepository extends ServiceEntityRepository
16{
17    public function __construct(ManagerRegistry $registry)
18    {
19        parent::__construct($registry, TimelineEvent::class);
20    }
21
22    /**
23     * @return list<TimelineEvent> newest first
24     */
25    public function findByOwner(User $owner): array
26    {
27        return $this->findBy(['owner' => $owner], ['date' => 'DESC', 'id' => 'DESC']);
28    }
29
30    /**
31     * The owner's first travel (an event with an end date) on any day from $date to $endDate
32     * (both included), other than $event: travels cannot overlap.
33     */
34    public function findOverlappingTravel(User $owner, TimelineEvent $event, \DateTimeImmutable $date, \DateTimeImmutable $endDate): ?TimelineEvent
35    {
36        $query = $this->createQueryBuilder('e')
37            ->andWhere('e.owner = :owner')
38            ->andWhere('e.endDate IS NOT NULL')
39            ->andWhere('e.date <= :endDate')
40            ->andWhere('e.endDate >= :date')
41            ->setParameter('owner', $owner)
42            ->setParameter('date', $date, 'date_immutable')
43            ->setParameter('endDate', $endDate, 'date_immutable')
44            ->orderBy('e.date')
45            ->setMaxResults(1);
46
47        if (null !== $event->id) {
48            $query->andWhere('e.id != :id')->setParameter('id', $event->id);
49        }
50
51        /* @var TimelineEvent|null */
52        return $query->getQuery()->getOneOrNullResult();
53    }
54}