aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi/Schemas/ResourceSchema.php
blob: bcf89db3638857ead50adeafc0c56841ab44d103 (plain)
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
<?php
namespace JsonApi\Schemas;

use Neomerx\JsonApi\Contracts\Schema\BaseLinkInterface;
use Neomerx\JsonApi\Contracts\Schema\ContextInterface;
use Resource;

final class ResourceSchema extends SchemaProvider
{
    const TYPE = 'resources';

    const REL_CATEGORY = 'category';

    /**
     * @param Resource $resource
     */
    public function getId($resource): ?string
    {
        return $resource->id;
    }

    /**
     * @param Resource $resource
     */
    public function getAttributes($resource, ContextInterface $context): iterable
    {
        return [
            'level' => (int) $resource->level,
            'name' => (string) $resource->name,
            'description' => (string) $resource->description,
            'requestable' => (bool) $resource->requestable,
            'lockable' => (bool) $resource->lockable,
            'sort_position' => (int) $resource->sort_position,

            'mkdate' => date('c', $resource->mkdate),
            'chdate' => date('c', $resource->chdate),
        ];
    }

    /**
     * @param Resource $resource
     */
    public function hasResourceMeta($resource): bool
    {
        return true;
    }

    /**
     * @param Resource $resource
     */
    public function getResourceMeta($resource)
    {
        return [
            'class' => $resource->class_name,
        ];
    }

    /**
     * @param Resource $resource
     */
    public function getRelationships($resource, ContextInterface $context): iterable
    {
        if ($context->getPosition()->getLevel() > 0) {
            return [];
        };

        $relationships = [];

        $relationships = $this->getCategoryRelationship(
            $relationships,
            $resource,
            $this->shouldInclude($context, self::REL_CATEGORY)
        );

        return $relationships;
    }

    private function getCategoryRelationship(array $relationships, $resource, bool $shouldInclude)
    {
        $relationships[self::REL_CATEGORY] = [
            self::RELATIONSHIP_LINKS => [
                BaseLinkInterface::RELATED => $this->getRelationshipRelatedLink($resource, self::REL_CATEGORY),
            ],
            self::RELATIONSHIP_DATA => $shouldInclude ? $resource->category : \ResourceCategory::build(['id' => $resource->category_id]),
        ];

        return $relationships;
    }
}