RequestToFacadeResponseConverter::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
1
<?php
2
3
4
namespace W2w\Laravel\Apie\Services;
5
6
7
use Psr\Http\Message\ServerRequestInterface;
8
use RuntimeException;
9
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
10
use W2w\Lib\Apie\Core\ApiResourceFacade;
11
use W2w\Lib\Apie\Core\ClassResourceConverter;
12
use W2w\Lib\Apie\Core\Models\ApiResourceFacadeResponse;
13
14
class RequestToFacadeResponseConverter
15
{
16
    private $facade;
17
18
    private $converter;
19
20
    public function __construct(ApiResourceFacade $facade, ClassResourceConverter $converter)
21
    {
22
        $this->facade    = $facade;
23
        $this->converter = $converter;
24
    }
25
26
    public function convertUnknownResourceClassToResponse(ServerRequestInterface $request): ApiResourceFacadeResponse
27
    {
28
        $attributes = $request->getAttributes();
29
        $resourceClass = null;
30
        if (isset($attributes['resourceClass'])) {
31
            $resourceClass = $attributes['resourceClass'];
32
        } else if (isset($attributes['resource_class'])) {
33
            $resourceClass = $attributes['resource_class'];
34
        } else if (isset($attributes['resource'])) {
35
            $resourceClass = $this->converter->denormalize($attributes['resource']);
36
        } else {
37
            throw new RuntimeException('I expect a resourceClass, resource_class or resource routing attribute');
38
        }
39
        return $this->convertRequestToResponse($resourceClass, $request);
40
    }
41
42
    public function convertResourceToResponse(string $resourceClass, $id, ServerRequestInterface $request): ApiResourceFacadeResponse
43
    {
44
        switch ($request->getMethod()) {
45
            case 'GET':
46
                return $this->facade->get($resourceClass, $id, $request);
47
            case 'POST':
48
                return $this->facade->post($resourceClass, $request);
49
            case 'PUT':
50
                return $this->facade->put($resourceClass, $id, $request);
51
            case 'DELETE':
52
                return $this->facade->delete($resourceClass, $id);
53
        }
54
        throw new MethodNotAllowedHttpException(['GET', 'POST', 'PUT', 'DELETE']);
55
    }
56
57
    public function convertRequestToResponse(string $resourceClass, ServerRequestInterface $request): ApiResourceFacadeResponse
58
    {
59
        $attributes = $request->getAttributes();
60
        $hasId = array_key_exists('id', $attributes);
61
        $id = (string) ($attributes['id'] ?? '');
62
        if ($hasId) {
63
            return $this->convertResourceToResponse($resourceClass, $id, $request);
64
        }
65
66
        switch ($request->getMethod()) {
67
            case 'GET':
68
                return $this->facade->getAll($resourceClass, $request);
69
            case 'POST':
70
                return $this->facade->post($resourceClass, $request);
71
        }
72
        throw new MethodNotAllowedHttpException(['GET', 'POST']);
73
    }
74
}
75