<?php
namespace App\Controller\User;
use App\Entity\Ad;
use App\Entity\Webmaster;
use App\Service\User\Layer\AmateurLayer;
use App\Service\Webmaster\AdService;
use App\StructSerializer\Main\StructOptions;
use App\StructSerializer\Main\StructSerializer;
use Nelmio\ApiDocBundle\Annotation\Model;
use Swagger\Annotations as SWG;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api/public/user/amateur")
*/
class PublicAmateurController extends AbstractController
{
protected AmateurLayer $service;
protected StructSerializer $structSerializer;
public function __construct(AmateurLayer $service, StructSerializer $structSerializer)
{
$this->service = $service;
$this->structSerializer = $structSerializer;
}
/**
* @SWG\Get(tags={"Amateur"},
*
* @SWG\Response(
* response=200, description="Paginated list of new amateurs, sorted by upgrade date",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "mediaindex", "commonids"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=18, description="Number of items per page for pagination")
* )
*
* @Route("/recent/{page}", methods={"GET"}, requirements={"page": "\d+"})
*/
public function recent(Request $request, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 18);
$paginator = $this->service->getRecentAmateurs($page, $limit);
$options = new StructOptions();
$options->loadMemberLikes(true);
$options->loadMemberProfileValues(true);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Amateur"},
*
* @SWG\Response(response=200, description="Paginated list of top amateurs, sorted by rank",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "mediaindex", "commonids"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=18, description="Number of items per page for pagination"),
* @SWG\Parameter(name="withImageOnly", in="query", type="boolean", required=false, default=false, description="With profile image only or not consider"),
* @SWG\Parameter(name="onlineOnly", in="query", type="boolean", required=false, default=false, description="Currently online only or not consider")
* )
*
* @Route("/top/{page}", methods={"GET"}, requirements={"page": "\d+"})
*/
public function top(Request $request, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 18);
$withImage = $request->query->getBoolean('withImageOnly', false);
$onlineOnly = $request->query->getBoolean('onlineOnly', false);
$skipIds = $this->service->getSkipInListAmateurIds();
$paginator = $this->service->getTopAmateurs($page, $limit, $withImage, $onlineOnly, $skipIds);
$options = new StructOptions();
$options->loadMemberLikes(true);
$options->loadMemberProfileValues(true);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Amateur"},
*
* @SWG\Response(response=200, description="Paginated list of random amateurs",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "mediaindex", "commonids"}))),
*
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=18, description="Number of items per page for pagination"),
* @SWG\Parameter(name="withImageOnly", in="query", type="boolean", required=false, default=false, description="With profile image only or not consider"),
* )
*
* @Route("/random", methods={"GET"})
*/
public function random(Request $request): JsonResponse
{
$limit = $request->query->getInt('limit', 18);
$withImage = $request->query->getBoolean('withImageOnly', false);
$skipIds = $this->service->getSkipInListAmateurIds();
$paginator = $this->service->getRandomAmateurs($limit, $withImage, $skipIds);
$options = new StructOptions();
$options->loadMemberLikes(true);
$options->loadMemberProfileValues(true);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Amateur"},
*
* @SWG\Response(response=200, description="Paginated list of amateurs with an active webcam, sorted by rank",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "mediaindex", "commonids"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=18, description="Number of items per page for pagination")
* )
*
* @Route("/livecams/{page}", methods={"GET"}, requirements={"page": "\d+"})
*/
public function livecams(Request $request, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 15);
$paginator = $this->service->getLivecamAmateurs($page, $limit);
$options = new StructOptions();
$options->loadMemberLikes(true);
$options->loadMemberProfileValues(true);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Amateur"},
*
* @SWG\Response(response=200, description="Paginated list of online amateurs, sorted by online rank",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "mediaindex", "commonids"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=18, description="Number of items per page for pagination"),
* @SWG\Parameter(name="maximumLoginAgeMinutes", in="query", type="integer", required=false, default=10, description="Maximum minutes to still be considered online")
* )
*
* @Route("/online/{page}", methods={"GET"}, requirements={"page": "\d+"})
*
* @throws \Exception
*/
public function online(Request $request, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 18);
$minutes = null;
if ($request->query->has('maximumLoginAgeMinutes')) {
$minutes = $request->query->getInt('maximumLoginAgeMinutes', 10);
}
$paginator = $this->service->getOnlineAmateurs($page, $limit, $minutes);
$options = new StructOptions();
$options->loadMemberLikes(true);
$options->loadMemberProfileValues(true);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Amateur", "Webmaster", "Ad"},
*
* @SWG\Response(response=200, description="Paginated list of amateurs for a given ad",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "mediaindex", "commonids"}))),
*
* @SWG\Parameter(name="webmaster", in="path", type="integer", required=true, description="Owning webmaster of the ad"),
* @SWG\Parameter(name="ad", in="path", type="integer", required=true, description="Ad ID in question")
* )
*
* @Route("/amateurad/{webmaster}/{ad}", methods={"GET"}, requirements={"webmaster": "\d+", "ad": "\d+"})
*
* @throws \Exception
*/
public function ad(AdService $adService, Webmaster $webmaster, int $ad): JsonResponse
{
if ($ad > 0) {
$adEntity = $adService->findById($ad);
} else {
$adEntity = $adService->getAmateurAdDemo();
}
$paginator = $this->service->getAmateursForWebmasterAd($adEntity);
$options = new StructOptions();
$options->loadMemberLikes(false);
$options->loadMemberProfileValues(false);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
}