]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
fix #1502 avoid duplicate entry and store pocket url in config
authorNicolas LÅ“uillet <nicolas.loeuillet@smile.fr>
Mon, 26 Oct 2015 13:38:24 +0000 (14:38 +0100)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Sat, 2 Jan 2016 22:24:17 +0000 (23:24 +0100)
app/config/config.yml
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/ImportBundle/DependencyInjection/Configuration.php
src/Wallabag/ImportBundle/DependencyInjection/WallabagImportExtension.php
src/Wallabag/ImportBundle/Import/PocketImport.php
src/Wallabag/ImportBundle/Resources/config/services.yml
src/Wallabag/UserBundle/Entity/User.php

index 421b2db5a527c213c3fd8343350a26768516269d..88b1a59fc910b9c30e4addc40bc17b21f77895b3 100644 (file)
@@ -33,6 +33,14 @@ wallabag_core:
     import:
         allow_mimetypes: ['application/octet-stream', 'application/json', 'text/plain']
 
+wallabag_import:
+    importers:
+        pocket_urls:
+            oauth_request: https://getpocket.com/v3/oauth/request
+            auth_authorize: https://getpocket.com/auth/authorize
+            oauth_authorize: https://getpocket.com/v3/oauth/authorize
+            get: https://getpocket.com/v3/get
+
 # Twig Configuration
 twig:
     debug:            "%kernel.debug%"
index fa58013312a74169207f4795c2e8c4dd253f474f..de2eedcb75f715bcd0d5e32b2d28799ac412ecda 100644 (file)
@@ -41,6 +41,7 @@ class EntryController extends Controller
      */
     public function addEntryFormAction(Request $request)
     {
+        $em = $this->getDoctrine()->getManager();
         $entry = new Entry($this->getUser());
 
         $form = $this->createForm(new NewEntryType(), $entry);
@@ -48,6 +49,19 @@ class EntryController extends Controller
         $form->handleRequest($request);
 
         if ($form->isValid()) {
+            $existingEntry = $em
+                ->getRepository('WallabagCoreBundle:Entry')
+                ->findOneByUrl($entry->getUrl());
+
+            if (!is_null($existingEntry)) {
+                $this->get('session')->getFlashBag()->add(
+                    'notice',
+                    'Entry already saved on '.$existingEntry->getCreatedAt()->format('d-m-Y')
+                );
+
+                return $this->redirect($this->generateUrl('view', array('id' => $existingEntry->getId())));
+            }
+
             $this->updateEntry($entry);
             $this->get('session')->getFlashBag()->add(
                 'notice',
index bacaff31c9d05e5b98a30e17caf061d21a09dfe4..3c14104e1c8e4671f74f8ca80f1f7f194308beca 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Wallabag\ImportBundle\DependencyInjection;
 
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
 use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 use Symfony\Component\Config\Definition\ConfigurationInterface;
 
@@ -12,6 +13,22 @@ class Configuration implements ConfigurationInterface
         $treeBuilder = new TreeBuilder();
         $rootNode = $treeBuilder->root('wallabag_import');
 
+        $rootNode
+            ->children()
+                ->arrayNode('importers')
+                    ->append($this->getURLs())
+                ->end()
+            ->end()
+        ;
+
         return $treeBuilder;
     }
+
+    private function getURLs()
+    {
+        $node = new ArrayNodeDefinition('pocket_urls');
+        $node->prototype('scalar')->end();
+
+        return $node;
+    }
 }
index 4efcaace929d5dce0ddbf774ff1cccf32726ed35..07dc378dba0568b1c28d195402e438ace6e47495 100644 (file)
@@ -13,6 +13,7 @@ class WallabagImportExtension extends Extension
     {
         $configuration = new Configuration();
         $config = $this->processConfiguration($configuration, $configs);
+        $container->setParameter('wallabag_import.pocket', $config['importers']['pocket_urls']);
 
         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('services.yml');
index 6b93c180d03182afdb7636513a3f5f915e4a3790..51f73f4ca5739f9b045f2ec8d4535e86746ae946 100644 (file)
@@ -15,13 +15,19 @@ class PocketImport implements ImportInterface
     private $session;
     private $em;
     private $consumerKey;
+    private $skippedEntries;
+    private $importedEntries;
+    private $pocketURL;
 
-    public function __construct($tokenStorage, Session $session, EntityManager $em, $consumerKey)
+    public function __construct($tokenStorage, Session $session, EntityManager $em, $consumerKey, $pocketURL)
     {
         $this->user = $tokenStorage->getToken()->getUser();
         $this->session = $session;
         $this->em = $em;
         $this->consumerKey = $consumerKey;
+        $this->skippedEntries = 0;
+        $this->importedEntries = 0;
+        $this->pocketURL = $pocketURL;
     }
 
     public function getName()
@@ -64,9 +70,25 @@ class PocketImport implements ImportInterface
             return $pocketEntry['resolved_title'];
         } elseif (isset($pocketEntry['given_title']) && $pocketEntry['given_title'] != '') {
             return $pocketEntry['given_title'];
-        } else {
-            return 'Untitled';
         }
+
+        return 'Untitled';
+    }
+
+    /**
+     * Returns the good URL for current entry.
+     *
+     * @param $pocketEntry
+     *
+     * @return string
+     */
+    private function guessURL($pocketEntry)
+    {
+        if (isset($pocketEntry['resolved_url']) && $pocketEntry['resolved_url'] != '') {
+            return $pocketEntry['resolved_url'];
+        }
+
+        return $pocketEntry['given_url'];
     }
 
     private function assignTagsToEntry(Entry $entry, $tags)
