magento / meta-for-magento2

39 stars 23 forks source link

Incompatibility with the enterprise edition database (adobe commerce cloud) when receiving a response from the manual category push #87

Open bonllavier opened 2 months ago

bonllavier commented 2 months ago

Preconditions (*)

1.Adobe commerce cloud 2.4.6 p6, php 8.1.28 2.Meta Extension Version: 1.3.3

Steps to reproduce (*)

  1. Go to admin area > Store > Configuration > Facebook and Instagram > Extension Settings
  2. Go to "manual data sync" section
  3. press button "Push categories to meta"
  4. categories are uploaded correctly, but log file: "/var/log/meta/meta-business-extension.log" is showing a error

Expected result (*)

  1. log file: "/var/log/meta/meta-business-extension.log" not showing errors when manual catalog push is trigger

Actual result (*)

  1. log file: "/var/log/meta/meta-business-extension.log" is showing the following error:

  2. Screenshot_20240918_111912 reporerro324253463432

  3. [2024-09-17T05:00:31.722383+00:00] FBE.INFO: saving product set id for category Accesorios ,id 493 ,storeId 43 and setId 8349883411721373 [] [] [2024-09-17T05:00:31.722923+00:00] FBE.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'entity_id' in 'field list', query was: INSERT INTOcatalog_category_entity_varchar(attribute_id,store_id,entity_id,value`) VALUES (?, ?, ?, ?) [] [] [2024-09-17T05:00:31.722980+00:00] FBE.ERROR: #0 /app/vendor/magento/framework/DB/Statement/Pdo/Mysql.php(91): Magento\Framework\DB\Statement\Pdo\Mysql->tryExecute(Object(Closure))

    1 /app/vendor/magento/zend-db/library/Zend/Db/Statement.php(313): Magento\Framework\DB\Statement\Pdo\Mysql->_execute(Array)

    2 /app/vendor/magento/zend-db/library/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)

    3 /app/vendor/magento/zend-db/library/Zend/Db/Adapter/Pdo/Abstract.php(242): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)

    4 /app/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php(564): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)

    5 /app/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php(634): Magento\Framework\DB\Adapter\Pdo\Mysql->_query('INSERT INTO `ca...', Array)

    6 /app/vendor/magento/zend-db/library/Zend/Db/Adapter/Abstract.php(576): Magento\Framework\DB\Adapter\Pdo\Mysql->query('INSERT INTO `ca...', Array)

    7 /app/vendor/meta/module-catalog/Model/Category/CategoryUtility/CategoryUtilities.php(392): Zend_Db_Adapter_Abstract->insert('catalog_categor...', Array)

    8 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(589): Meta\Catalog\Model\Category\CategoryUtility\CategoryUtilities->saveFBProductSetID(Object(Magento\Catalog\Model\Category\Interceptor), '834988341172137...', 43)

    9 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(515): Meta\Catalog\Model\Category\CategoryCollection->processCategoryBatchResponse(Array, Array, 43, 1, 'daily_categorie...', 'magento_66e90ce...')

    10 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(372): Meta\Catalog\Model\Category\CategoryCollection->flushCategoryBatchRequest(Array, Array, 1, 'EAACxonUmtyIBO9...', 43, 'daily_categorie...', 'magento_66e90ce...')

    11 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(222): Meta\Catalog\Model\Category\CategoryCollection->pushCategoriesToFBCollections(Object(Magento\Catalog\Model\ResourceModel\Category\Collection\Interceptor), 'EAACxonUmtyIBO9...', 43, 'daily_categorie...', 'magento_66e90ce...')

    12 /app/vendor/meta/module-catalog/Cron/CategorySyncCron.php(75): Meta\Catalog\Model\Category\CategoryCollection->pushAllCategoriesToFbCollections(43, 'daily_categorie...', 'magento_66e90ce...')

    13 [internal function]: Meta\Catalog\Cron\CategorySyncCron->execute(Object(Magento\Cron\Model\Schedule))

    14 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(362): call_user_func_array(Array, Array)

    15 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(873): Magento\Cron\Observer\ProcessCronQueueObserver->_runJob(1726549200, 1726549226, Array, Object(Magento\Cron\Model\Schedule), 'facebook_automa...')

    16 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(834): Magento\Cron\Observer\ProcessCronQueueObserver->tryRunJob(1726549200, 1726549226, Array, Object(Magento\Cron\Model\Schedule), 'facebook_automa...')

    17 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(280): Magento\Cron\Observer\ProcessCronQueueObserver->processPendingJobs('facebook_automa...', Array, 1726549226)

    18 /app/vendor/magento/framework/Event/Invoker/InvokerDefault.php(88): Magento\Cron\Observer\ProcessCronQueueObserver->execute(Object(Magento\Framework\Event\Observer))

    19 /app/vendor/magento/framework/Event/Invoker/InvokerDefault.php(74): Magento\Framework\Event\Invoker\InvokerDefault->_callObserverMethod(Object(Magento\Cron\Observer\ProcessCronQueueObserver), Object(Magento\Framework\Event\Observer))

    20 /app/vendor/magento/module-staging/Model/Event/Manager.php(97): Magento\Framework\Event\Invoker\InvokerDefault->dispatch(Array, Object(Magento\Framework\Event\Observer))

    21 /app/generated/code/Magento/Staging/Model/Event/Manager/Proxy.php(95): Magento\Staging\Model\Event\Manager->dispatch('default', Array)

    22 /app/vendor/magento/framework/App/Cron.php(86): Magento\Staging\Model\Event\Manager\Proxy->dispatch('default')

    23 /app/vendor/magento/module-cron/Console/Command/CronCommand.php(126): Magento\Framework\App\Cron->launch()

    24 /app/vendor/symfony/console/Command/Command.php(298): Magento\Cron\Console\Command\CronCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    25 /app/vendor/magento/framework/Interception/Interceptor.php(58): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    26 /app/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Cron\Console\Command\CronCommand\Interceptor->___callParent('run', Array)

    27 /app/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Cron\Console\Command\CronCommand\Interceptor->Magento\Framework\Interception{closure}(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    28 /app/generated/code/Magento/Cron/Console/Command/CronCommand/Interceptor.php(23): Magento\Cron\Console\Command\CronCommand\Interceptor->___callPlugins('run', Array, Array)

    29 /app/vendor/symfony/console/Application.php(1040): Magento\Cron\Console\Command\CronCommand\Interceptor->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    30 /app/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand(Object(Magento\Cron\Console\Command\CronCommand\Interceptor), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    31 /app/vendor/magento/framework/Console/Cli.php(116): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    32 /app/vendor/symfony/console/Application.php(171): Magento\Framework\Console\Cli->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    33 /app/bin/magento(23): Symfony\Component\Console\Application->run()

    34 {main} [] []

    [2024-09-17T05:00:31.723101+00:00] FBE.INFO: saving product set id for category Cuotas 18-24 ,id 505 ,storeId 43 and setId 8425590937529936 [] [] [2024-09-17T05:00:31.723732+00:00] FBE.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'entity_id' in 'field list', query was: INSERT INTO catalog_category_entity_varchar (attribute_id, store_id, entity_id, value) VALUES (?, ?, ?, ?) [] [] [2024-09-17T05:00:31.723811+00:00] FBE.ERROR: #0 /app/vendor/magento/framework/DB/Statement/Pdo/Mysql.php(91): Magento\Framework\DB\Statement\Pdo\Mysql->tryExecute(Object(Closure))

    1 /app/vendor/magento/zend-db/library/Zend/Db/Statement.php(313): Magento\Framework\DB\Statement\Pdo\Mysql->_execute(Array)

    2 /app/vendor/magento/zend-db/library/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)

    3 /app/vendor/magento/zend-db/library/Zend/Db/Adapter/Pdo/Abstract.php(242): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)

    4 /app/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php(564): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)

    5 /app/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php(634): Magento\Framework\DB\Adapter\Pdo\Mysql->_query('INSERT INTO `ca...', Array)

    6 /app/vendor/magento/zend-db/library/Zend/Db/Adapter/Abstract.php(576): Magento\Framework\DB\Adapter\Pdo\Mysql->query('INSERT INTO `ca...', Array)

    7 /app/vendor/meta/module-catalog/Model/Category/CategoryUtility/CategoryUtilities.php(392): Zend_Db_Adapter_Abstract->insert('catalog_categor...', Array)

    8 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(589): Meta\Catalog\Model\Category\CategoryUtility\CategoryUtilities->saveFBProductSetID(Object(Magento\Catalog\Model\Category\Interceptor), '842559093752993...', 43)

    9 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(515): Meta\Catalog\Model\Category\CategoryCollection->processCategoryBatchResponse(Array, Array, 43, 1, 'daily_categorie...', 'magento_66e90ce...')

    10 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(372): Meta\Catalog\Model\Category\CategoryCollection->flushCategoryBatchRequest(Array, Array, 1, 'EAACxonUmtyIBO9...', 43, 'daily_categorie...', 'magento_66e90ce...')

    11 /app/vendor/meta/module-catalog/Model/Category/CategoryCollection.php(222): Meta\Catalog\Model\Category\CategoryCollection->pushCategoriesToFBCollections(Object(Magento\Catalog\Model\ResourceModel\Category\Collection\Interceptor), 'EAACxonUmtyIBO9...', 43, 'daily_categorie...', 'magento_66e90ce...')

    12 /app/vendor/meta/module-catalog/Cron/CategorySyncCron.php(75): Meta\Catalog\Model\Category\CategoryCollection->pushAllCategoriesToFbCollections(43, 'daily_categorie...', 'magento_66e90ce...')

    13 [internal function]: Meta\Catalog\Cron\CategorySyncCron->execute(Object(Magento\Cron\Model\Schedule))

    14 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(362): call_user_func_array(Array, Array)

    15 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(873): Magento\Cron\Observer\ProcessCronQueueObserver->_runJob(1726549200, 1726549226, Array, Object(Magento\Cron\Model\Schedule), 'facebook_automa...')

    16 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(834): Magento\Cron\Observer\ProcessCronQueueObserver->tryRunJob(1726549200, 1726549226, Array, Object(Magento\Cron\Model\Schedule), 'facebook_automa...')

    17 /app/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php(280): Magento\Cron\Observer\ProcessCronQueueObserver->processPendingJobs('facebook_automa...', Array, 1726549226)

    18 /app/vendor/magento/framework/Event/Invoker/InvokerDefault.php(88): Magento\Cron\Observer\ProcessCronQueueObserver->execute(Object(Magento\Framework\Event\Observer))

    19 /app/vendor/magento/framework/Event/Invoker/InvokerDefault.php(74): Magento\Framework\Event\Invoker\InvokerDefault->_callObserverMethod(Object(Magento\Cron\Observer\ProcessCronQueueObserver), Object(Magento\Framework\Event\Observer))

    20 /app/vendor/magento/module-staging/Model/Event/Manager.php(97): Magento\Framework\Event\Invoker\InvokerDefault->dispatch(Array, Object(Magento\Framework\Event\Observer))

    21 /app/generated/code/Magento/Staging/Model/Event/Manager/Proxy.php(95): Magento\Staging\Model\Event\Manager->dispatch('default', Array)

    22 /app/vendor/magento/framework/App/Cron.php(86): Magento\Staging\Model\Event\Manager\Proxy->dispatch('default')

    23 /app/vendor/magento/module-cron/Console/Command/CronCommand.php(126): Magento\Framework\App\Cron->launch()

    24 /app/vendor/symfony/console/Command/Command.php(298): Magento\Cron\Console\Command\CronCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    25 /app/vendor/magento/framework/Interception/Interceptor.php(58): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    26 /app/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Cron\Console\Command\CronCommand\Interceptor->___callParent('run', Array)

    27 /app/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Cron\Console\Command\CronCommand\Interceptor->Magento\Framework\Interception{closure}(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    28 /app/generated/code/Magento/Cron/Console/Command/CronCommand/Interceptor.php(23): Magento\Cron\Console\Command\CronCommand\Interceptor->___callPlugins('run', Array, Array)

    29 /app/vendor/symfony/console/Application.php(1040): Magento\Cron\Console\Command\CronCommand\Interceptor->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    30 /app/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand(Object(Magento\Cron\Console\Command\CronCommand\Interceptor), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    31 /app/vendor/magento/framework/Console/Cli.php(116): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    32 /app/vendor/symfony/console/Application.php(171): Magento\Framework\Console\Cli->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

    33 /app/bin/magento(23): Symfony\Component\Console\Application->run()

    34 {main} [] []`

I have managed to understand a little of the instructions that are declared where the error is being marked, and the code seems to be incompatible with the table structure for Adobe Commerce Cloud or the Enterprise version, since this version has a column with a different name that replaces "entity_id" with "row_id" due to the Content Staging of the Enterprise version. Can I request to review this problem? It is still not clear to me how much of an impact there is by not being able to execute these instructions on Magento. Screenshot_20240918_114516 Screenshot_20240918_114745

oleksii-lisovyi commented 1 month ago

@bonllavier here's a patch of a possible solution:

diff --git a/Model/Category/CategoryUtility/CategoryUtilities.php b/Model/Category/CategoryUtility/CategoryUtilities.php
index 9fd8c9147..741f18418 100644
--- a/Model/Category/CategoryUtility/CategoryUtilities.php
+++ b/Model/Category/CategoryUtility/CategoryUtilities.php
@@ -27,6 +27,7 @@ use Magento\Catalog\Model\ResourceModel\Category\Collection;
 use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory;
 use Magento\Catalog\Model\ResourceModel\Product\Collection as ProductCollection;
 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Eav\Model\Config as EavConfig;
 use Magento\Framework\App\ResourceConnection;
@@ -93,6 +94,11 @@ class CategoryUtilities
      */
     private ResourceConnection $resourceConnection;

+    /**
+     * @var MetadataPool
+     */
+    private MetadataPool $metadataPool;
+
     /**
      * Constructor
      * @param ProductCollectionFactory $productCollectionFactory
@@ -104,6 +110,7 @@ class CategoryUtilities
      * @param CategoryImageService $imageService
      * @param EavConfig $eavConfig
      * @param ResourceConnection $resourceConnection
+     * @param MetadataPool $metadataPool
      */
     public function __construct(
         ProductCollectionFactory    $productCollectionFactory,
@@ -114,7 +121,8 @@ class CategoryUtilities
         ProductIdentifier           $productIdentifier,
         CategoryImageService        $imageService,
         EavConfig                   $eavConfig,
-        ResourceConnection          $resourceConnection
+        ResourceConnection          $resourceConnection,
+        MetadataPool                $metadataPool
     ) {
         $this->categoryCollection = $categoryCollection;
         $this->categoryRepository = $categoryRepository;
@@ -125,6 +133,7 @@ class CategoryUtilities
         $this->imageService = $imageService;
         $this->eavConfig = $eavConfig;
         $this->resourceConnection = $resourceConnection;
+        $this->metadataPool = $metadataPool;
     }
     /**
      * Fetch products for product category
@@ -377,6 +386,7 @@ class CategoryUtilities
                 SystemConfig::META_PRODUCT_SET_ID
             );
             $productSetAttributeId = $productSetAttribute->getAttributeId();
+            $categoryEntityLinkField = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\CategoryInterface::class)->getLinkField();

             if ($productSetAttributeId) {
                 $categoryEntityVarcharTable = $this->resourceConnection->getTableName(
@@ -388,7 +398,7 @@ class CategoryUtilities
                         [
                             'attribute_id' => $productSetAttributeId,
                             'store_id' => $storeId,
-                            'entity_id' => $category->getId(),
+                            $categoryEntityLinkField => $category->getId(),
                             'value' => $setId
                         ]
                     );
@@ -398,13 +408,13 @@ class CategoryUtilities
                         [
                             'attribute_id' => $productSetAttributeId,
                             'store_id' => $storeId,
-                            'entity_id' => $category->getId(),
+                            $categoryEntityLinkField => $category->getId(),
                             'value' => $setId
                         ],
                         [
                             'attribute_id = ?' => $productSetAttributeId,
                             'store_id = ?' => $storeId,
-                            'entity_id = ?' => $category->getId(),
+                            \sprintf('%s = ?', $categoryEntityLinkField) => $category->getId(),
                         ]
                     );
                 }

:bangbang: Please test the patch before attempting to install it on production environment. There is used a best practice for handling Adobe Commerce Staging Content extension which makes this extension not compatible, you should be able to find in other extensions in Magento/Adobe Commerce or other 3rd party extensions. I highly recommend looking for other usage of \Magento\Framework\EntityManager\EntityMetadataInterface::getLinkField function and its implementation to get a better understanding what the use case is.

[UPDATE] I've tested the patch myself, so for me the solution is working.