<?php namespace JsonApi\Schemas; use Neomerx\JsonApi\Contracts\Schema\ContextInterface; use Neomerx\JsonApi\Schema\Link; class Message extends SchemaProvider { const TYPE = 'messages'; const REL_SENDER = 'sender'; const REL_RECIPIENTS = 'recipients'; const REL_ATTACHMENTS = 'attachments'; public function getId($message): ?string { return $message->id; } public function getAttributes($message, ContextInterface $context): iterable { $user = $this->currentUser; return [ 'subject' => $message->subject, 'message' => $message->message, 'mkdate' => date('c', $message->mkdate), 'is-read' => (bool) $message->isRead($user->id), 'is-answered' => (bool) $message->isAnswered($user->id), 'priority' => $message->priority, 'tags' => $message->getTags(), ]; } public function getRelationships($message, ContextInterface $context): iterable { $relationships = []; $isPrimary = $context->getPosition()->getLevel() === 0; if ($isPrimary) { $relationships = $this->getSenderRelationship($relationships, $message, $this->shouldInclude($context, self::REL_SENDER)); $relationships = $this->getRecipientsRelationship($relationships, $message, $this->shouldInclude($context, self::REL_RECIPIENTS)); $relationships = $this->getAttachmentsRelationship($relationships, $message, $this->shouldInclude($context, self::REL_ATTACHMENTS)); } return $relationships; } private function getSenderRelationship(array $relationships, \Message $message, $includeData) { $userId = $message->getSender()->id; $data = null; if ($userId) { $data = $includeData ? \User::find($userId) : \User::build(['id' => $userId], false); $relationships[self::REL_SENDER] = [ // self::RELATIONSHIP_LINKS_SELF => true, self::RELATIONSHIP_LINKS => [ Link::RELATED => $this->createLinkToResource($data), ], self::RELATIONSHIP_DATA => $data, ]; } return $relationships; } /** * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ private function getRecipientsRelationship(array $relationships, \Message $message, $includeData) { $relationships[self::REL_RECIPIENTS] = [ // self::RELATIONSHIP_LINKS_SELF => true, self::RELATIONSHIP_DATA => $message->receivers->map(function ($i) { return $i->user; }), ]; return $relationships; } private function getAttachmentsRelationship(array $relationships, \Message $message, bool $shouldInclude) { $attachments = $message->attachment_folder->file_refs; $relationships[self::REL_ATTACHMENTS] = [ // self::RELATIONSHIP_LINKS_SELF => true, self::RELATIONSHIP_DATA => $attachments ? $attachments->map(function ($a) { return \FileRef::build(['id' => $a->id], false); }) : [], ]; return $relationships; } }