diff --git a/app/DoctrineMigrations/Version20171106023155.php b/app/DoctrineMigrations/Version20171106023155.php new file mode 100644 index 0000000..e9110aa --- /dev/null +++ b/app/DoctrineMigrations/Version20171106023155.php @@ -0,0 +1,44 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('ALTER INDEX subscriptions.author_idx RENAME TO idx_subscription_author'); + $this->addSql('ALTER INDEX subscriptions.subscriber_idx RENAME TO idx_subscription_subscriber'); + $this->addSql('ALTER INDEX subscriptions.date_idx RENAME TO idx_subscription_date'); + $this->addSql('ALTER TABLE posts.posts_tags DROP CONSTRAINT FK_7870CC82BAD26311'); + $this->addSql('ALTER TABLE posts.posts_tags ADD CONSTRAINT FK_7870CC82BAD26311 FOREIGN KEY (tag_id) REFERENCES posts.tags (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('DROP INDEX posts.idx_tag_text'); + } + + /** + * @param Schema $schema + */ + public function down(Schema $schema) + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('CREATE INDEX idx_tag_text ON posts.tags (text)'); + $this->addSql('ALTER TABLE posts.posts_tags DROP CONSTRAINT fk_7870cc82bad26311'); + $this->addSql('ALTER TABLE posts.posts_tags ADD CONSTRAINT fk_7870cc82bad26311 FOREIGN KEY (tag_id) REFERENCES posts.tags (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER INDEX subscriptions.idx_subscription_author RENAME TO author_idx'); + $this->addSql('ALTER INDEX subscriptions.idx_subscription_date RENAME TO date_idx'); + $this->addSql('ALTER INDEX subscriptions.idx_subscription_subscriber RENAME TO subscriber_idx'); + } +} diff --git a/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/PostTag.php b/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/PostTag.php index 1b4a76e..1e94c9e 100644 --- a/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/PostTag.php +++ b/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/PostTag.php @@ -6,7 +6,7 @@ use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="posts_tags", schema="posts") - * @ORM\Entity(repositoryClass="Skobkin\Bundle\PointToolsBundle\Repository\Blogs\PostTagRepository") + * @ORM\Entity(repositoryClass="Skobkin\Bundle\PointToolsBundle\Repository\Blogs\PostTagRepository", readOnly=true) */ class PostTag { @@ -22,7 +22,7 @@ class PostTag /** * @var Post * - * @ORM\ManyToOne(targetEntity="Skobkin\Bundle\PointToolsBundle\Entity\Blogs\Post", inversedBy="postTags") + * @ORM\ManyToOne(targetEntity="Post", inversedBy="postTags") * @ORM\JoinColumn(name="post_id", onDelete="CASCADE") */ private $post; @@ -30,10 +30,8 @@ class PostTag /** * @var Tag * - * @todo fix SET NULL - * - * @ORM\ManyToOne(targetEntity="Skobkin\Bundle\PointToolsBundle\Entity\Blogs\Tag", fetch="EAGER") - * @ORM\JoinColumn(name="tag_id", onDelete="SET NULL") + * @ORM\ManyToOne(targetEntity="Tag", fetch="EAGER") + * @ORM\JoinColumn(name="tag_id") */ private $tag; @@ -45,9 +43,11 @@ class PostTag private $text; - public function __construct(Tag $tag) + public function __construct(Post $post, Tag $tag, string $text) { + $this->post = $post; $this->tag = $tag; + $this->text = $text; } public function getId(): int @@ -55,13 +55,6 @@ class PostTag return $this->id; } - public function setText(string $text): self - { - $this->text = $text; - - return $this; - } - public function getText(): string { return $this->text; @@ -69,22 +62,7 @@ class PostTag public function getOriginalTagText(): string { - return $this->tag ? $this->tag->getText() : ''; - } - - /** - * Set post - * - * @todo move to constructor - * - * @param Post $post - * @return PostTag - */ - public function setPost(Post $post = null): self - { - $this->post = $post; - - return $this; + return $this->tag->getText(); } public function getPost(): Post diff --git a/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/Tag.php b/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/Tag.php index 90db241..086f5ca 100644 --- a/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/Tag.php +++ b/src/Skobkin/Bundle/PointToolsBundle/Entity/Blogs/Tag.php @@ -5,9 +5,7 @@ namespace Skobkin\Bundle\PointToolsBundle\Entity\Blogs; use Doctrine\ORM\Mapping as ORM; /** - * @ORM\Table(name="tags", schema="posts", indexes={ - * @ORM\Index(name="idx_tag_text", columns={"text"}) - * }) + * @ORM\Table(name="tags", schema="posts") * @ORM\Entity(repositoryClass="Skobkin\Bundle\PointToolsBundle\Repository\Blogs\TagRepository", readOnly=true) */ class Tag diff --git a/src/Skobkin/Bundle/PointToolsBundle/Entity/SubscriptionEvent.php b/src/Skobkin/Bundle/PointToolsBundle/Entity/SubscriptionEvent.php index cb2fff6..4dc4f13 100644 --- a/src/Skobkin/Bundle/PointToolsBundle/Entity/SubscriptionEvent.php +++ b/src/Skobkin/Bundle/PointToolsBundle/Entity/SubscriptionEvent.php @@ -6,9 +6,9 @@ use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="log", schema="subscriptions", indexes={ - * @ORM\Index(name="author_idx", columns={"author_id"}), - * @ORM\Index(name="subscriber_idx", columns={"subscriber_id"}), - * @ORM\Index(name="date_idx", columns={"date"}) + * @ORM\Index(name="idx_subscription_author", columns={"author_id"}), + * @ORM\Index(name="idx_subscription_subscriber", columns={"subscriber_id"}), + * @ORM\Index(name="idx_subscription_date", columns={"date"}) * }) * @ORM\Entity(repositoryClass="Skobkin\Bundle\PointToolsBundle\Repository\SubscriptionEventRepository", readOnly=true) */ diff --git a/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/PostFactory.php b/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/PostFactory.php index ef6e5f4..0d6511e 100644 --- a/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/PostFactory.php +++ b/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/PostFactory.php @@ -52,8 +52,6 @@ class PostFactory extends AbstractFactory /** * Creates posts and return status of new insertions * - * @todo refactor - * * @throws InvalidResponseException */ public function createFromPageDTO(PostsPage $page): bool @@ -68,7 +66,7 @@ class PostFactory extends AbstractFactory $hasNew = true; } - $post = $this->findOrCreateFromDTOWithTagsAndFiles($postData); + $post = $this->findOrCreateFromDtoWithContent($postData); $posts[] = $post; } catch (\Exception $e) { $this->logger->error('Error while processing post DTO', [ @@ -82,6 +80,7 @@ class PostFactory extends AbstractFactory } foreach ($posts as $post) { + // @todo probably refactor? if ($this->em->getUnitOfWork()->isScheduledForInsert($post)) { $hasNew = true; } @@ -91,11 +90,13 @@ class PostFactory extends AbstractFactory } /** - * @todo Implement full post processing with comments + * Create full post with tags, files and comments + * + * @todo Implement comments * * @throws InvalidDataException */ - public function findOrCreateFromDTOWithTagsAndFiles(MetaPost $metaPost): Post + public function findOrCreateFromDtoWithContent(MetaPost $metaPost): Post { if (!$metaPost->isValid()) { throw new InvalidDataException('Invalid post data'); @@ -179,9 +180,7 @@ class PostFactory extends AbstractFactory // Adding missing tags foreach ($tags as $tag) { if (!array_key_exists(mb_strtolower($tag->getText()), $oldTagsHash)) { - $tmpPostTag = (new PostTag($tag)) - ->setText($tagStringsHash[mb_strtolower($tag->getText())]) - ; + $tmpPostTag = new PostTag($post, $tag, $tagStringsHash[mb_strtolower($tag->getText())]); $post->addPostTag($tmpPostTag); } } diff --git a/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/TagFactory.php b/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/TagFactory.php index 8cd8b76..43f2af2 100644 --- a/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/TagFactory.php +++ b/src/Skobkin/Bundle/PointToolsBundle/Service/Factory/Blogs/TagFactory.php @@ -16,6 +16,7 @@ class TagFactory extends AbstractFactory public function __construct(LoggerInterface $logger, TagRepository $tagRepository) { parent::__construct($logger); + $this->tagRepository = $tagRepository; } @@ -41,7 +42,7 @@ class TagFactory extends AbstractFactory return $tags; } - public function createFromString(string $text): Tag + private function createFromString(string $text): Tag { if (null === ($tag = $this->tagRepository->findOneByLowerText($text))) { // Creating new tag