@@ -95,7 +117,20 @@ class PocketImport implements ImportInterface
     {
         foreach ($entries as $pocketEntry) {
             $entry = new Entry($this->user);
-            $entry->setUrl($pocketEntry['given_url']);
+            $url = $this->guessURL($pocketEntry);
+
+            $existingEntry = $this->em
+                ->getRepository('WallabagCoreBundle:Entry')
+                ->findOneByUrl($url);
+
+            if (!is_null($existingEntry)) {
+                ++$this->skippedEntries;
+                continue;
+            }
+
+            $entry->setUrl($url);
+            $entry->setDomainName(parse_url($url, PHP_URL_HOST));
+
             if ($pocketEntry['status'] == 1) {
                 $entry->setArchived(true);
             }
@@ -118,20 +153,20 @@ class PocketImport implements ImportInterface
             }
 
             if (!empty($pocketEntry['tags'])) {
-                $this->assignTagsToEntry($entry, $pocketEntry['tags']);
+                //   $this->assignTagsToEntry($entry, $pocketEntry['tags']);
             }
 
             $this->em->persist($entry);
+            ++$this->importedEntries;
         }
 
-        $this->user->setLastPocketImport(new \DateTime());
         $this->em->flush();
     }
 
     public function oAuthRequest($redirectUri, $callbackUri)
     {
         $client = $this->createClient();
-        $request = $client->createRequest('POST', 'https://getpocket.com/v3/oauth/request',
+        $request = $client->createRequest('POST', $this->pocketURL['oauth_request'],
             [
                 'body' => json_encode([
                     'consumer_key' => $this->consumerKey,
@@ -146,14 +181,14 @@ class PocketImport implements ImportInterface
         // store code in session for callback method
         $this->session->set('pocketCode', $values['code']);
 
-        return 'https://getpocket.com/auth/authorize?request_token='.$values['code'].'&redirect_uri='.$callbackUri;
+        return $this->pocketURL['auth_authorize'].'?request_token='.$values['code'].'&redirect_uri='.$callbackUri;
     }
 
     public function oAuthAuthorize()
     {
         $client = $this->createClient();
 
-        $request = $client->createRequest('POST', 'https://getpocket.com/v3/oauth/authorize',
+        $request = $client->createRequest('POST', $this->pocketURL['oauth_authorize'],
             [
                 'body' => json_encode([
                     'consumer_key' => $this->consumerKey,
@@ -170,9 +205,8 @@ class PocketImport implements ImportInterface
     public function import($accessToken)
     {
         $client = $this->createClient();
-        $since = (!is_null($this->user->getLastPocketImport()) ? $this->user->getLastPocketImport()->getTimestamp() : '');
 
-        $request = $client->createRequest('POST', 'https://getpocket.com/v3/get',
+        $request = $client->createRequest('POST', $this->pocketURL['get'],
             [
                 'body' => json_encode([
                     'consumer_key' => $this->consumerKey,
@@ -180,7 +214,6 @@ class PocketImport implements ImportInterface
                     'detailType' => 'complete',
                     'state' => 'all',
                     'sort' => 'oldest',
-                    'since' => $since,
                 ]),
             ]
         );
@@ -192,7 +225,7 @@ class PocketImport implements ImportInterface
 
         $this->session->getFlashBag()->add(
             'notice',
-            count($entries['list']).' entries imported'
+            $this->importedEntries.' entries imported, '.$this->skippedEntries.' already saved.'
         );
     }
 }
index 82628f082ca42ede9b4c5510b1f428dc5ece04d3..8f224d887e48eaa0e230ea59ac4788b3625f203d 100644 (file)
@@ -6,3 +6,4 @@ services:
             - @session
             - @doctrine.orm.entity_manager
             - %pocket_consumer_key%
+            - %wallabag_import.pocket%
index 4851999f27b4de6b54b2e37ac9f5d5f8aafbbec1..e65284203bb349c6bd3ed7bf5557fc089966f4e0 100644 (file)
@@ -84,13 +84,6 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      */
     private $trusted;
 
-    /**
-     * @var date
-     *
-     * @ORM\Column(name="last_pocket_import", type="datetime", nullable=true)
-     */
-    private $lastPocketImport;
-
     public function __construct()
     {
         parent::__construct();
@@ -247,20 +240,4 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
 
         return false;
     }
-
-    /**
-     * @return date
-     */
-    public function getLastPocketImport()
-    {
-        return $this->lastPocketImport;
-    }
-
-    /**
-     * @param date $lastPocketImport
-     */
-    public function setLastPocketImport($lastPocketImport)
-    {
-        $this->lastPocketImport = $lastPocketImport;
-    }
 }