]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/ImportBundle/Import/BrowserImport.php
Add a real configuration for CS-Fixer
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Import / BrowserImport.php
index da69df9b26cab91dfa37de1f57289790e32d0e83..f11958247e4f3ac8622add715c59ab1e1c583eab 100644 (file)
@@ -3,8 +3,8 @@
 namespace Wallabag\ImportBundle\Import;
 
 use Wallabag\CoreBundle\Entity\Entry;
+use Wallabag\CoreBundle\Event\EntrySavedEvent;
 use Wallabag\UserBundle\Entity\User;
-use Wallabag\CoreBundle\Helper\ContentProxy;
 
 abstract class BrowserImport extends AbstractImport
 {
@@ -45,6 +45,8 @@ abstract class BrowserImport extends AbstractImport
         $data = json_decode(file_get_contents($this->filepath), true);
 
         if (empty($data)) {
+            $this->logger->error('Wallabag Browser: no entries in imported file');
+
             return false;
         }
 
@@ -72,91 +74,43 @@ abstract class BrowserImport extends AbstractImport
     }
 
     /**
-     * Parse and insert all given entries.
-     *
-     * @param $entries
+     * {@inheritdoc}
      */
-    protected function parseEntries($entries)
+    public function parseEntry(array $importedEntry)
     {
-        $i = 1;
+        if ((!array_key_exists('guid', $importedEntry) || (!array_key_exists('id', $importedEntry))) && is_array(reset($importedEntry))) {
+            if ($this->producer) {
+                $this->parseEntriesForProducer($importedEntry);
 
-        foreach ($entries as $importedEntry) {
-            if ((array) $importedEntry !== $importedEntry) {
-                continue;
+                return;
             }
 
-            $entry = $this->parseEntry($importedEntry);
-
-            if (null === $entry) {
-                continue;
-            }
+            $this->parseEntries($importedEntry);
 
-            // flush every 20 entries
-            if (($i % 20) === 0) {
-                $this->em->flush();
-            }
-            ++$i;
+            return;
         }
 
-        $this->em->flush();
-    }
-
-    /**
-     * 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 (array_key_exists('children', $importedEntry)) {
+            if ($this->producer) {
+                $this->parseEntriesForProducer($importedEntry['children']);
 
-            if ($this->markAsRead) {
-                $importedEntry = $this->setEntryAsRead($importedEntry);
+                return;
             }
 
-            ++$this->queuedEntries;
-
-            $this->producer->publish(json_encode($importedEntry));
-        }
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function parseEntry(array $importedEntry)
-    {
-        if ((!key_exists('guid', $importedEntry) || (!key_exists('id', $importedEntry))) && is_array(reset($importedEntry))) {
-            $this->parseEntries($importedEntry);
-
-            return;
-        }
-
-        if (key_exists('children', $importedEntry)) {
             $this->parseEntries($importedEntry['children']);
 
             return;
         }
 
-        if (!key_exists('uri', $importedEntry) && !key_exists('url', $importedEntry)) {
+        if (!array_key_exists('uri', $importedEntry) && !array_key_exists('url', $importedEntry)) {
             return;
         }
 
-        $firefox = key_exists('uri', $importedEntry);
+        $url = array_key_exists('uri', $importedEntry) ? $importedEntry['uri'] : $importedEntry['url'];
 
         $existingEntry = $this->em
             ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId(($firefox) ? $importedEntry['uri'] : $importedEntry['url'], $this->user->getId());
+            ->findByUrlAndUserId($url, $this->user->getId());
 
         if (false !== $existingEntry) {
             ++$this->skippedEntries;
@@ -171,10 +125,10 @@ abstract class BrowserImport extends AbstractImport
         $entry->setTitle($data['title']);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $data['url'], $data);
+        $this->fetchContent($entry, $data['url'], $data);
 
         if (array_key_exists('tags', $data)) {
-            $this->contentProxy->assignTagsToEntry(
+            $this->tagsAssigner->assignTagsToEntry(
                 $entry,
                 $data['tags']
             );
@@ -184,7 +138,7 @@ abstract class BrowserImport extends AbstractImport
 
         if (!empty($data['created_at'])) {
             $dt = new \DateTime();
-            $entry->setCreatedAt($dt->setTimestamp($data['created_at'] / 1000));
+            $entry->setCreatedAt($dt->setTimestamp($data['created_at']));
         }
 
         $this->em->persist($entry);
@@ -194,26 +148,79 @@ abstract class BrowserImport extends AbstractImport
     }
 
     /**
-     * {@inheritdoc}
+     * Parse and insert all given entries.
+     *
+     * @param $entries
      */
-    protected function prepareEntry($entry = [])
+    protected function parseEntries($entries)
     {
-        $data = [
-            'title' => $entry['name'],
-            'html' => '',
-            'url' => $entry['url'],
-            'is_archived' => $this->markAsRead,
-            'tags' => '',
-            // date are in format like "13118829474385693"
-            // and it'll be devided by 1000 in AbstractImport
-            'created_at' => (int) ceil($entry['date_added'] / 10000),
-        ];
-
-        if (array_key_exists('tags', $entry) && $entry['tags'] != '') {
-            $data['tags'] = $entry['tags'];
+        $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;
         }
 
-        return $data;
+        $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));
+        }
     }
 
     /**