diff options
author | Nicolas LÅ“uillet <nicolas@loeuillet.org> | 2016-12-29 10:54:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-29 10:54:07 +0100 |
commit | 8527238846b0ea307ba68ca8a831eb0884c68d4a (patch) | |
tree | f93d54cd9fcbb85fa43c989ef670612f9a4d47e5 | |
parent | 90f6ee4dbe761f97edf0bf87ffeb1f75acec6c25 (diff) | |
parent | 7239082a5e290dada1d393f7a25acebb09ace2de (diff) | |
download | wallabag-8527238846b0ea307ba68ca8a831eb0884c68d4a.tar.gz wallabag-8527238846b0ea307ba68ca8a831eb0884c68d4a.tar.zst wallabag-8527238846b0ea307ba68ca8a831eb0884c68d4a.zip |
Merge pull request #2702 from wallabag/add-index-uuid
Added index on entry.uuid
-rwxr-xr-x | Makefile | 3 | ||||
-rw-r--r-- | app/DoctrineMigrations/Version20160410190541.php | 7 | ||||
-rw-r--r-- | app/DoctrineMigrations/Version20161214094403.php | 53 | ||||
-rw-r--r-- | src/Wallabag/CoreBundle/Controller/EntryController.php | 10 | ||||
-rw-r--r-- | src/Wallabag/CoreBundle/Entity/Entry.php | 29 | ||||
-rw-r--r-- | tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php | 12 |
6 files changed, 85 insertions, 29 deletions
@@ -27,8 +27,7 @@ build: ## Run grunt | |||
27 | @grunt | 27 | @grunt |
28 | 28 | ||
29 | test: ## Launch wallabag testsuite | 29 | test: ## Launch wallabag testsuite |
30 | @if [ ! -d "vendor/phpunit" ]; then composer install; fi | 30 | @ant prepare && bin/simple-phpunit -v |
31 | @ant prepare && vendor/phpunit/phpunit/phpunit -v | ||
32 | 31 | ||
33 | release: ## Create a package. Need a VERSION parameter (eg: `make release VERSION=master`). | 32 | release: ## Create a package. Need a VERSION parameter (eg: `make release VERSION=master`). |
34 | ifndef VERSION | 33 | ifndef VERSION |
diff --git a/app/DoctrineMigrations/Version20160410190541.php b/app/DoctrineMigrations/Version20160410190541.php index 0cdec008..f166a325 100644 --- a/app/DoctrineMigrations/Version20160410190541.php +++ b/app/DoctrineMigrations/Version20160410190541.php | |||
@@ -31,10 +31,11 @@ class Version20160410190541 extends AbstractMigration implements ContainerAwareI | |||
31 | { | 31 | { |
32 | $entryTable = $schema->getTable($this->getTable('entry')); | 32 | $entryTable = $schema->getTable($this->getTable('entry')); |
33 | 33 | ||
34 | $this->skipIf($entryTable->hasColumn('uuid'), 'It seems that you already played this migration.'); | 34 | $this->skipIf($entryTable->hasColumn('uid'), 'It seems that you already played this migration.'); |
35 | 35 | ||
36 | $entryTable->addColumn('uuid', 'guid', [ | 36 | $entryTable->addColumn('uid', 'string', [ |
37 | 'notnull' => false, | 37 | 'notnull' => false, |
38 | 'length' => 23, | ||
38 | ]); | 39 | ]); |
39 | $this->addSql('INSERT INTO '.$this->getTable('craue_config_setting')." (name, value, section) VALUES ('share_public', '1', 'entry')"); | 40 | $this->addSql('INSERT INTO '.$this->getTable('craue_config_setting')." (name, value, section) VALUES ('share_public', '1', 'entry')"); |
40 | } | 41 | } |
@@ -45,7 +46,7 @@ class Version20160410190541 extends AbstractMigration implements ContainerAwareI | |||
45 | public function down(Schema $schema) | 46 | public function down(Schema $schema) |
46 | { | 47 | { |
47 | $entryTable = $schema->getTable($this->getTable('entry')); | 48 | $entryTable = $schema->getTable($this->getTable('entry')); |
48 | $entryTable->dropColumn('uuid'); | 49 | $entryTable->dropColumn('uid'); |
49 | 50 | ||
50 | $this->addSql('DELETE FROM '.$this->getTable('craue_config_setting')." WHERE name = 'share_public'"); | 51 | $this->addSql('DELETE FROM '.$this->getTable('craue_config_setting')." WHERE name = 'share_public'"); |
51 | } | 52 | } |
diff --git a/app/DoctrineMigrations/Version20161214094403.php b/app/DoctrineMigrations/Version20161214094403.php new file mode 100644 index 00000000..5948b5fa --- /dev/null +++ b/app/DoctrineMigrations/Version20161214094403.php | |||
@@ -0,0 +1,53 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Application\Migrations; | ||
4 | |||
5 | use Doctrine\DBAL\Migrations\AbstractMigration; | ||
6 | use Doctrine\DBAL\Schema\Schema; | ||
7 | use Symfony\Component\DependencyInjection\ContainerAwareInterface; | ||
8 | use Symfony\Component\DependencyInjection\ContainerInterface; | ||
9 | |||
10 | /** | ||
11 | * Added index on wallabag_entry.uid | ||
12 | */ | ||
13 | class Version20161214094403 extends AbstractMigration implements ContainerAwareInterface | ||
14 | { | ||
15 | /** | ||
16 | * @var ContainerInterface | ||
17 | */ | ||
18 | private $container; | ||
19 | |||
20 | private $indexName = 'IDX_entry_uid'; | ||
21 | |||
22 | public function setContainer(ContainerInterface $container = null) | ||
23 | { | ||
24 | $this->container = $container; | ||
25 | } | ||
26 | |||
27 | private function getTable($tableName) | ||
28 | { | ||
29 | return $this->container->getParameter('database_table_prefix').$tableName; | ||
30 | } | ||
31 | |||
32 | /** | ||
33 | * @param Schema $schema | ||
34 | */ | ||
35 | public function up(Schema $schema) | ||
36 | { | ||
37 | $entryTable = $schema->getTable($this->getTable('entry')); | ||
38 | $this->skipIf($entryTable->hasIndex($this->indexName), 'It seems that you already played this migration.'); | ||
39 | |||
40 | $entryTable->addIndex(['uid'], $this->indexName); | ||
41 | } | ||
42 | |||
43 | /** | ||
44 | * @param Schema $schema | ||
45 | */ | ||
46 | public function down(Schema $schema) | ||
47 | { | ||
48 | $entryTable = $schema->getTable($this->getTable('entry')); | ||
49 | $this->skipIf(false === $entryTable->hasIndex($this->indexName), 'It seems that you already played this migration.'); | ||
50 | |||
51 | $entryTable->dropIndex($this->indexName); | ||
52 | } | ||
53 | } | ||
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index b03f49ed..f7398e69 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -539,8 +539,8 @@ class EntryController extends Controller | |||
539 | { | 539 | { |
540 | $this->checkUserAction($entry); | 540 | $this->checkUserAction($entry); |
541 | 541 | ||
542 | if (null === $entry->getUuid()) { | 542 | if (null === $entry->getUid()) { |
543 | $entry->generateUuid(); | 543 | $entry->generateUid(); |
544 | 544 | ||
545 | $em = $this->getDoctrine()->getManager(); | 545 | $em = $this->getDoctrine()->getManager(); |
546 | $em->persist($entry); | 546 | $em->persist($entry); |
@@ -548,7 +548,7 @@ class EntryController extends Controller | |||
548 | } | 548 | } |
549 | 549 | ||
550 | return $this->redirect($this->generateUrl('share_entry', [ | 550 | return $this->redirect($this->generateUrl('share_entry', [ |
551 | 'uuid' => $entry->getUuid(), | 551 | 'uid' => $entry->getUid(), |
552 | ])); | 552 | ])); |
553 | } | 553 | } |
554 | 554 | ||
@@ -565,7 +565,7 @@ class EntryController extends Controller | |||
565 | { | 565 | { |
566 | $this->checkUserAction($entry); | 566 | $this->checkUserAction($entry); |
567 | 567 | ||
568 | $entry->cleanUuid(); | 568 | $entry->cleanUid(); |
569 | 569 | ||
570 | $em = $this->getDoctrine()->getManager(); | 570 | $em = $this->getDoctrine()->getManager(); |
571 | $em->persist($entry); | 571 | $em->persist($entry); |
@@ -581,7 +581,7 @@ class EntryController extends Controller | |||
581 | * | 581 | * |
582 | * @param Entry $entry | 582 | * @param Entry $entry |
583 | * | 583 | * |
584 | * @Route("/share/{uuid}", requirements={"uuid" = ".+"}, name="share_entry") | 584 | * @Route("/share/{uid}", requirements={"uid" = ".+"}, name="share_entry") |
585 | * @Cache(maxage="25200", smaxage="25200", public=true) | 585 | * @Cache(maxage="25200", smaxage="25200", public=true) |
586 | * | 586 | * |
587 | * @return \Symfony\Component\HttpFoundation\Response | 587 | * @return \Symfony\Component\HttpFoundation\Response |
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 3ae5334f..7276b437 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php | |||
@@ -22,7 +22,10 @@ use Wallabag\AnnotationBundle\Entity\Annotation; | |||
22 | * @ORM\Table( | 22 | * @ORM\Table( |
23 | * name="`entry`", | 23 | * name="`entry`", |
24 | * options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"}, | 24 | * options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"}, |
25 | * indexes={@ORM\Index(name="created_at", columns={"created_at"})} | 25 | * indexes={ |
26 | * @ORM\Index(name="created_at", columns={"created_at"}), | ||
27 | * @ORM\Index(name="uid", columns={"uid"}) | ||
28 | * } | ||
26 | * ) | 29 | * ) |
27 | * @ORM\HasLifecycleCallbacks() | 30 | * @ORM\HasLifecycleCallbacks() |
28 | * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())") | 31 | * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())") |
@@ -44,11 +47,11 @@ class Entry | |||
44 | /** | 47 | /** |
45 | * @var string | 48 | * @var string |
46 | * | 49 | * |
47 | * @ORM\Column(name="uuid", type="text", nullable=true) | 50 | * @ORM\Column(name="uid", type="string", length=23, nullable=true) |
48 | * | 51 | * |
49 | * @Groups({"entries_for_user", "export_all"}) | 52 | * @Groups({"entries_for_user", "export_all"}) |
50 | */ | 53 | */ |
51 | private $uuid; | 54 | private $uid; |
52 | 55 | ||
53 | /** | 56 | /** |
54 | * @var string | 57 | * @var string |
@@ -649,34 +652,34 @@ class Entry | |||
649 | /** | 652 | /** |
650 | * @return string | 653 | * @return string |
651 | */ | 654 | */ |
652 | public function getUuid() | 655 | public function getUid() |
653 | { | 656 | { |
654 | return $this->uuid; | 657 | return $this->uid; |
655 | } | 658 | } |
656 | 659 | ||
657 | /** | 660 | /** |
658 | * @param string $uuid | 661 | * @param string $uid |
659 | * | 662 | * |
660 | * @return Entry | 663 | * @return Entry |
661 | */ | 664 | */ |
662 | public function setUuid($uuid) | 665 | public function setUid($uid) |
663 | { | 666 | { |
664 | $this->uuid = $uuid; | 667 | $this->uid = $uid; |
665 | 668 | ||
666 | return $this; | 669 | return $this; |
667 | } | 670 | } |
668 | 671 | ||
669 | public function generateUuid() | 672 | public function generateUid() |
670 | { | 673 | { |
671 | if (null === $this->uuid) { | 674 | if (null === $this->uid) { |
672 | // @see http://blog.kevingomez.fr/til/2015/07/26/why-is-uniqid-slow/ for true parameter | 675 | // @see http://blog.kevingomez.fr/til/2015/07/26/why-is-uniqid-slow/ for true parameter |
673 | $this->uuid = uniqid('', true); | 676 | $this->uid = uniqid('', true); |
674 | } | 677 | } |
675 | } | 678 | } |
676 | 679 | ||
677 | public function cleanUuid() | 680 | public function cleanUid() |
678 | { | 681 | { |
679 | $this->uuid = null; | 682 | $this->uid = null; |
680 | } | 683 | } |
681 | 684 | ||
682 | /** | 685 | /** |
diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php index c347cca5..06ed2db6 100644 --- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php | |||
@@ -810,15 +810,15 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
810 | ->getRepository('WallabagCoreBundle:Entry') | 810 | ->getRepository('WallabagCoreBundle:Entry') |
811 | ->findOneByUser($this->getLoggedInUserId()); | 811 | ->findOneByUser($this->getLoggedInUserId()); |
812 | 812 | ||
813 | // no uuid | 813 | // no uid |
814 | $client->request('GET', '/share/'.$content->getUuid()); | 814 | $client->request('GET', '/share/'.$content->getUid()); |
815 | $this->assertEquals(404, $client->getResponse()->getStatusCode()); | 815 | $this->assertEquals(404, $client->getResponse()->getStatusCode()); |
816 | 816 | ||
817 | // generating the uuid | 817 | // generating the uid |
818 | $client->request('GET', '/share/'.$content->getId()); | 818 | $client->request('GET', '/share/'.$content->getId()); |
819 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | 819 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); |
820 | 820 | ||
821 | // follow link with uuid | 821 | // follow link with uid |
822 | $crawler = $client->followRedirect(); | 822 | $crawler = $client->followRedirect(); |
823 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | 823 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); |
824 | $this->assertContains('max-age=25200', $client->getResponse()->headers->get('cache-control')); | 824 | $this->assertContains('max-age=25200', $client->getResponse()->headers->get('cache-control')); |
@@ -832,7 +832,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
832 | 832 | ||
833 | // sharing is now disabled | 833 | // sharing is now disabled |
834 | $client->getContainer()->get('craue_config')->set('share_public', 0); | 834 | $client->getContainer()->get('craue_config')->set('share_public', 0); |
835 | $client->request('GET', '/share/'.$content->getUuid()); | 835 | $client->request('GET', '/share/'.$content->getUid()); |
836 | $this->assertEquals(404, $client->getResponse()->getStatusCode()); | 836 | $this->assertEquals(404, $client->getResponse()->getStatusCode()); |
837 | 837 | ||
838 | $client->request('GET', '/view/'.$content->getId()); | 838 | $client->request('GET', '/view/'.$content->getId()); |
@@ -843,7 +843,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
843 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | 843 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); |
844 | 844 | ||
845 | // share is now disable | 845 | // share is now disable |
846 | $client->request('GET', '/share/'.$content->getUuid()); | 846 | $client->request('GET', '/share/'.$content->getUid()); |
847 | $this->assertEquals(404, $client->getResponse()->getStatusCode()); | 847 | $this->assertEquals(404, $client->getResponse()->getStatusCode()); |
848 | } | 848 | } |
849 | 849 | ||