1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<?php
namespace JsonApi\Schemas;
use Neomerx\JsonApi\Schema\Link;
use Neomerx\JsonApi\Contracts\Schema\ContextInterface;
class BlubberComment extends SchemaProvider
{
const TYPE = 'blubber-comments';
const REL_AUTHOR = 'author';
const REL_MENTIONS = 'mentions';
const REL_THREAD = 'thread';
public function getId($resource): ?string
{
return $resource->id;
}
public function getAttributes($resource, ContextInterface $context): iterable
{
$userId = $this->currentUser->id;
$attributes = [
# `network` VARCHAR(64) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
'content' => $resource['content'],
'content-html' => blubberReady($resource['content']),
'is-writable' => $resource->isWritable($userId),
'mkdate' => date('c', $resource['mkdate']),
'chdate' => date('c', $resource['chdate']),
];
return $attributes;
}
/**
* In dieser Methode können Relationships zu anderen Objekten
* spezifiziert werden.
* {@inheritdoc}
*/
public function getRelationships($resource, ContextInterface $context): iterable
{
$relationships = [];
$relationships = $this->getAuthorRelationship($relationships, $resource, $this->shouldInclude($context, self::REL_AUTHOR));
$isPrimary = $context->getPosition()->getLevel() === 0;
if (!$isPrimary) {
return $relationships;
}
$relationships = $this->getMentionsRelationship($relationships, $resource, $this->shouldInclude($context, self::REL_MENTIONS));
$relationships = $this->getThreadRelationship($relationships, $resource, $this->shouldInclude($context, self::REL_THREAD));
return $relationships;
}
// #### PRIVATE HELPERS ####
private function getAuthorRelationship($relationships, $resource, $includeData)
{
if (!$resource['external_contact']) {
$userId = $resource['user_id'];
if (\User::exists($userId)) {
$data = $includeData ? \User::find($userId) : \User::build(['id' => $userId], false);
$relationships[self::REL_AUTHOR] = [
self::RELATIONSHIP_DATA => $data,
self::RELATIONSHIP_LINKS => [
Link::RELATED => $this->createLinkToResource($data),
]
];
} else {
$relationships[self::REL_AUTHOR] = [ self::RELATIONSHIP_DATA => null ];
}
}
return $relationships;
}
private function getMentionsRelationship(array $relationships, \BlubberComment $resource, $includeData)
{
if ($includeData) {
$relatedUsers = $resource->mentions->pluck('user');
} else {
$relatedUsers = array_map(function ($mention) {
return \User::build(['user_id' => $mention->user_id], false);
}, \BlubberMention::findBySQL('thread_id = ?', [$resource->id]));
}
$relationships[self::REL_MENTIONS] = [
self::RELATIONSHIP_LINKS => [
Link::RELATED => $this->getRelationshipRelatedLink($resource, self::REL_MENTIONS),
],
self::RELATIONSHIP_DATA => $relatedUsers,
];
return $relationships;
}
private function getThreadRelationship(array $relationships, \BlubberComment $resource, $includeData)
{
if ($includeData) {
$related = $resource->thread;
} else {
$related = \BlubberThread::build(['id' => $resource->thread_id], false);
}
$relationships[self::REL_THREAD] = [
self::RELATIONSHIP_LINKS => [
Link::RELATED => $this->createLinkToResource($related),
],
self::RELATIONSHIP_DATA => $related,
];
return $relationships;
}
}
|