<?php
namespace App\Service\User\Layer;
use App\Entity\Ad;
use App\Entity\Member;
use App\Lib\Property\MemberPropertyProviderInterface;
use App\Repository\MemberRepository;
use App\Service\MemberService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Pagination\Paginator;
class AmateurLayer implements MemberPropertyProviderInterface
{
/**
* @var string
*/
public const PROPERTY_SKIP_IN_LISTS = 'amateur.skip-in-lists';
/**
* @var string
*/
public const PROPERTY_AMATEUR_SIDEBAR_SLIDER_DISABLED = 'amateur.sidebar.slider.disabled';
protected MemberService $memberService;
protected EntityManagerInterface $entityManager;
/**
* AmateurLayer constructor.
*/
public function __construct(MemberService $memberService, EntityManagerInterface $entityManager)
{
$this->setMemberService($memberService);
$this->setEntityManager($entityManager);
}
protected function setEntityManager(EntityManagerInterface $entityManager): self
{
$this->entityManager = $entityManager;
return $this;
}
protected function getEntityManager(): EntityManagerInterface
{
return $this->entityManager;
}
protected function setMemberService(MemberService $memberService): self
{
$this->memberService = $memberService;
return $this;
}
protected function getMemberService(): MemberService
{
return $this->memberService;
}
public function getProvidedPropertyType(string $name): ?string
{
switch ($name) {
case self::PROPERTY_SKIP_IN_LISTS:
case self::PROPERTY_AMATEUR_SIDEBAR_SLIDER_DISABLED:
return self::PROPTYPE_BOOL;
}
return null;
}
public function getProvidedProperties(): array
{
return [
self::PROPERTY_SKIP_IN_LISTS => 'Amateure - In Topliste ausblenden',
self::PROPERTY_AMATEUR_SIDEBAR_SLIDER_DISABLED => 'Slider in Sidebar ausblenden', // label is used in FE
];
}
public function getDefaultValueForProperty(string $property)
{
switch ($property) {
case self::PROPERTY_SKIP_IN_LISTS:
return false;
case self::PROPERTY_AMATEUR_SIDEBAR_SLIDER_DISABLED:
return true;
}
return null;
}
/**
* @return int[]
*/
public function getSkipInListAmateurIds(): array
{
$conn = $this->getEntityManager()->getConnection();
$prop = self::PROPERTY_SKIP_IN_LISTS;
$result = $conn->fetchAllAssociative('SELECT member_id FROM MemberProperty WHERE value = 1 and name = "'.$prop.'"');
$ids = [];
foreach ($result as $row) {
$ids[] = (int) $row['member_id'];
}
return $ids;
}
public function getTopAmateurs(int $page, int $limit, bool $image, bool $online, ?array $skipIds = null,
?array $idList = null): Paginator
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
$qb = $repo->getTopAmateursQueryBuilder($image, $online, $skipIds, $idList);
$qb->setMaxResults($limit);
$qb->setFirstResult($page * $limit - $limit);
return new Paginator($qb->getQuery());
}
/**
* @throws \Exception
*/
public function getOnlineAmateurs(int $page, int $limit, ?int $minutes = null): Paginator
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
if ($minutes > 0) {
$lastOnlineAt = new \DateTime($minutes.' minutes ago');
$qb = $repo->getOnlineAmateursQueryBuilder($lastOnlineAt);
} else {
$qb = $repo->getOnlineAmateursQueryBuilder();
}
$qb->setMaxResults($limit);
$qb->setFirstResult($page * $limit - $limit);
return new Paginator($qb->getQuery());
}
public function getLivecamAmateurs(int $page, int $limit): Paginator
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
$qb = $repo->getLivecamAmateursQueryBuilder();
$qb->setMaxResults($limit);
$qb->setFirstResult($page * $limit - $limit);
return new Paginator($qb->getQuery());
}
public function getRecentAmateurs(int $page, int $limit): Paginator
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
$qb = $repo->getRecentAmateursQueryBuilder();
$qb->setMaxResults($limit);
$qb->setFirstResult($page * $limit - $limit);
return new Paginator($qb->getQuery());
}
public function getRandomAmateurs(int $limit, bool $withImageOnly = true, array $skipMemberIds = []): Paginator
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
$qb = $repo->findRandomRemarkableAmateur($limit, $withImageOnly, $skipMemberIds);
return new Paginator($qb->getQuery());
}
/**
* @return Member[]
*/
public function getRandomAmateursArray(int $limit, bool $withImageOnly = true, array $skipMemberIds = []): array
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
return $repo->findRandomRemarkableAmateur($limit, $withImageOnly, $skipMemberIds)->getQuery()->getResult();
}
public function getAmateursForWebmasterAd(Ad $ad): Paginator
{
/**
* @var $repo MemberRepository
*/
$repo = $this->getMemberService()->getRepository();
$qb = $repo->getAmateurAdQueryBuilder($ad);
$maxResults = $ad->getSizeWidth() * $ad->getSizeHeight();
if ($maxResults < 2) {
$maxResults = 2;
}
$qb->setMaxResults($maxResults);
return new Paginator($qb->getQuery());
}
}