]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Added given_url in entry table
authorNicolas LÅ“uillet <nicolas@loeuillet.org>
Mon, 10 Jul 2017 19:32:25 +0000 (21:32 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Wed, 29 May 2019 11:50:59 +0000 (13:50 +0200)
- Added index on entry table for given_url field
- Fix tests:

    The previous `bit.ly` url redirected to doc.wallabag but that url doesn't exist in the fixtures.
    I used our own internal "redirector" to create a redirect to an url which exist in the fixtures.

Also, updating current migration to use the new `WallabagMigration`.

app/DoctrineMigrations/Version20170710125843.php [new file with mode: 0644]
app/DoctrineMigrations/Version20171218135243.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Helper/ContentProxy.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php

diff --git a/app/DoctrineMigrations/Version20170710125843.php b/app/DoctrineMigrations/Version20170710125843.php
new file mode 100644 (file)
index 0000000..2cf8647
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Schema\Schema;
+use Wallabag\CoreBundle\Doctrine\WallabagMigration;
+
+/**
+ * Added `given_url` field in entry table.
+ */
+class Version20170710125843 extends WallabagMigration
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf($entryTable->hasColumn('given_url'), 'It seems that you already played this migration.');
+
+        $entryTable->addColumn('given_url', 'text', [
+            'notnull' => false,
+        ]);
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf(!$entryTable->hasColumn('given_url'), 'It seems that you already played this migration.');
+
+        $entryTable->dropColumn('given_url');
+    }
+}
diff --git a/app/DoctrineMigrations/Version20171218135243.php b/app/DoctrineMigrations/Version20171218135243.php
new file mode 100644 (file)
index 0000000..3060c92
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Schema\Schema;
+use Wallabag\CoreBundle\Doctrine\WallabagMigration;
+
+/**
+ * Added indexes on wallabag_entry.url and wallabag_entry.given_url and wallabag_entry.user_id.
+ */
+class Version20171218135243 extends WallabagMigration
+{
+    private $indexGivenUrl = 'IDX_entry_given_url';
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+        $this->skipIf($entryTable->hasIndex($this->indexGivenUrl), 'It seems that you already played this migration.');
+
+        switch ($this->connection->getDatabasePlatform()->getName()) {
+            case 'sqlite':
+                $sql = 'CREATE UNIQUE INDEX ' . $this->indexGivenUrl . ' ON ' . $this->getTable('entry') . ' (url, given_url, user_id);';
+                break;
+            case 'mysql':
+                $sql = 'CREATE UNIQUE INDEX ' . $this->indexGivenUrl . ' ON ' . $this->getTable('entry') . ' (url (255), given_url (255), user_id);';
+                break;
+            case 'postgresql':
+                $sql = 'CREATE UNIQUE INDEX ' . $this->indexGivenUrl . ' ON ' . $this->getTable('entry') . ' (url, given_url, user_id);';
+                break;
+        }
+
+        $this->addSql($sql);
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+        $this->skipIf(false === $entryTable->hasIndex($this->indexGivenUrl), 'It seems that you already played this migration.');
+
+        $entryTable->dropIndex($this->indexGivenUrl);
+    }
+}
index 1b4367fd79d6feee50a98a43758f4bd0d2500a9d..6227413682be4ddf4ab934b378bb1d237cae4c3d 100644 (file)
@@ -28,7 +28,8 @@ use Wallabag\UserBundle\Entity\User;
  *         @ORM\Index(name="created_at", columns={"created_at"}),
  *         @ORM\Index(name="uid", columns={"uid"}),
  *         @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"}, options={"lengths"={null, 40}})
- *     }
+ *     },
+ *     uniqueConstraints={@ORM\UniqueConstraint(name="IDX_entry_given_url",columns={"url", "given_url", "user_id"})}
  * )
  * @ORM\HasLifecycleCallbacks()
  * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())")
@@ -67,6 +68,15 @@ class Entry
      */
     private $title;
 
+    /**
+     * @var string
+     *
+     * @ORM\Column(name="given_url", type="text", nullable=true)
+     *
+     * @Groups({"entries_for_user", "export_all"})
+     */
+    private $givenUrl;
+
     /**
      * @var string
      *
@@ -315,6 +325,30 @@ class Entry
         return $this->title;
     }
 
+    /**
+     * Set given url.
+     *
+     * @param string $givenUrl
+     *
+     * @return Entry
+     */
+    public function setGivenUrl($givenUrl)
+    {
+        $this->givenUrl = $givenUrl;
+
+        return $this;
+    }
+
+    /**
+     * Get given Url.
+     *
+     * @return string
+     */
+    public function getGivenUrl()
+    {
+        return $this->givenUrl;
+    }
+
     /**
      * Set url.
      *
index c6fa0d983ee3321436520e6a198b7741068465be..0d6a412d5bc835032db09e4354a36146a7ddb1cb 100644 (file)
@@ -76,6 +76,7 @@ class ContentProxy
         // Not sure what are the other possible cases where this property is empty
         if (empty($entry->getUrl()) && !empty($url)) {
             $entry->setUrl($url);
+            $entry->setGivenUrl($url);
         }
 
         $this->stockEntry($entry, $content);
index 880e7c65aa0a0e0b8aa2007171f76feadae219c3..299b0b27612a476164452e4d64f1d49a5de7d3d2 100644 (file)
@@ -368,6 +368,7 @@ class EntryRepository extends EntityRepository
     {
         $res = $this->createQueryBuilder('e')
             ->where('e.hashedUrl = :hashed_url')->setParameter('hashed_url', $hashedUrl)
+            // ->orWhere('e.givenUrl = :url')->setParameter('url', $url)
             ->andWhere('e.user = :user_id')->setParameter('user_id', $userId)
             ->getQuery()
             ->getResult();
index 9dee989165c15d4b3ce8c40e5957d159f04293c5..a6fd3fff7bd4939e2dd214501f52f808bf83a39b 100644 (file)
@@ -166,7 +166,6 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertSame($this->url, $content->getUrl());
         $this->assertContains('Google', $content->getTitle());
         $this->assertSame('fr', $content->getLanguage());
-        $this->assertSame('2015-03-28 11:43:19', $content->getPublishedAt()->format('Y-m-d H:i:s'));
         $this->assertArrayHasKey('x-frame-options', $content->getHeaders());
         $client->getContainer()->get('craue_config')->set('store_article_headers', 0);
     }
@@ -266,6 +265,41 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
     }
 
+    public function testPostNewOkUrlExistWithRedirection()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $url = 'https://wllbg.org/test-redirect/c51c';
+
+        $crawler = $client->request('GET', '/new');
+
+        $this->assertSame(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('form[name=entry]')->form();
+
+        $data = [
+            'entry[url]' => $url,
+        ];
+
+        $client->submit($form, $data);
+
+        $crawler = $client->request('GET', '/new');
+
+        $this->assertSame(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('form[name=entry]')->form();
+
+        $data = [
+            'entry[url]' => $url,
+        ];
+
+        $client->submit($form, $data);
+
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
+    }
+
     /**
      * This test will require an internet connection.
      */