custom/plugins/ShopStudioBlog/src/Content/BlogPost/SalesChannel/Detail/BlogPostDetailRoute.php line 106

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace ShopStudio\Blog\Content\BlogPost\SalesChannel\Detail;
  3. use OpenApi\Annotations as OA;
  4. use ShopStudio\Blog\Content\BlogPost\Exception\BlogPostNotFoundException;
  5. use ShopStudio\Blog\Content\BlogPost\SalesChannel\BlogPostAvailableFilter;
  6. use ShopStudio\Blog\Content\BlogPost\SalesChannel\SalesChannelBlogPostEntity;
  7. use ShopStudio\Blog\Content\BlogPost\SalesChannel\Schema\Detail\BlogPostDetailSchemaFactory;
  8. use ShopStudio\Blog\Content\Category\Service\CategoryBreadcrumbBuilder;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  10. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  11. use Shopware\Core\Framework\Routing\Annotation\Entity;
  12. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  13. use Shopware\Core\Framework\Routing\Annotation\Since as OASince;
  14. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  15. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. /**
  19.  * @since 1.0.0
  20.  *
  21.  * @RouteScope(scopes={"store-api"})
  22.  */
  23. class BlogPostDetailRoute extends AbstractBlogPostDetailRoute
  24. {
  25.     /**
  26.      * @since 1.0.0
  27.      */
  28.     private SalesChannelRepositoryInterface $repository;
  29.     /**
  30.      * @since 1.0.0
  31.      */
  32.     private BlogPostDetailSchemaFactory $schemaFactory;
  33.     /**
  34.      * @since 2.12.0
  35.      */
  36.     private CategoryBreadcrumbBuilder $breadcrumbBuilder;
  37.     /**
  38.      * @since 2.12.0
  39.      */
  40.     public function __construct(
  41.         SalesChannelRepositoryInterface $repository,
  42.         BlogPostDetailSchemaFactory $schemaFactory,
  43.         CategoryBreadcrumbBuilder $breadcrumbBuilder
  44.     ) {
  45.         $this->repository $repository;
  46.         $this->schemaFactory $schemaFactory;
  47.         $this->breadcrumbBuilder $breadcrumbBuilder;
  48.     }
  49.     /**
  50.      * @since 1.0.0
  51.      */
  52.     public function getDecorated(): AbstractBlogPostDetailRoute
  53.     {
  54.         throw new DecorationPatternException(self::class);
  55.     }
  56.     /**
  57.      * @since 1.0.0
  58.      *
  59.      * @Entity("shopstudio_blog_blog_post")
  60.      *
  61.      * @OASince("2.0.0")
  62.      *
  63.      * @Route("/store-api/shop-studio-blog/blog-post-detail/{blogPostId}", name="store-api.shop-studio-blog.blog-post-detail", methods={"POST"})
  64.      *
  65.      * @OA\Post(
  66.      *      path="/shop-studio-blog/blog-post-detail/{blogPostId}",
  67.      *      summary="This route is used to load a single blog post with the corresponding details.",
  68.      *      operationId="shopStudioBlogReadBlogPostDetail",
  69.      *      tags={"Store API","Shop Studio Blog"},
  70.      *      @OA\Parameter(name="blogPostId", description="Blog post ID", @OA\Schema(type="string"), in="path", required=true),
  71.      *      @OA\Response(
  72.      *          response="200",
  73.      *          description="Found blog post"
  74.      *     )
  75.      * )
  76.      */
  77.     public function load(string $blogPostIdRequest $requestSalesChannelContext $contextCriteria $criteria): BlogPostDetailRouteResponse
  78.     {
  79.         $this->addFilters($context$criteria);
  80.         $criteria->setIds([$blogPostId]);
  81.         $blogPost $this->repository
  82.             ->search($criteria$context)
  83.             ->first()
  84.         ;
  85.         if (!$blogPost instanceof SalesChannelBlogPostEntity) {
  86.             throw new BlogPostNotFoundException($blogPostId);
  87.         }
  88.         $blogPost->setSeoCategory(
  89.             $this->breadcrumbBuilder->getBlogPostSeoCategory($blogPost$context)
  90.         );
  91.         return new BlogPostDetailRouteResponse(
  92.             $blogPost,
  93.             $this->schemaFactory->create($blogPost$context)
  94.         );
  95.     }
  96.     /**
  97.      * @since 1.0.0
  98.      */
  99.     private function addFilters(SalesChannelContext $contextCriteria $criteria): void
  100.     {
  101.         $criteria->addFilter(
  102.             new BlogPostAvailableFilter(
  103.                 $context->getSalesChannel()->getId(),
  104.                 $context->getLanguageId()
  105.             )
  106.         );
  107.     }
  108. }