WS 'comment' processing. WIP.
This commit is contained in:
parent
b0a6fbfb7f
commit
6b5a60b2a5
|
@ -95,6 +95,8 @@ class ProcessWebsocketUpdatesCommand extends Command
|
|||
if (!$keepJobs) {
|
||||
$this->bsClient->delete($job);
|
||||
}
|
||||
|
||||
// todo cleaning IdentityMap
|
||||
}
|
||||
} catch (UnsupportedTypeException $e) {
|
||||
$output->writeln(' Unsupported message type: '.$message->getA());
|
||||
|
|
|
@ -4,39 +4,22 @@ namespace Skobkin\Bundle\PointToolsBundle\DTO\Api;
|
|||
|
||||
class Comment implements ValidableInterface
|
||||
{
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $postId;
|
||||
|
||||
/**
|
||||
* @var int|null
|
||||
*/
|
||||
/** @var int|null */
|
||||
private $number;
|
||||
|
||||
/**
|
||||
* @var int|null
|
||||
*/
|
||||
/** @var int|null */
|
||||
private $toCommentId;
|
||||
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
/** @var string|null */
|
||||
private $created;
|
||||
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
/** @var string|null */
|
||||
private $text;
|
||||
|
||||
/**
|
||||
* @var User|null
|
||||
*/
|
||||
/** @var User|null */
|
||||
private $author;
|
||||
|
||||
/**
|
||||
* @var bool|null
|
||||
*/
|
||||
/** @var bool|null */
|
||||
private $isRec;
|
||||
|
||||
|
||||
|
|
|
@ -4,27 +4,17 @@ namespace Skobkin\Bundle\PointToolsBundle\DTO\Api;
|
|||
|
||||
class MetaPost implements ValidableInterface
|
||||
{
|
||||
/**
|
||||
* @var Post|null
|
||||
*/
|
||||
/** @var Post|null */
|
||||
private $post;
|
||||
|
||||
/**
|
||||
* @var Comment[]|null
|
||||
*/
|
||||
/** @var Comment[]|null */
|
||||
private $comments;
|
||||
|
||||
|
||||
public function getPost(): ?Post
|
||||
{
|
||||
return $this->post;
|
||||
}
|
||||
|
||||
public function setPost(?Post $post): void
|
||||
{
|
||||
$this->post = $post;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Comment[]|null
|
||||
*/
|
||||
|
@ -33,20 +23,8 @@ class MetaPost implements ValidableInterface
|
|||
return $this->comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Comment[]|null $comments
|
||||
*/
|
||||
public function setComments(?array $comments): void
|
||||
{
|
||||
$this->comments = $comments;
|
||||
}
|
||||
|
||||
public function isValid(): bool
|
||||
{
|
||||
if (null !== $this->post && $this->post->isValid()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return (null !== $this->post && $this->post->isValid());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
namespace Skobkin\Bundle\PointToolsBundle\Exception\Api;
|
||||
|
||||
class PostNotFoundException extends NotFoundException
|
||||
{
|
||||
/** @var string */
|
||||
private $id;
|
||||
|
||||
public function __construct(string $id, \Exception $previous)
|
||||
{
|
||||
parent::__construct('Post not found', 0, $previous);
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function getId(): string
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
}
|
|
@ -4,16 +4,11 @@ namespace Skobkin\Bundle\PointToolsBundle\Exception\Api;
|
|||
|
||||
class UserNotFoundException extends NotFoundException
|
||||
{
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected $userId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $login;
|
||||
/** @var int */
|
||||
private $userId;
|
||||
|
||||
/** @var string */
|
||||
private $login;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
|
|
|
@ -2,10 +2,6 @@ Skobkin\Bundle\PointToolsBundle\DTO\Api\Comment:
|
|||
exclusion_policy: none
|
||||
access_type: public_method
|
||||
properties:
|
||||
postId:
|
||||
serialized_name: 'post_id'
|
||||
type: 'Skobkin\Bundle\PointToolsBundle\DTO\Api\Post'
|
||||
max_depth: 2
|
||||
number:
|
||||
serialized_name: 'id'
|
||||
type: integer
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
Skobkin\Bundle\PointToolsBundle\DTO\Api\MetaPost:
|
||||
exclusion_policy: none
|
||||
access_type: public_method
|
||||
properties:
|
||||
post:
|
||||
serialized_name: 'post'
|
||||
type: 'Skobkin\Bundle\PointToolsBundle\DTO\Api\Post'
|
||||
max_depth: 2
|
||||
comments:
|
||||
serialized_name: 'comments'
|
||||
type: 'array<Skobkin\Bundle\PointToolsBundle\DTO\Api\Comment>'
|
||||
max_depth: 2
|
||||
|
|
|
@ -5,6 +5,9 @@ namespace Skobkin\Bundle\PointToolsBundle\Service\Api;
|
|||
use GuzzleHttp\ClientInterface;
|
||||
use JMS\Serializer\SerializerInterface;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Skobkin\Bundle\PointToolsBundle\DTO\Api\MetaPost;
|
||||
use Skobkin\Bundle\PointToolsBundle\Entity\Blogs\Post;
|
||||
use Skobkin\Bundle\PointToolsBundle\Exception\Api\{NotFoundException, PostNotFoundException};
|
||||
use Skobkin\Bundle\PointToolsBundle\Service\Factory\Blogs\PostFactory;
|
||||
|
||||
/**
|
||||
|
@ -12,6 +15,8 @@ use Skobkin\Bundle\PointToolsBundle\Service\Factory\Blogs\PostFactory;
|
|||
*/
|
||||
class PostApi extends AbstractApi
|
||||
{
|
||||
private const PREFIX = '/api/post/';
|
||||
|
||||
/**
|
||||
* @var PostFactory
|
||||
*/
|
||||
|
@ -24,4 +29,24 @@ class PostApi extends AbstractApi
|
|||
|
||||
$this->postFactory = $postFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws PostNotFoundException
|
||||
*/
|
||||
public function getById(string $id): Post
|
||||
{
|
||||
try {
|
||||
$postData = $this->getGetJsonData(
|
||||
self::PREFIX.$id,
|
||||
[],
|
||||
MetaPost::class
|
||||
);
|
||||
} catch (NotFoundException $e) {
|
||||
throw new PostNotFoundException($id, $e);
|
||||
}
|
||||
|
||||
// Not catching ForbiddenException right now
|
||||
|
||||
return $this->postFactory->findOrCreateFromDtoWithContent($postData);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,9 +3,7 @@
|
|||
namespace Skobkin\Bundle\PointToolsBundle\Service\Api;
|
||||
|
||||
use GuzzleHttp\ClientInterface;
|
||||
use JMS\Serializer\{
|
||||
DeserializationContext, SerializerInterface
|
||||
};
|
||||
use JMS\Serializer\{DeserializationContext, SerializerInterface};
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Skobkin\Bundle\PointToolsBundle\DTO\Api\{Auth, User as UserDTO};
|
||||
use Skobkin\Bundle\PointToolsBundle\Entity\User;
|
||||
|
|
|
@ -6,6 +6,7 @@ use Psr\Log\LoggerInterface;
|
|||
use Skobkin\Bundle\PointToolsBundle\DTO\Api\WebSocket\Message;
|
||||
use Skobkin\Bundle\PointToolsBundle\Entity\Blogs\Comment;
|
||||
use Skobkin\Bundle\PointToolsBundle\Repository\Blogs\{CommentRepository, PostRepository};
|
||||
use Skobkin\Bundle\PointToolsBundle\Service\Api\PostApi;
|
||||
use Skobkin\Bundle\PointToolsBundle\Service\Factory\{AbstractFactory, UserFactory};
|
||||
|
||||
class CommentFactory extends AbstractFactory
|
||||
|
@ -19,13 +20,17 @@ class CommentFactory extends AbstractFactory
|
|||
/** @var UserFactory */
|
||||
private $userFactory;
|
||||
|
||||
/** @var PostApi */
|
||||
private $postApi;
|
||||
|
||||
public function __construct(LoggerInterface $logger, CommentRepository $commentRepository, PostRepository $postRepository, UserFactory $userFactory)
|
||||
|
||||
public function __construct(LoggerInterface $logger, CommentRepository $commentRepository, PostRepository $postRepository, UserFactory $userFactory, PostApi $postApi)
|
||||
{
|
||||
parent::__construct($logger);
|
||||
$this->userFactory = $userFactory;
|
||||
$this->commentRepository = $commentRepository;
|
||||
$this->postRepository = $postRepository;
|
||||
$this->postApi = $postApi;
|
||||
}
|
||||
|
||||
public function findOrCreateFromWebsocketMessage(Message $message): Comment
|
||||
|
@ -41,6 +46,19 @@ class CommentFactory extends AbstractFactory
|
|||
));
|
||||
}
|
||||
|
||||
if (null === $comment = $this->commentRepository->findOneBy(['post' => $post, 'number' => $message->getCommentId()])) {
|
||||
$author = $this->userFactory->findOrCreateFromIdLoginAndName(
|
||||
$message->getAuthorId(),
|
||||
$message->getAuthor(),
|
||||
$message->getAuthorName()
|
||||
);
|
||||
|
||||
if (null === $post = $this->postRepository->find($message->getPostId())) {
|
||||
$post = $this->postApi->getById($message->getPostId());
|
||||
}
|
||||
|
||||
// TODO
|
||||
//$comment = new Comment()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -98,8 +98,6 @@ class PostFactory extends AbstractFactory
|
|||
/**
|
||||
* Create full post with tags, files and comments
|
||||
*
|
||||
* @todo Implement comments
|
||||
*
|
||||
* @throws InvalidDataException
|
||||
*/
|
||||
public function findOrCreateFromDtoWithContent(MetaPost $metaPost): Post
|
||||
|
@ -133,6 +131,8 @@ class PostFactory extends AbstractFactory
|
|||
throw $e;
|
||||
}
|
||||
|
||||
// @TODO implement comments
|
||||
|
||||
return $post;
|
||||
}
|
||||
|
||||
|
@ -149,14 +149,11 @@ class PostFactory extends AbstractFactory
|
|||
}
|
||||
|
||||
if (null === $post = $this->postRepository->find($message->getPostId())) {
|
||||
/** @var User $author */
|
||||
if (null === $author = $this->userRepository->find($message->getAuthorId())) {
|
||||
$author = $this->userFactory->findOrCreateFromIdLoginAndName(
|
||||
$message->getAuthorId(),
|
||||
$message->getAuthor(),
|
||||
$message->getAuthorName()
|
||||
);
|
||||
}
|
||||
|
||||
$post = new Post(
|
||||
$message->getPostId(),
|
||||
|
|
|
@ -52,10 +52,14 @@ class UserFactory extends AbstractFactory
|
|||
|
||||
public function findOrCreateFromIdLoginAndName(int $id, string $login, ?string $name): User
|
||||
{
|
||||
/** @var User $user */
|
||||
if (null === $user = $this->userRepository->find($id)) {
|
||||
// We're using current date now but next time when we'll be updating user from API it'll be fixed
|
||||
$user = new User($id, new \DateTime(), $login, $name);
|
||||
$this->userRepository->add($user);
|
||||
} else {
|
||||
// @todo update login?
|
||||
// Probably don't because no name in the WS message (or maybe after PR to point?)
|
||||
}
|
||||
|
||||
return $user;
|
||||
|
|
|
@ -54,7 +54,12 @@ class WebSocketMessageProcessor
|
|||
|
||||
private function processComment(Message $commentData): bool
|
||||
{
|
||||
// Not done yet
|
||||
return false;
|
||||
|
||||
$this->commentFactory->findOrCreateFromWebsocketMessage($commentData);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function processRecommendation(Message $recommendData): bool
|
||||
|
|
Loading…
Reference in a new issue