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
119
120
121
|
<?php
namespace JsonApi\Routes\Wiki\Rel;
use Psr\Http\Message\ServerRequestInterface as Request;
use JsonApi\Routes\Wiki\Authority;
use JsonApi\Routes\RelationshipsController;
use JsonApi\Routes\Wiki\HelperTrait;
use JsonApi\Errors\BadRequestException;
class ParentPage extends RelationshipsController
{
use HelperTrait;
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function fetchRelationship(Request $request, $related)
{
$parent = $related->parent;
return $this->getIdentifiersResponse($parent);
}
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function replaceRelationship(Request $request, $related)
{
$json = $this->validate($request);
$parentPage = is_null($json['data'])
? null
: $this->validateParentPage($related, $json);
$this->replaceParentPage($related, $parentPage);
return $this->getCodeResponse(204);
}
private function replaceParentPage($related, $parentOrNull)
{
$related->ancestor = is_null($parentOrNull) ? '' : $parentOrNull->keyword;
$related->store();
}
protected function findRelated(array $args)
{
return self::findWikiPage($args['id']);
}
protected function authorize(Request $request, $resource)
{
switch ($request->getMethod()) {
case 'GET':
return Authority::canShowWiki($this->getUser($request), $resource);
case 'PATCH':
return Authority::canUpdateParent($this->getUser($request), $resource);
default:
return false;
}
}
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function validateResourceDocument($json, $data)
{
if (!self::arrayHas($json, 'data')) {
return 'Missing `data` member at document´s top level.';
}
$item = self::arrayGet($json, 'data');
if (!is_null($item)) {
if (\JsonApi\Schemas\WikiPage::TYPE !== self::arrayGet($item, 'type')) {
return 'Wrong `type` in document´s `data`.';
}
if (!self::arrayGet($item, 'id')) {
return 'Missing `id` of document´s `data`.';
}
if (self::arrayHas($item, 'attributes')) {
return 'Document must not have `attributes`.';
}
}
}
private function validateParentPage(\WikiPage $page, $json)
{
$resourceIdentifier = self::arrayGet($json, 'data');
$parentPage = self::findWikiPage($resourceIdentifier['id']);
if ($parentPage->range_id !== $page->range_id) {
throw new BadRequestException('Both pages have to belong to the same range_id.');
}
if (!$page->isValidAncestor($parentPage->keyword)) {
throw new BadRequestException('Page is not a valid parent page.');
}
return $parentPage;
}
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function getRelationshipSelfLink($resource, $schema, $userData)
{
return $schema->getRelationshipSelfLink($resource, 'parent');
}
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function getRelationshipRelatedLink($resource, $schema, $userData)
{
return $schema->getRelationshipRelatedLink($resource, 'parent');
}
}
|