RequestToFacadeResponseConverter   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 37
c 1
b 0
f 0
dl 0
loc 59
rs 10
wmc 14

4 Methods

Rating   Name   Duplication   Size   Complexity  
A convertUnknownResourceClassToResponse() 0 14 4
A __construct() 0 4 1
A convertResourceToResponse() 0 13 5
A convertRequestToResponse() 0 16 4
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