/**
  * {@inheritdoc}
  */
 public function getAssignedProducts($categoryId)
 {
     $category = $this->categoryRepository->get($categoryId);
     $productsPosition = $category->getProductsPosition();
     /** @var \Magento\Framework\Data\Collection\Db $products */
     $products = $category->getProductCollection();
     /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface[] $links */
     $links = [];
     /** @var \Magento\Catalog\Model\Product $product */
     foreach ($products->getItems() as $productId => $product) {
         /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface $link */
         $link = $this->productLinkFactory->create();
         $link->setSku($product->getSku())->setPosition($productsPosition[$productId])->setCategoryId($category->getId());
         $links[] = $link;
     }
     return $links;
 }
 /**
  * {@inheritdoc}
  */
 public function getAssignedProducts($categoryId)
 {
     $category = $this->categoryRepository->get($categoryId);
     /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $products */
     $products = $category->getProductCollection();
     $products->addFieldToSelect('position');
     /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface[] $links */
     $links = [];
     /** @var \Magento\Catalog\Model\Product $product */
     foreach ($products->getItems() as $product) {
         /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface $link */
         $link = $this->productLinkFactory->create();
         $link->setSku($product->getSku())->setPosition($product->getData('cat_index_position'))->setCategoryId($category->getId());
         $links[] = $link;
     }
     return $links;
 }
 /**
  * Assign product to given categories
  *
  * @param string $productSku
  * @param \int[] $categoryIds
  * @return bool
  */
 public function assignProductToCategories($productSku, array $categoryIds)
 {
     $product = $this->getProductRepository()->get($productSku);
     $assignedCategories = $this->getProductResource()->getCategoryIds($product);
     foreach (array_diff($assignedCategories, $categoryIds) as $categoryId) {
         $this->getCategoryLinkRepository()->deleteByIds($categoryId, $productSku);
     }
     foreach (array_diff($categoryIds, $assignedCategories) as $categoryId) {
         /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface $categoryProductLink */
         $categoryProductLink = $this->productLinkFactory->create();
         $categoryProductLink->setSku($productSku);
         $categoryProductLink->setCategoryId($categoryId);
         $categoryProductLink->setPosition(0);
         $this->getCategoryLinkRepository()->save($categoryProductLink);
     }
     $productCategoryIndexer = $this->getIndexerRegistry()->get(Indexer\Product\Category::INDEXER_ID);
     if (!$productCategoryIndexer->isScheduled()) {
         $productCategoryIndexer->reindexRow($product->getId());
     }
     return true;
 }