<?php
namespace App\Controller\Content;
use App\Entity\Category;
use App\Entity\Content;
use App\Entity\ContentImageset;
use App\Entity\Member;
use App\Service\Content\ContentService;
use App\Service\Content\ImagesetService;
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/content")
*/
class PublicImagesetController extends AbstractController
{
protected ImagesetService $service;
protected ContentService $contentService;
protected StructSerializer $structSerializer;
protected StructOptions $listStructOptions;
public function __construct(ImagesetService $service, ContentService $contentService, StructSerializer $serializer2)
{
$this->service = $service;
$this->contentService = $contentService;
$this->structSerializer = $serializer2;
$this->listStructOptions = StructOptions::create();
$this->listStructOptions->skipProperty(Content::class, 'categories');
$this->listStructOptions->skipProperty(Content::class, 'comments');
$this->listStructOptions->skipProperty(Content::class, 'actors');
$this->listStructOptions->skipProperty(Content::class, 'video');
$this->listStructOptions->skipProperty(Member::class, 'main_photo');
$this->listStructOptions->skipProperty(Member::class, 'member_online');
}
/**
* @SWG\Get(
* tags={"Content", "Imageset"},
*
* @SWG\Response(response=200, description="Paginated list of the most recently published imagesets, active only",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", description="Number of items per page for pagination")
* )
*
* @Route("/imagesets/{page}", methods={"GET"}, requirements={"page": "\d+"})
*
* @return JsonResponse
*/
public function index(Request $request, int $page = 1)
{
$limit = $request->query->getInt('limit', 20);
$paginator = $this->service->getRepository()->getFreshImagesets($page, $limit);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
$paginator->getIterator()->getArrayCopy()),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(
* tags={"Content", "Imageset"},
*
* @SWG\Response(response=200, description="Details of the requested imageset ID",
*
* @SWG\Schema(ref=@Model(type=App\Entity\ContentImageset::class, groups={"contentlist", "contentdetail", "imagesetimages", "previewphotolist", "memberonlineindex"}))),
*
* @SWG\Parameter(name="imageset", in="path", type="integer", required=true, description="Requested imageset ID"),
* )
*
* @Route("/imageset/{imageset}", methods={"GET"}, requirements={"imageset": "\d+"})
*/
public function detail(Request $request, ContentImageset $imageset): JsonResponse
{
$options = StructOptions::create();
$options->includeImagesetImages(true);
$options->skipProperty(Content::class, 'video');
$options->skipProperty(Member::class, 'member_online');
return new JsonResponse(
$this->structSerializer->toArray($options, $imageset),
);
}
/**
* @SWG\Get(tags={"Content", "Imageset"},
*
* @SWG\Response(response=200, description="Find an imageset by slug",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist", "contentdetail", "actorlist", "imagesetimages", "previewphotolist", "memberonlineindex", "membermainphoto"}))),
*
* @SWG\Parameter(name="slug", in="path", type="string", required=true, description="Unique slug url"),
* )
*
* @Route("/imageset/slug/{slug}", methods={"GET"})
*/
public function slug(string $slug): JsonResponse
{
if (!$imageset = $this->service->findBySlug($slug)) {
throw $this->createNotFoundException('Imageset not found by slug.');
}
$options = StructOptions::create();
$options->includeImagesetImages(true);
$options->skipProperty(Content::class, 'video');
$options->skipProperty(Member::class, 'member_online');
return new JsonResponse(
$this->structSerializer->toArray($options, $imageset),
);
}
/**
* @SWG\Get(
* tags={"Content", "Imageset"},
*
* @SWG\Response(
* response=200,
* description="Paginated list of the best rated imagesets of the last 7 days",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", description="Number of items per page for pagination")
* )
*
* @Route("/imagesets/bestoftheweek/{page}", methods={"GET"}, requirements={"page": "\d+"})
*/
public function bestoftheweek(Request $request, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 20);
$paginator = $this->service->getRepository()->getBestImagesetsOfTheWeek($page, $limit);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
$paginator->getIterator()->getArrayCopy()),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(
* tags={"Content", "Imageset"},
*
* @SWG\Response(
* response=200,
* description="Paginated list of the best rated imagesets of the last 30 days",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist"}))),
*
* @SWG\Parameter(name="page", in="path", type="integer", description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", description="Number of items per page for pagination")
* )
*
* @Route("/imagesets/bestofthemonth/{page}", methods={"GET"}, requirements={"page": "\d+"})
*/
public function bestofthemonth(Request $request, int $page = 1): JsonResponse
{
$limit = $request->query->getInt('limit', 20);
$paginator = $this->service->getRepository()->getBestImagesetsOfTheMonth($page, $limit);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
$paginator->getIterator()->getArrayCopy()),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Content", "Imageset"},
*
* @SWG\Response(response=200, description="Paginated list of imagesets in a given category",
*
* @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist", "previewphotolist"}))),
*
* @SWG\Parameter(name="category", in="path", type="integer", required=true, description="Category ID in question"),
* @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("/imagesets/category/{category}/{page}", methods={"GET"}, requirements={"category": "\d+", "page": "\d+"})
*/
public function category(Request $request, Category $category, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 18);
$paginator = $this->service->getActiveImagesetsByCategory($category, $page, $limit);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
$paginator->getIterator()->getArrayCopy()),
'total' => $paginator->count(),
]);
}
}