Completed
Push — master ( fc2b8b...a482e0 )
by Sebastian
03:04
created

Framework::createInstance()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
c 0
b 0
f 0
rs 9.4285
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
namespace Kartenmacherei\RestFramework;
3
4
use Kartenmacherei\RestFramework\Action\NoMoreLocatorsException;
5
use Kartenmacherei\RestFramework\Request\Request;
6
use Kartenmacherei\RestFramework\Request\UnauthorizedException;
7
use Kartenmacherei\RestFramework\ResourceRequest\BadRequestException;
8
use Kartenmacherei\RestFramework\ResourceRequest\ResourceRequestHandler;
9
use Kartenmacherei\RestFramework\Response\BadRequestResponse;
10
use Kartenmacherei\RestFramework\Response\MethodNotAllowedResponse;
11
use Kartenmacherei\RestFramework\Response\NotFoundResponse;
12
use Kartenmacherei\RestFramework\Response\Response;
13
use Kartenmacherei\RestFramework\Response\UnauthorizedResponse;
14
use Kartenmacherei\RestFramework\RestResource\RestResource;
15
use Kartenmacherei\RestFramework\Router\NoMoreRoutersException;
16
use Kartenmacherei\RestFramework\Router\RouterChain;
17
18
class Framework
19
{
20
    /**
21
     * @var RouterChain
22
     */
23
    private $chainRouter;
24
25
    /**
26
     * @var ResourceRequestHandler
27
     */
28
    private $resourceRequestHandler;
29
30
    /**
31
     * @param RouterChain $chainRouter
32
     * @param ResourceRequestHandler $resourceRequestHandler
33
     */
34
    public function __construct(RouterChain $chainRouter, ResourceRequestHandler $resourceRequestHandler)
35
    {
36
        $this->chainRouter = $chainRouter;
37
        $this->resourceRequestHandler = $resourceRequestHandler;
38
    }
39
40
    /**
41
     * @return Framework
42
     */
43
    public static function createInstance(): Framework
44
    {
45
        $factory = new Factory();
46
        return new self($factory->createRouterChain(), $factory->createResourceRequestHandler());
47
    }
48
49
    /**
50
     * @param RestResource $restResource
51
     */
52
    public function registerResource(RestResource $restResource)
53
    {
54
        $this->chainRouter->addRouter($restResource->getRouter());
55
        if ($restResource->hasQueryLocator()) {
56
            $this->resourceRequestHandler->registerQueryLocator(
57
                $restResource->getQueryLocator()
58
            );
59
        }
60
        if ($restResource->hasCommandLocator()) {
61
            $this->resourceRequestHandler->registerCommandLocator(
62
                $restResource->getCommandLocator()
63
            );
64
        }
65
    }
66
67
    /**
68
     * @param Request $request
69
     *
70
     * @return Response
71
     */
72
    public function run(Request $request): Response
73
    {
74
        try {
75
            $resourceRequest = $this->chainRouter->route($request);
76
            return $this->resourceRequestHandler->handle($resourceRequest);
77
        } catch (NoMoreLocatorsException $e) {
78
            return new MethodNotAllowedResponse();
79
        } catch (NoMoreRoutersException $e) {
80
            return new NotFoundResponse();
81
        } catch (UnauthorizedException $e) {
82
            return new UnauthorizedResponse();
83
        } catch (BadRequestException $e) {
84
            return new BadRequestResponse($e);
85
        }
86
    }
87
}
88