custom/plugins/SasBlogModule/src/Core/Content/Cms/BlogAssignment/ProductBlogAssignmentRoute.php line 33

  1. <?php declare(strict_types=1);
  2. namespace Sas\BlogModule\Core\Content\Cms\BlogAssignment;
  3. use Sas\BlogModule\Content\Blog\BlogEntriesCollection;
  4. use Shopware\Core\Content\Product\ProductEntity;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  8. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. #[Route(defaults: ['_routeScope' => ['store-api']])]
  12. class ProductBlogAssignmentRoute extends AbstractProductBlogAssignmentRoute
  13. {
  14.     /**
  15.      * @internal
  16.      */
  17.     public function __construct(
  18.         private readonly EntityRepository $productRepository,
  19.     ) {
  20.     }
  21.     public function getDecorated(): AbstractProductBlogAssignmentRoute
  22.     {
  23.         throw new DecorationPatternException(self::class);
  24.     }
  25.     #[Route(path'/store-api/product/{productId}/blog-assignment'name'store-api.product.blog-assignment'defaults: ['_entity' => 'product'], methods: ['POST'])]
  26.     public function load(string $productIdRequest $requestSalesChannelContext $contextCriteria $criteria): ProductBlogAssignmentRouteResponse
  27.     {
  28.         $product $this->loadProduct($productId$context);
  29.         if (!$product) {
  30.             return new ProductBlogAssignmentRouteResponse(new BlogEntriesCollection());
  31.         }
  32.         $blogs $product->getExtension('assignedBlogs');
  33.         if (!$blogs instanceof BlogEntriesCollection) {
  34.             return new ProductBlogAssignmentRouteResponse(new BlogEntriesCollection());
  35.         }
  36.         return new ProductBlogAssignmentRouteResponse($blogs);
  37.     }
  38.     private function loadProduct(string $productIdSalesChannelContext $context): ?ProductEntity
  39.     {
  40.         $criteria = new Criteria([$productId]);
  41.         $criteria->addAssociation('assignedBlogs.media');
  42.         $product $this->productRepository->search($criteria$context->getContext())->first();
  43.         if (!$product instanceof ProductEntity) {
  44.             return null;
  45.         }
  46.         return $product;
  47.     }
  48. }