Skip to content

Commit

Permalink
[Forum] fixes resource copy
Browse files Browse the repository at this point in the history
  • Loading branch information
Elorfin committed Feb 28, 2023
1 parent 6906739 commit 9b629ef
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 50 deletions.
5 changes: 4 additions & 1 deletion src/plugin/forum/Listener/Resource/ForumListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,13 @@ public function onCopy(CopyResourceEvent $event)

$this->om->startFlushSuite();
foreach ($forum->getSubjects() as $subject) {
$subjectData = $this->serializer->serialize($subject);
unset($subjectData['forum']);

$newSubject = new Subject();
$newSubject->setForum($copy);

$this->crud->create($newSubject, $this->serializer->serialize($subject), [
$this->crud->create($newSubject, $subjectData, [
Crud::NO_PERMISSIONS, // this has already been checked by the core before forwarding the copy
Options::REFRESH_UUID,
]);
Expand Down
69 changes: 20 additions & 49 deletions src/plugin/forum/Serializer/SubjectSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,28 +38,22 @@ class SubjectSerializer
/** @var ObjectRepository */
private $messageRepo;

public function getClass()
public function getClass(): string
{
return Subject::class;
}

public function getName()
public function getName(): string
{
return 'forum_subject';
}

/**
* @return string
*/
public function getSchema()
public function getSchema(): string
{
return '#/plugin/forum/subject.json';
}

/**
* @return string
*/
public function getSamples()
public function getSamples(): string
{
return '#/plugin/forum/subject';
}
Expand All @@ -84,10 +78,8 @@ public function __construct(

/**
* Serializes a Subject entity.
*
* @return array
*/
public function serialize(Subject $subject, array $options = [])
public function serialize(Subject $subject, ?array $options = []): array
{
$first = $this->messageRepo->findOneBy([
'subject' => $subject,
Expand All @@ -102,36 +94,27 @@ public function serialize(Subject $subject, array $options = [])
'tags' => $this->serializeTags($subject),
'content' => $first ? $first->getContent() : null,
'title' => $subject->getTitle(),
'meta' => $this->serializeMeta($subject, $options),
'meta' => [
'moderation' => $subject->getModerated(),
'views' => $subject->getViewCount(),
// don't use Finder in a Serializer
'messages' => $this->finder->fetch(Message::class, ['subject' => $subject->getUuid(), 'parent' => null], null, 0, 0, true),
'creator' => !empty($subject->getCreator()) ? $this->userSerializer->serialize($subject->getCreator(), [Options::SERIALIZE_MINIMAL]) : null,
'created' => DateNormalizer::normalize($subject->getCreationDate()),
'updated' => DateNormalizer::normalize($subject->getModificationDate()),
'sticky' => $subject->isSticked(),
'closed' => $subject->isClosed(),
'flagged' => $subject->isFlagged(),
'hot' => in_array($subject->getUuid(), $this->manager->getHotSubjects($subject->getForum())),
],
'poster' => $subject->getPoster() ? $subject->getPoster()->getUrl() : null,
];
}

private function serializeMeta(Subject $subject, array $options = [])
{
return [
'moderation' => $subject->getModerated(),
'views' => $subject->getViewCount(),
// don't use Finder in a Serializer
'messages' => $this->finder->fetch(Message::class, ['subject' => $subject->getUuid(), 'parent' => null], null, 0, 0, true),
'creator' => !empty($subject->getCreator()) ? $this->userSerializer->serialize($subject->getCreator(), [Options::SERIALIZE_MINIMAL]) : null,
'created' => DateNormalizer::normalize($subject->getCreationDate()),
'updated' => DateNormalizer::normalize($subject->getModificationDate()),
'sticky' => $subject->isSticked(),
'closed' => $subject->isClosed(),
'flagged' => $subject->isFlagged(),
'hot' => $this->isHot($subject),
];
}

/**
* Deserializes data into a Subject entity.
*
* @param array $data
*
* @return Subject
*/
public function deserialize($data, Subject $subject, array $options = [])
public function deserialize(array $data, Subject $subject, array $options = []): Subject
{
$first = $this->messageRepo->findOneBy([
'subject' => $subject,
Expand All @@ -149,14 +132,8 @@ public function deserialize($data, Subject $subject, array $options = [])
$this->sipe('meta.moderation', 'setModerated', $data, $subject);

if (isset($data['content'])) {
// this should be done in the CRUD instead
// TODO this should be done in the CRUD instead
if (!$first) {
$messageData = ['content' => $data['content']];

if (isset($data['meta']) && isset($data['meta']['creator'])) {
$messageData['meta']['creator'] = $data['meta']['creator'];
}

$first = new Message();
$first->setFirst(true);
$first->setSubject($subject);
Expand All @@ -172,7 +149,6 @@ public function deserialize($data, Subject $subject, array $options = [])
}

if (isset($data['meta']['creator'])) {
// TODO: reuse value from token Storage if new
$creator = $this->om->getObject($data['meta']['creator'], User::class);

if ($creator) {
Expand Down Expand Up @@ -248,9 +224,4 @@ private function deserializeTags(Subject $subject, array $tags = [], array $opti

$this->eventDispatcher->dispatch($event, 'claroline_tag_multiple_data');
}

private function isHot(Subject $subject)
{
return in_array($subject->getUuid(), $this->manager->getHotSubjects($subject->getForum()));
}
}

0 comments on commit 9b629ef

Please sign in to comment.