]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/ImportBundle/Import/WallabagImport.php
Validate imported entry to avoid error on import
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Import / WallabagImport.php
index 581ec178f82e19ae530550568d9edf4f010ccab0..350d06001f12202f6c6678b01b5f48da19773ace 100644 (file)
@@ -3,15 +3,10 @@
 namespace Wallabag\ImportBundle\Import;
 
 use Wallabag\CoreBundle\Entity\Entry;
-use Wallabag\UserBundle\Entity\User;
 
 abstract class WallabagImport extends AbstractImport
 {
-    protected $user;
-    protected $skippedEntries = 0;
-    protected $importedEntries = 0;
     protected $filepath;
-    protected $markAsRead;
     // untitled in all languages from v1
     protected $untitled = [
         'Untitled',
@@ -28,19 +23,6 @@ abstract class WallabagImport extends AbstractImport
         '',
     ];
 
-    /**
-     * We define the user in a custom call because on the import command there is no logged in user.
-     * So we can't retrieve user from the `security.token_storage` service.
-     *
-     * @param User $user
-     */
-    public function setUser(User $user)
-    {
-        $this->user = $user;
-
-        return $this;
-    }
-
     /**
      * {@inheritdoc}
      */
@@ -76,25 +58,22 @@ abstract class WallabagImport extends AbstractImport
         $data = json_decode(file_get_contents($this->filepath), true);
 
         if (empty($data)) {
+            $this->logger->error('WallabagImport: no entries in imported file');
+
             return false;
         }
 
+        if ($this->producer) {
+            $this->parseEntriesForProducer($data);
+
+            return true;
+        }
+
         $this->parseEntries($data);
 
         return true;
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getSummary()
-    {
-        return [
-            'skipped' => $this->skippedEntries,
-            'imported' => $this->importedEntries,
-        ];
-    }
-
     /**
      * Set file path to the json file.
      *
@@ -108,85 +87,72 @@ abstract class WallabagImport extends AbstractImport
     }
 
     /**
-     * Set whether articles must be all marked as read.
-     *
-     * @param bool $markAsRead
+     * {@inheritdoc}
      */
-    public function setMarkAsRead($markAsRead)
+    public function validateEntry(array $importedEntry)
     {
-        $this->markAsRead = $markAsRead;
+        if (empty($importedEntry['url'])) {
+            return false;
+        }
 
-        return $this;
+        return true;
     }
 
     /**
-     * Parse and insert all given entries.
-     *
-     * @param $entries
+     * {@inheritdoc}
      */
-    protected function parseEntries($entries)
+    public function parseEntry(array $importedEntry)
     {
-        $i = 1;
+        $existingEntry = $this->em
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findByUrlAndUserId($importedEntry['url'], $this->user->getId());
 
-        foreach ($entries as $importedEntry) {
-            $existingEntry = $this->em
-                ->getRepository('WallabagCoreBundle:Entry')
-                ->findByUrlAndUserId($importedEntry['url'], $this->user->getId());
+        if (false !== $existingEntry) {
+            ++$this->skippedEntries;
 
-            if (false !== $existingEntry) {
-                ++$this->skippedEntries;
-                continue;
-            }
+            return;
+        }
+
+        $data = $this->prepareEntry($importedEntry);
 
-            $data = $this->prepareEntry($importedEntry, $this->markAsRead);
+        $entry = new Entry($this->user);
+        $entry->setUrl($data['url']);
+        $entry->setTitle($data['title']);
 
-            $entry = $this->fetchContent(
-                new Entry($this->user),
-                $importedEntry['url'],
-                $data
+        // update entry with content (in case fetching failed, the given entry will be return)
+        $this->fetchContent($entry, $data['url'], $data);
+
+        if (array_key_exists('tags', $data)) {
+            $this->tagsAssigner->assignTagsToEntry(
+                $entry,
+                $data['tags'],
+                $this->em->getUnitOfWork()->getScheduledEntityInsertions()
             );
+        }
 
-            // jump to next entry in case of problem while getting content
-            if (false === $entry) {
-                ++$this->skippedEntries;
-                continue;
-            }
-
-            if (array_key_exists('tags', $data)) {
-                $this->contentProxy->assignTagsToEntry(
-                    $entry,
-                    $data['tags']
-                );
-            }
-
-            if (isset($importedEntry['preview_picture'])) {
-                $entry->setPreviewPicture($importedEntry['preview_picture']);
-            }
-
-            $entry->setArchived($data['is_archived']);
-            $entry->setStarred($data['is_starred']);
-
-            $this->em->persist($entry);
-            ++$this->importedEntries;
-
-            // flush every 20 entries
-            if (($i % 20) === 0) {
-                $this->em->flush();
-            }
-            ++$i;
+        if (isset($importedEntry['preview_picture'])) {
+            $entry->setPreviewPicture($importedEntry['preview_picture']);
         }
 
-        $this->em->flush();
-        $this->em->clear();
+        $entry->setArchived($data['is_archived']);
+        $entry->setStarred($data['is_starred']);
+
+        if (!empty($data['created_at'])) {
+            $entry->setCreatedAt(new \DateTime($data['created_at']));
+        }
+
+        $this->em->persist($entry);
+        ++$this->importedEntries;
+
+        return $entry;
     }
 
     /**
      * This should return a cleaned array for a given entry to be given to `updateEntry`.
      *
-     * @param array $entry      Data from the imported file
-     * @param bool  $markAsRead Should we mark as read content?
+     * @param array $entry Data from the imported file
      *
      * @return array
      */
-    abstract protected function prepareEntry($entry = [], $markAsRead = false);
+    abstract protected function prepareEntry($entry = []);
 }