<?php
namespace App\Service\Content;
use App\Entity\Category;
use App\Entity\ContentVideo;
use App\Entity\Member;
use App\Repository\AbstractRepository;
use App\Repository\ContentVideoRepository;
use App\Response\EntityUpdated;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class VideoService extends AbstractContentService
{
/**
* @var ContentVideoRepository
*/
protected $repo;
/**
* VideoService constructor.
*/
public function __construct(ContentVideoRepository $repo, EventDispatcherInterface $dispatcher)
{
parent::__construct($repo, $dispatcher);
}
/**
* @return ContentVideoRepository
*/
public function getRepository(): AbstractRepository
{
return parent::getRepository();
}
public function getVideosByMember(Member $member, int $page, array $statuses, int $limit): Paginator
{
return $this->repo->getVideosByMember($member, $page, $statuses, $limit);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function storeContentVideo(ContentVideo $video): EntityUpdated
{
$this->storeEntity($video);
return new EntityUpdated(true, $video->getId());
}
/**
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function findBySlug(string $slug, bool $ignoreContentStatus = false): ?ContentVideo
{
if ($ignoreContentStatus) {
return $this->getRepository()->findOneBy(['slug' => $slug]);
}
$qb = $this->getRepository()->getBaseVideoQueryBuilder([]);
$qb->andWhere('v.slug = :slug');
$qb->setParameter(':slug', $slug);
return $qb->getQuery()->getOneOrNullResult();
}
public function getActiveVideosByCategory(Category $category, int $page, int $limit): Paginator
{
$repo = $this->getRepository();
$qb = $repo->getActiveVideosByCategoryQueryBuilder($category);
$qb->setMaxResults($limit);
$qb->setFirstResult($page * $limit - $limit);
return new Paginator($qb->getQuery());
}
/**
* @return Paginator
*/
public function getFreshVideos(int $page, $perPage)
{
return $this->getRepository()->getFreshVideos($page, $perPage);
}
/**
* @return ContentVideo[]
*/
public function getFreshVideosArray(int $page, $perPage): array
{
return $this->getRepository()->getFreshVideosArray($page, $perPage);
}
}