src/Controller/Content/PublicImagesetController.php line 171

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Content;
  3. use App\Entity\Category;
  4. use App\Entity\Content;
  5. use App\Entity\ContentImageset;
  6. use App\Entity\Member;
  7. use App\Service\Content\ContentService;
  8. use App\Service\Content\ImagesetService;
  9. use App\StructSerializer\Main\StructOptions;
  10. use App\StructSerializer\Main\StructSerializer;
  11. use Nelmio\ApiDocBundle\Annotation\Model;
  12. use Swagger\Annotations as SWG;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. /**
  18.  * @Route("/api/public/content")
  19.  */
  20. class PublicImagesetController extends AbstractController
  21. {
  22.     protected ImagesetService $service;
  23.     protected ContentService $contentService;
  24.     protected StructSerializer $structSerializer;
  25.     protected StructOptions $listStructOptions;
  26.     public function __construct(ImagesetService $serviceContentService $contentServiceStructSerializer $serializer2)
  27.     {
  28.         $this->service $service;
  29.         $this->contentService $contentService;
  30.         $this->structSerializer $serializer2;
  31.         $this->listStructOptions StructOptions::create();
  32.         $this->listStructOptions->skipProperty(Content::class, 'categories');
  33.         $this->listStructOptions->skipProperty(Content::class, 'comments');
  34.         $this->listStructOptions->skipProperty(Content::class, 'actors');
  35.         $this->listStructOptions->skipProperty(Content::class, 'video');
  36.         $this->listStructOptions->skipProperty(Member::class, 'main_photo');
  37.         $this->listStructOptions->skipProperty(Member::class, 'member_online');
  38.     }
  39.     /**
  40.      * @SWG\Get(
  41.      *    tags={"Content", "Imageset"},
  42.      *
  43.      *    @SWG\Response(response=200, description="Paginated list of the most recently published imagesets, active only",
  44.      *
  45.      *     @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist"}))),
  46.      *
  47.      *    @SWG\Parameter(name="page", in="path", type="integer", description="Requested page for pagination"),
  48.      *    @SWG\Parameter(name="limit", in="query", type="integer", description="Number of items per page for pagination")
  49.      * )
  50.      *
  51.      * @Route("/imagesets/{page}", methods={"GET"}, requirements={"page": "\d+"})
  52.      *
  53.      * @return JsonResponse
  54.      */
  55.     public function index(Request $requestint $page 1)
  56.     {
  57.         $limit $request->query->getInt('limit'20);
  58.         $paginator $this->service->getRepository()->getFreshImagesets($page$limit);
  59.         return new JsonResponse([
  60.             'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
  61.                 $paginator->getIterator()->getArrayCopy()),
  62.             'total' => $paginator->count(),
  63.         ]);
  64.     }
  65.     /**
  66.      * @SWG\Get(
  67.      *    tags={"Content", "Imageset"},
  68.      *
  69.      *    @SWG\Response(response=200, description="Details of the requested imageset ID",
  70.      *
  71.      *     @SWG\Schema(ref=@Model(type=App\Entity\ContentImageset::class, groups={"contentlist", "contentdetail", "imagesetimages", "previewphotolist", "memberonlineindex"}))),
  72.      *
  73.      *    @SWG\Parameter(name="imageset", in="path", type="integer", required=true, description="Requested imageset ID"),
  74.      * )
  75.      *
  76.      * @Route("/imageset/{imageset}", methods={"GET"}, requirements={"imageset": "\d+"})
  77.      */
  78.     public function detail(Request $requestContentImageset $imageset): JsonResponse
  79.     {
  80.         $options StructOptions::create();
  81.         $options->includeImagesetImages(true);
  82.         $options->skipProperty(Content::class, 'video');
  83.         $options->skipProperty(Member::class, 'member_online');
  84.         return new JsonResponse(
  85.             $this->structSerializer->toArray($options$imageset),
  86.         );
  87.     }
  88.     /**
  89.      * @SWG\Get(tags={"Content", "Imageset"},
  90.      *
  91.      *    @SWG\Response(response=200, description="Find an imageset by slug",
  92.      *
  93.      *     @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist", "contentdetail", "actorlist", "imagesetimages", "previewphotolist", "memberonlineindex", "membermainphoto"}))),
  94.      *
  95.      *    @SWG\Parameter(name="slug", in="path", type="string", required=true, description="Unique slug url"),
  96.      * )
  97.      *
  98.      * @Route("/imageset/slug/{slug}", methods={"GET"})
  99.      */
  100.     public function slug(string $slug): JsonResponse
  101.     {
  102.         if (!$imageset $this->service->findBySlug($slug)) {
  103.             throw $this->createNotFoundException('Imageset not found by slug.');
  104.         }
  105.         $options StructOptions::create();
  106.         $options->includeImagesetImages(true);
  107.         $options->skipProperty(Content::class, 'video');
  108.         $options->skipProperty(Member::class, 'member_online');
  109.         return new JsonResponse(
  110.             $this->structSerializer->toArray($options$imageset),
  111.         );
  112.     }
  113.     /**
  114.      * @SWG\Get(
  115.      *    tags={"Content", "Imageset"},
  116.      *
  117.      *    @SWG\Response(
  118.      *     response=200,
  119.      *     description="Paginated list of the best rated imagesets of the last 7 days",
  120.      *
  121.      *     @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist"}))),
  122.      *
  123.      *    @SWG\Parameter(name="page", in="path", type="integer", description="Requested page for pagination"),
  124.      *    @SWG\Parameter(name="limit", in="query", type="integer", description="Number of items per page for pagination")
  125.      * )
  126.      *
  127.      * @Route("/imagesets/bestoftheweek/{page}", methods={"GET"}, requirements={"page": "\d+"})
  128.      */
  129.     public function bestoftheweek(Request $requestint $page): JsonResponse
  130.     {
  131.         $limit $request->query->getInt('limit'20);
  132.         $paginator $this->service->getRepository()->getBestImagesetsOfTheWeek($page$limit);
  133.         return new JsonResponse([
  134.             'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
  135.                 $paginator->getIterator()->getArrayCopy()),
  136.             'total' => $paginator->count(),
  137.         ]);
  138.     }
  139.     /**
  140.      * @SWG\Get(
  141.      *    tags={"Content", "Imageset"},
  142.      *
  143.      *    @SWG\Response(
  144.      *     response=200,
  145.      *     description="Paginated list of the best rated imagesets of the last 30 days",
  146.      *
  147.      *     @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist"}))),
  148.      *
  149.      *    @SWG\Parameter(name="page", in="path", type="integer", description="Requested page for pagination"),
  150.      *    @SWG\Parameter(name="limit", in="query", type="integer", description="Number of items per page for pagination")
  151.      * )
  152.      *
  153.      * @Route("/imagesets/bestofthemonth/{page}", methods={"GET"}, requirements={"page": "\d+"})
  154.      */
  155.     public function bestofthemonth(Request $requestint $page 1): JsonResponse
  156.     {
  157.         $limit $request->query->getInt('limit'20);
  158.         $paginator $this->service->getRepository()->getBestImagesetsOfTheMonth($page$limit);
  159.         return new JsonResponse([
  160.             'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
  161.                 $paginator->getIterator()->getArrayCopy()),
  162.             'total' => $paginator->count(),
  163.         ]);
  164.     }
  165.     /**
  166.      * @SWG\Get(tags={"Content", "Imageset"},
  167.      *
  168.      *    @SWG\Response(response=200, description="Paginated list of imagesets in a given category",
  169.      *
  170.      *     @SWG\Schema(ref=@Model(type=App\Entity\Content::class, groups={"contentlist", "previewphotolist"}))),
  171.      *
  172.      *    @SWG\Parameter(name="category", in="path", type="integer", required=true, description="Category ID in question"),
  173.      *    @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
  174.      *    @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=18, description="Number of items per page for pagination")
  175.      * )
  176.      *
  177.      * @Route("/imagesets/category/{category}/{page}", methods={"GET"}, requirements={"category": "\d+", "page": "\d+"})
  178.      */
  179.     public function category(Request $requestCategory $categoryint $page): JsonResponse
  180.     {
  181.         $limit $request->query->getInt('limit'18);
  182.         $paginator $this->service->getActiveImagesetsByCategory($category$page$limit);
  183.         return new JsonResponse([
  184.             'data' => $this->structSerializer->multipleToArray($this->listStructOptions,
  185.                 $paginator->getIterator()->getArrayCopy()),
  186.             'total' => $paginator->count(),
  187.         ]);
  188.     }
  189. }