rich-id/terms-module

View on GitHub
src/Infrastructure/Repository/TermsVersionRepository.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace RichId\TermsModuleBundle\Infrastructure\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use RichId\TermsModuleBundle\Domain\Entity\TermsSubjectInterface;
use RichId\TermsModuleBundle\Domain\Entity\TermsVersion;

/** @extends ServiceEntityRepository<TermsVersion> */
class TermsVersionRepository extends ServiceEntityRepository
{
    /** @codeCoverageIgnore  */
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, TermsVersion::class);
    }

    public function findLastSignedVersionForTermsSubject(string $termsSlug, TermsSubjectInterface $subject): ?TermsVersion
    {
        $qb = $this->createQueryBuilder('tv');

        return $qb->join('tv.terms', 't')
            ->join('tv.signatures', 's')
            ->where('t.slug = :termsSlug')
            ->andWhere('s.subjectType = :subjectType')
            ->andWhere('s.subjectIdentifier = :subjectIdentifier')
            ->setParameter('termsSlug', $termsSlug)
            ->setParameter('subjectType', $subject->getTermsSubjectType())
            ->setParameter('subjectIdentifier', $subject->getTermsSubjectIdentifier())
            ->orderBy('tv.version', 'DESC')
            ->setMaxResults(1)
            ->getQuery()
            ->getOneOrNullResult();
    }

    public function findOneByTermsAndVersion(string $termsSlug, int $version): ?TermsVersion
    {
        $qb = $this->createQueryBuilder('tv');

        return $qb->join('tv.terms', 't')
            ->where('t.slug = :termsSlug')
            ->andWhere('tv.version = :version')
            ->setParameter('termsSlug', $termsSlug)
            ->setParameter('version', $version)
            ->getQuery()
            ->getOneOrNullResult();
    }
}