2015-10-26 02:57:53 +00:00
|
|
|
<?php
|
|
|
|
|
2016-03-23 17:06:49 +00:00
|
|
|
namespace Skobkin\Bundle\PointToolsBundle\Service\Factory\Blogs;
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2017-01-08 23:26:06 +00:00
|
|
|
use Doctrine\ORM\EntityManagerInterface;
|
2016-03-23 22:49:22 +00:00
|
|
|
use Psr\Log\LoggerInterface;
|
2017-11-05 01:42:08 +00:00
|
|
|
use Skobkin\Bundle\PointToolsBundle\DTO\Api\{MetaPost, Post as PostDTO, PostsPage};
|
|
|
|
use Skobkin\Bundle\PointToolsBundle\Entity\{Blogs\Post, Blogs\PostTag, User};
|
|
|
|
use Skobkin\Bundle\PointToolsBundle\Exception\{Api\InvalidResponseException, Factory\Blog\InvalidDataException};
|
2017-01-11 16:27:08 +00:00
|
|
|
use Skobkin\Bundle\PointToolsBundle\Repository\Blogs\PostRepository;
|
2017-11-05 01:42:08 +00:00
|
|
|
use Skobkin\Bundle\PointToolsBundle\Service\Factory\{AbstractFactory, UserFactory};
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2017-01-15 02:54:38 +00:00
|
|
|
class PostFactory extends AbstractFactory
|
2015-10-26 02:57:53 +00:00
|
|
|
{
|
2017-11-05 01:42:08 +00:00
|
|
|
/** @var EntityManagerInterface */
|
2015-10-26 02:57:53 +00:00
|
|
|
private $em;
|
|
|
|
|
2017-11-05 01:42:08 +00:00
|
|
|
/** @var PostRepository */
|
2015-10-26 02:57:53 +00:00
|
|
|
private $postRepository;
|
|
|
|
|
2017-11-05 01:42:08 +00:00
|
|
|
/** @var UserFactory */
|
2015-10-26 02:57:53 +00:00
|
|
|
private $userFactory;
|
|
|
|
|
2017-11-05 01:42:08 +00:00
|
|
|
/** @var FileFactory */
|
2016-03-24 21:28:43 +00:00
|
|
|
private $fileFactory;
|
|
|
|
|
2017-11-05 01:42:08 +00:00
|
|
|
/** @var CommentFactory */
|
2015-10-26 02:57:53 +00:00
|
|
|
private $commentFactory;
|
|
|
|
|
2017-11-05 01:42:08 +00:00
|
|
|
/** @var TagFactory */
|
2015-10-26 02:57:53 +00:00
|
|
|
private $tagFactory;
|
|
|
|
|
2017-01-08 23:26:06 +00:00
|
|
|
|
2017-01-11 16:27:08 +00:00
|
|
|
public function __construct(
|
|
|
|
LoggerInterface $logger,
|
|
|
|
EntityManagerInterface $em,
|
|
|
|
PostRepository $postRepository,
|
|
|
|
UserFactory $userFactory,
|
|
|
|
FileFactory $fileFactory,
|
|
|
|
CommentFactory $commentFactory,
|
|
|
|
TagFactory $tagFactory
|
|
|
|
) {
|
2017-01-15 02:54:38 +00:00
|
|
|
parent::__construct($logger);
|
2017-01-11 16:27:08 +00:00
|
|
|
$this->em = $em;
|
|
|
|
$this->postRepository = $postRepository;
|
2015-10-26 02:57:53 +00:00
|
|
|
$this->userFactory = $userFactory;
|
2016-03-24 21:28:43 +00:00
|
|
|
$this->fileFactory = $fileFactory;
|
2015-10-26 02:57:53 +00:00
|
|
|
$this->commentFactory = $commentFactory;
|
|
|
|
$this->tagFactory = $tagFactory;
|
|
|
|
}
|
|
|
|
|
2015-10-26 03:31:24 +00:00
|
|
|
/**
|
2016-03-23 22:49:22 +00:00
|
|
|
* Creates posts and return status of new insertions
|
2015-10-26 03:31:24 +00:00
|
|
|
*
|
|
|
|
* @throws InvalidResponseException
|
|
|
|
*/
|
2017-01-08 23:26:06 +00:00
|
|
|
public function createFromPageDTO(PostsPage $page): bool
|
2015-10-26 02:57:53 +00:00
|
|
|
{
|
2016-03-23 22:49:22 +00:00
|
|
|
$posts = [];
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2016-03-23 22:49:22 +00:00
|
|
|
$hasNew = false;
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2017-01-15 16:53:17 +00:00
|
|
|
foreach ((array) $page->getPosts() as $postData) {
|
2016-03-23 22:49:22 +00:00
|
|
|
try {
|
|
|
|
if (null === $this->postRepository->find($postData->getPost()->getId())) {
|
|
|
|
$hasNew = true;
|
|
|
|
}
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2017-11-06 02:36:32 +00:00
|
|
|
$post = $this->findOrCreateFromDtoWithContent($postData);
|
2016-03-23 22:49:22 +00:00
|
|
|
$posts[] = $post;
|
|
|
|
} catch (\Exception $e) {
|
2017-01-11 16:27:08 +00:00
|
|
|
$this->logger->error('Error while processing post DTO', [
|
2016-03-25 23:48:39 +00:00
|
|
|
'post_id' => $postData->getPost()->getId(),
|
|
|
|
'exception' => get_class($e),
|
|
|
|
'message' => $e->getMessage(),
|
|
|
|
'file' => $e->getFile(),
|
|
|
|
'line' => $e->getLine(),
|
|
|
|
]);
|
2015-10-26 02:57:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-23 22:49:22 +00:00
|
|
|
foreach ($posts as $post) {
|
2017-11-06 02:36:32 +00:00
|
|
|
// @todo probably refactor?
|
2016-03-23 22:49:22 +00:00
|
|
|
if ($this->em->getUnitOfWork()->isScheduledForInsert($post)) {
|
|
|
|
$hasNew = true;
|
2015-10-26 02:57:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-23 22:49:22 +00:00
|
|
|
return $hasNew;
|
|
|
|
}
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2016-03-23 22:49:22 +00:00
|
|
|
/**
|
2017-11-06 02:36:32 +00:00
|
|
|
* Create full post with tags, files and comments
|
|
|
|
*
|
|
|
|
* @todo Implement comments
|
2017-01-08 23:26:06 +00:00
|
|
|
*
|
2017-01-09 18:43:41 +00:00
|
|
|
* @throws InvalidDataException
|
2016-03-23 22:49:22 +00:00
|
|
|
*/
|
2017-11-06 02:36:32 +00:00
|
|
|
public function findOrCreateFromDtoWithContent(MetaPost $metaPost): Post
|
2016-03-23 22:49:22 +00:00
|
|
|
{
|
2017-01-15 17:33:43 +00:00
|
|
|
if (!$metaPost->isValid()) {
|
2017-01-09 18:43:41 +00:00
|
|
|
throw new InvalidDataException('Invalid post data');
|
2015-10-26 03:31:24 +00:00
|
|
|
}
|
|
|
|
|
2017-01-15 17:33:43 +00:00
|
|
|
$postData = $metaPost->getPost();
|
|
|
|
|
2016-03-25 23:48:39 +00:00
|
|
|
try {
|
2017-01-15 17:33:43 +00:00
|
|
|
$author = $this->userFactory->findOrCreateFromDTO($metaPost->getPost()->getAuthor());
|
2016-03-25 23:48:39 +00:00
|
|
|
} catch (\Exception $e) {
|
2017-01-11 16:27:08 +00:00
|
|
|
$this->logger->error('Error while creating user from DTO');
|
2016-03-25 23:48:39 +00:00
|
|
|
throw $e;
|
|
|
|
}
|
2016-03-23 22:49:22 +00:00
|
|
|
|
2017-01-15 17:33:43 +00:00
|
|
|
$post = $this->findOrCreateFromDto($postData, $author);
|
2016-03-23 22:49:22 +00:00
|
|
|
|
2016-03-25 23:48:39 +00:00
|
|
|
try {
|
2017-01-15 17:33:43 +00:00
|
|
|
$this->updatePostTags($post, $postData->getTags() ?: []);
|
2016-03-25 23:48:39 +00:00
|
|
|
} catch (\Exception $e) {
|
2017-01-11 16:27:08 +00:00
|
|
|
$this->logger->error('Error while updating post tags');
|
2016-03-25 23:48:39 +00:00
|
|
|
throw $e;
|
|
|
|
}
|
2016-03-23 22:49:22 +00:00
|
|
|
|
2016-03-25 23:48:39 +00:00
|
|
|
try {
|
2017-01-15 17:33:43 +00:00
|
|
|
$this->updatePostFiles($post, $postData->getFiles() ?: []);
|
2016-03-25 23:48:39 +00:00
|
|
|
} catch (\Exception $e) {
|
2017-01-11 16:27:08 +00:00
|
|
|
$this->logger->error('Error while updating post files');
|
2016-03-25 23:48:39 +00:00
|
|
|
throw $e;
|
|
|
|
}
|
|
|
|
|
2015-10-26 02:57:53 +00:00
|
|
|
return $post;
|
|
|
|
}
|
2017-01-15 17:33:43 +00:00
|
|
|
|
|
|
|
private function findOrCreateFromDto(PostDTO $postData, User $author): Post
|
|
|
|
{
|
|
|
|
if (null === ($post = $this->postRepository->find($postData->getId()))) {
|
|
|
|
// Creating new post
|
|
|
|
$post = new Post(
|
|
|
|
$postData->getId(),
|
|
|
|
$author,
|
|
|
|
new \DateTime($postData->getCreated()),
|
|
|
|
$postData->getType() ?: Post::TYPE_POST
|
|
|
|
);
|
|
|
|
$this->postRepository->add($post);
|
|
|
|
}
|
|
|
|
|
|
|
|
$post
|
|
|
|
->setText($postData->getText())
|
|
|
|
->setPrivate($postData->getPrivate())
|
|
|
|
;
|
|
|
|
|
|
|
|
return $post;
|
|
|
|
}
|
2015-10-26 02:57:53 +00:00
|
|
|
|
2015-10-26 03:31:24 +00:00
|
|
|
/**
|
2016-03-23 22:49:22 +00:00
|
|
|
* @param Post $post
|
2016-12-12 18:23:11 +00:00
|
|
|
* @param string[] $tagsStrings
|
2015-10-26 03:31:24 +00:00
|
|
|
*/
|
2017-01-12 23:21:17 +00:00
|
|
|
private function updatePostTags(Post $post, array $tagsStrings): void
|
2015-10-26 02:57:53 +00:00
|
|
|
{
|
2016-03-23 22:49:22 +00:00
|
|
|
$tags = $this->tagFactory->createFromStringsArray($tagsStrings);
|
|
|
|
|
|
|
|
// Hashing tags strings
|
|
|
|
$tagStringsHash = [];
|
|
|
|
foreach ($tagsStrings as $tagsString) {
|
|
|
|
$tagStringsHash[mb_strtolower($tagsString)] = $tagsString;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hashing current post tags
|
|
|
|
$newTagsHash = [];
|
|
|
|
foreach ($tags as $tag) {
|
|
|
|
$newTagsHash[mb_strtolower($tag->getText())] = $tag;
|
2015-10-26 02:57:53 +00:00
|
|
|
}
|
|
|
|
|
2016-03-23 22:49:22 +00:00
|
|
|
// Hashing old post tags (from DB)
|
|
|
|
$oldTagsHash = [];
|
|
|
|
foreach ($post->getPostTags() as $postTag) {
|
|
|
|
$oldTagsHash[mb_strtolower($postTag->getOriginalTagText())] = $postTag;
|
2015-10-26 02:57:53 +00:00
|
|
|
}
|
|
|
|
|
2016-03-23 22:49:22 +00:00
|
|
|
// Adding missing tags
|
|
|
|
foreach ($tags as $tag) {
|
|
|
|
if (!array_key_exists(mb_strtolower($tag->getText()), $oldTagsHash)) {
|
2017-11-06 02:36:32 +00:00
|
|
|
$tmpPostTag = new PostTag($post, $tag, $tagStringsHash[mb_strtolower($tag->getText())]);
|
2016-03-23 22:49:22 +00:00
|
|
|
$post->addPostTag($tmpPostTag);
|
|
|
|
}
|
2015-10-26 02:57:53 +00:00
|
|
|
}
|
2016-03-23 22:49:22 +00:00
|
|
|
|
|
|
|
// Removing deleted tags
|
|
|
|
foreach ($post->getPostTags() as $postTag) {
|
|
|
|
if (!array_key_exists(mb_strtolower($postTag->getOriginalTagText()), $newTagsHash)) {
|
|
|
|
$post->removePostTag($postTag);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-24 21:28:43 +00:00
|
|
|
/**
|
|
|
|
* @param Post $post
|
|
|
|
* @param array $urls
|
|
|
|
*/
|
2017-01-12 23:21:17 +00:00
|
|
|
private function updatePostFiles(Post $post, array $urls): void
|
2016-03-24 21:28:43 +00:00
|
|
|
{
|
|
|
|
$files = $this->fileFactory->createFromUrlsArray($urls);
|
|
|
|
|
|
|
|
// Adding missing files
|
|
|
|
foreach ($files as $file) {
|
|
|
|
if (!$post->getFiles()->contains($file)) {
|
|
|
|
$post->addFile($file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Removing deleted files
|
|
|
|
foreach ($post->getFiles() as $file) {
|
|
|
|
if (!in_array($file, $files, true)) {
|
|
|
|
$post->removeFile($file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-26 02:57:53 +00:00
|
|
|
}
|