Completed
Push — master ( c34cac...3c68a7 )
by Pieter
04:47
created

ApiResourceFacade::put()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
c 0
b 0
f 0
nc 1
nop 3
dl 0
loc 13
rs 10
1
<?php
2
namespace W2w\Lib\Apie\Core;
3
4
use Psr\Http\Message\RequestInterface;
5
use Psr\Http\Message\ServerRequestInterface;
6
use W2w\Lib\Apie\Core\Models\ApiResourceFacadeResponse;
7
use W2w\Lib\Apie\Core\SearchFilters\SearchFilterRequest;
8
use W2w\Lib\Apie\Interfaces\FormatRetrieverInterface;
9
use W2w\Lib\Apie\Interfaces\ResourceSerializerInterface;
10
11
class ApiResourceFacade
12
{
13
    /**
14
     * @var ApiResourceRetriever
15
     */
16
    private $retriever;
17
18
    /**
19
     * @var ApiResourcePersister
20
     */
21
    private $persister;
22
23
    /**
24
     * @var ClassResourceConverter
25
     */
26
    private $converter;
27
28
    /**
29
     * @var ResourceSerializerInterface
30
     */
31
    private $serializer;
32
33
    /**
34
     * @var FormatRetrieverInterface
35
     */
36
    private $formatRetriever;
37
38
    public function __construct(
39
        ApiResourceRetriever $retriever,
40
        ApiResourcePersister $persister,
41
        ClassResourceConverter $converter,
42
        ResourceSerializerInterface $serializer,
43
        FormatRetrieverInterface $formatRetriever
44
    ) {
45
        $this->retriever = $retriever;
46
        $this->persister = $persister;
47
        $this->converter = $converter;
48
        $this->serializer = $serializer;
49
        $this->formatRetriever = $formatRetriever;
50
    }
51
52
    /**
53
     * Does a DELETE instance call.
54
     *
55
     * @param string $resourceClass
56
     * @param string $id
57
     * @return ApiResourceFacadeResponse
58
     */
59
    public function delete(string $resourceClass, string $id): ApiResourceFacadeResponse
60
    {
61
        $this->persister->delete($resourceClass, $id);
62
63
        return new ApiResourceFacadeResponse(
64
            $this->serializer,
65
            null,
66
            'application/json'
67
        );
68
    }
69
70
    /**
71
     * Does a GET instance call.
72
     *
73
     * @param string $resourceClass
74
     * @param string $id
75
     * @param RequestInterface|null $request
76
     * @return ApiResourceFacadeResponse
77
     */
78
    public function get(string $resourceClass, string $id, ?RequestInterface $request): ApiResourceFacadeResponse
79
    {
80
        $resource = $this->retriever->retrieve($resourceClass, $id);
81
82
        return $this->createResponse($resource, $request);
83
    }
84
85
    /**
86
     * Does a GET all call.
87
     *
88
     * @param string $resourceClass
89
     * @param ServerRequestInterface|null $request
90
     * @return ApiResourceFacadeResponse
91
     */
92
    public function getAll(string $resourceClass, ?ServerRequestInterface $request): ApiResourceFacadeResponse
93
    {
94
        $searchFilterRequest = new SearchFilterRequest();
95
        if ($request) {
96
            $searchFilterRequest = SearchFilterRequest::createFromPsrRequest($request);
97
        }
98
        $resource = $this->retriever->retrieveAll($resourceClass, $searchFilterRequest);
99
100
        return $this->createResponse($resource, $request);
101
    }
102
103
    /**
104
     * Does a PUT instance call.
105
     *
106
     * @param string $resourceClass
107
     * @param string $id
108
     * @param RequestInterface $request
109
     * @return ApiResourceFacadeResponse
110
     */
111
    public function put(string $resourceClass, string $id, RequestInterface $request): ApiResourceFacadeResponse
112
    {
113
        $resource = $this->get($resourceClass, $id, $request)->getResource();
114
115
        $resource = $this->serializer->putData(
116
            $resource,
117
            (string) $request->getBody(),
118
            $request->getHeader('Content-Type')[0] ?? 'application/json'
119
        );
120
121
        $resource = $this->persister->persistExisting($resource, $id);
122
123
        return $this->createResponse($resource, $request);
124
    }
125
126
    /**
127
     * Does a POST new instance call.
128
     *
129
     * @param string $resourceClass
130
     * @param RequestInterface $request
131
     * @return ApiResourceFacadeResponse
132
     */
133
    public function post(string $resourceClass, RequestInterface $request): ApiResourceFacadeResponse
134
    {
135
        $resource = $this->serializer->postData(
136
            $resourceClass,
137
            (string) $request->getBody(),
138
            $request->getHeader('Content-Type')[0] ?? 'application/json'
139
        );
140
        $resource = $this->persister->persistNew($resource);
141
142
        return $this->createResponse($resource, $request);
143
    }
144
145
    /**
146
     * Creates a ApiResourceFacadeResponse instance.
147
     *
148
     * @param mixed $resource
149
     * @param RequestInterface|null $request
150
     * @return ApiResourceFacadeResponse
151
     */
152
    private function createResponse($resource, ?RequestInterface $request): ApiResourceFacadeResponse
153
    {
154
        return new ApiResourceFacadeResponse(
155
            $this->serializer,
156
            $resource,
157
            ($request && $request->hasHeader('Accept')) ? $request->getHeader('Accept')[0] : 'application/json'
158
        );
159
    }
160
}
161