]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/ImportBundle/Import/BrowserImport.php
Validate imported entry to avoid error on import
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Import / BrowserImport.php
index 71e65e5916f04e4216da71c46a2fd272285c2e79..4678ae0c5133cfc79e0e18f95a242cab6cea7f5e 100644 (file)
@@ -3,7 +3,6 @@
 namespace Wallabag\ImportBundle\Import;
 
 use Wallabag\CoreBundle\Entity\Entry;
-use Wallabag\UserBundle\Entity\User;
 use Wallabag\CoreBundle\Event\EntrySavedEvent;
 
 abstract class BrowserImport extends AbstractImport
@@ -73,88 +72,12 @@ abstract class BrowserImport extends AbstractImport
         return $this;
     }
 
-    /**
-     * Parse and insert all given entries.
-     *
-     * @param $entries
-     */
-    protected function parseEntries($entries)
-    {
-        $i = 1;
-        $entryToBeFlushed = [];
-
-        foreach ($entries as $importedEntry) {
-            if ((array) $importedEntry !== $importedEntry) {
-                continue;
-            }
-
-            $entry = $this->parseEntry($importedEntry);
-
-            if (null === $entry) {
-                continue;
-            }
-
-            // @see AbstractImport
-            $entryToBeFlushed[] = $entry;
-
-            // flush every 20 entries
-            if (($i % 20) === 0) {
-                $this->em->flush();
-
-                foreach ($entryToBeFlushed as $entry) {
-                    $this->eventDispatcher->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
-                }
-
-                $entryToBeFlushed = [];
-            }
-            ++$i;
-        }
-
-        $this->em->flush();
-
-        if (!empty($entryToBeFlushed)) {
-            foreach ($entryToBeFlushed as $entry) {
-                $this->eventDispatcher->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
-            }
-        }
-    }
-
-    /**
-     * Parse entries and send them to the queue.
-     * It should just be a simple loop on all item, no call to the database should be done
-     * to speedup queuing.
-     *
-     * Faster parse entries for Producer.
-     * We don't care to make check at this time. They'll be done by the consumer.
-     *
-     * @param array $entries
-     */
-    protected function parseEntriesForProducer(array $entries)
-    {
-        foreach ($entries as $importedEntry) {
-            if ((array) $importedEntry !== $importedEntry) {
-                continue;
-            }
-
-            // set userId for the producer (it won't know which user is connected)
-            $importedEntry['userId'] = $this->user->getId();
-
-            if ($this->markAsRead) {
-                $importedEntry = $this->setEntryAsRead($importedEntry);
-            }
-
-            ++$this->queuedEntries;
-
-            $this->producer->publish(json_encode($importedEntry));
-        }
-    }
-
     /**
      * {@inheritdoc}
      */
     public function parseEntry(array $importedEntry)
     {
-        if ((!array_key_exists('guid', $importedEntry) || (!array_key_exists('id', $importedEntry))) && is_array(reset($importedEntry))) {
+        if ((!array_key_exists('guid', $importedEntry) || (!array_key_exists('id', $importedEntry))) && \is_array(reset($importedEntry))) {
             if ($this->producer) {
                 $this->parseEntriesForProducer($importedEntry);
 
@@ -223,6 +146,82 @@ abstract class BrowserImport extends AbstractImport
         return $entry;
     }
 
+    /**
+     * Parse and insert all given entries.
+     *
+     * @param array $entries
+     */
+    protected function parseEntries(array $entries)
+    {
+        $i = 1;
+        $entryToBeFlushed = [];
+
+        foreach ($entries as $importedEntry) {
+            if ((array) $importedEntry !== $importedEntry) {
+                continue;
+            }
+
+            $entry = $this->parseEntry($importedEntry);
+
+            if (null === $entry) {
+                continue;
+            }
+
+            // @see AbstractImport
+            $entryToBeFlushed[] = $entry;
+
+            // flush every 20 entries
+            if (0 === ($i % 20)) {
+                $this->em->flush();
+
+                foreach ($entryToBeFlushed as $entry) {
+                    $this->eventDispatcher->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
+                }
+
+                $entryToBeFlushed = [];
+            }
+            ++$i;
+        }
+
+        $this->em->flush();
+
+        if (!empty($entryToBeFlushed)) {
+            foreach ($entryToBeFlushed as $entry) {
+                $this->eventDispatcher->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
+            }
+        }
+    }
+
+    /**
+     * Parse entries and send them to the queue.
+     * It should just be a simple loop on all item, no call to the database should be done
+     * to speedup queuing.
+     *
+     * Faster parse entries for Producer.
+     * We don't care to make check at this time. They'll be done by the consumer.
+     *
+     * @param array $entries
+     */
+    protected function parseEntriesForProducer(array $entries)
+    {
+        foreach ($entries as $importedEntry) {
+            if ((array) $importedEntry !== $importedEntry) {
+                continue;
+            }
+
+            // set userId for the producer (it won't know which user is connected)
+            $importedEntry['userId'] = $this->user->getId();
+
+            if ($this->markAsRead) {
+                $importedEntry = $this->setEntryAsRead($importedEntry);
+            }
+
+            ++$this->queuedEntries;
+
+            $this->producer->publish(json_encode($importedEntry));
+        }
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -232,4 +231,6 @@ abstract class BrowserImport extends AbstractImport
 
         return $importedEntry;
     }
+
+    abstract protected function prepareEntry(array $entry = []);
 }