]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/ImportBundle/Import/AbstractImport.php
Change documentation links to HTTPS
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Import / AbstractImport.php
index 8610062d57fc55c413b756671a98735de0b03660..764b390a830428fbdc60ddf6a793d8d632fb75b0 100644 (file)
@@ -7,8 +7,9 @@ use Psr\Log\NullLogger;
 use Doctrine\ORM\EntityManager;
 use Wallabag\CoreBundle\Helper\ContentProxy;
 use Wallabag\CoreBundle\Entity\Entry;
+use Wallabag\CoreBundle\Entity\Tag;
 use Wallabag\UserBundle\Entity\User;
-use OldSound\RabbitMqBundle\RabbitMq\Producer;
+use OldSound\RabbitMqBundle\RabbitMq\ProducerInterface;
 
 abstract class AbstractImport implements ImportInterface
 {
@@ -20,6 +21,7 @@ abstract class AbstractImport implements ImportInterface
     protected $markAsRead;
     protected $skippedEntries = 0;
     protected $importedEntries = 0;
+    protected $queuedEntries = 0;
 
     public function __construct(EntityManager $em, ContentProxy $contentProxy)
     {
@@ -34,12 +36,12 @@ abstract class AbstractImport implements ImportInterface
     }
 
     /**
-     * Set RabbitMQ Producer to send each entry to a queue.
+     * Set RabbitMQ/Redis Producer to send each entry to a queue.
      * This method should be called when user has enabled RabbitMQ.
      *
-     * @param Producer $producer
+     * @param ProducerInterface $producer
      */
-    public function setRabbitmqProducer(Producer $producer)
+    public function setProducer(ProducerInterface $producer)
     {
         $this->producer = $producer;
     }
@@ -77,20 +79,20 @@ abstract class AbstractImport implements ImportInterface
 
     /**
      * Fetch content from the ContentProxy (using graby).
-     * If it fails return false instead of the updated entry.
+     * If it fails return the given entry to be saved in all case (to avoid user to loose the content).
      *
      * @param Entry  $entry   Entry to update
      * @param string $url     Url to grab content for
      * @param array  $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
      *
-     * @return Entry|false
+     * @return Entry
      */
     protected function fetchContent(Entry $entry, $url, array $content = [])
     {
         try {
             return $this->contentProxy->updateEntry($entry, $url, $content);
         } catch (\Exception $e) {
-            return false;
+            return $entry;
         }
     }
 
@@ -104,6 +106,10 @@ abstract class AbstractImport implements ImportInterface
         $i = 1;
 
         foreach ($entries as $importedEntry) {
+            if ($this->markAsRead) {
+                $importedEntry = $this->setEntryAsRead($importedEntry);
+            }
+
             $entry = $this->parseEntry($importedEntry);
 
             if (null === $entry) {
@@ -113,7 +119,10 @@ abstract class AbstractImport implements ImportInterface
             // flush every 20 entries
             if (($i % 20) === 0) {
                 $this->em->flush();
-                $this->em->clear($entry);
+
+                // clear only affected entities
+                $this->em->clear(Entry::class);
+                $this->em->clear(Tag::class);
             }
             ++$i;
         }
@@ -141,12 +150,24 @@ abstract class AbstractImport implements ImportInterface
                 $importedEntry = $this->setEntryAsRead($importedEntry);
             }
 
-            ++$this->importedEntries;
+            ++$this->queuedEntries;
 
             $this->producer->publish(json_encode($importedEntry));
         }
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function getSummary()
+    {
+        return [
+            'skipped' => $this->skippedEntries,
+            'imported' => $this->importedEntries,
+            'queued' => $this->queuedEntries,
+        ];
+    }
+
     /**
      * Parse one entry.
      *