Completed
Push — master ( 58e332...227694 )
by Steve
02:48 queued 32s
created

DiceRequestHandler   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 2
Bugs 1 Features 0
Metric Value
wmc 8
c 2
b 1
f 0
lcom 1
cbo 8
dl 0
loc 63
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A getDice() 0 19 4
A writeAppropriateFormatResponse() 0 14 2
A makeDiceTotallyLegit() 0 10 1
1
<?php
2
3
namespace MeadSteve\DiceApi\RequestHandler;
4
5
use MeadSteve\DiceApi\Counters\DiceCounter;
6
use MeadSteve\DiceApi\Dice;
7
use MeadSteve\DiceApi\Dice\DiceGenerator;
8
use MeadSteve\DiceApi\Dice\UncreatableDiceException;
9
use MeadSteve\DiceApi\DiceDecorators\TotallyLegit;
10
use MeadSteve\DiceApi\Renderer\RendererFactory;
11
use MeadSteve\DiceApi\Renderer\UnknownRendererException;
12
use MeadSteve\DiceApi\Renderer\UnrenderableDiceException;
13
use Slim\Http\Request;
14
use Slim\Http\Response;
15
16
class DiceRequestHandler
17
{
18
19
    private $diceGenerator;
20
    private $diceCounter;
21
    private $rendererFactory;
22
23
    public function __construct(
24
        DiceGenerator $diceGenerator,
25
        RendererFactory $rendererFactory,
26
        DiceCounter $diceCounter
27
    ) {
28
        $this->diceGenerator = $diceGenerator;
29
        $this->rendererFactory = $rendererFactory;
30
        $this->diceCounter = $diceCounter;
31
    }
32
33
    public function getDice(Request $request, Response $response, $args)
34
    {
35
        $diceResponse = $response->withHeader("cache-control", "no-cache");
36
        try {
37
            $dice = $this->diceGenerator->diceFromUrlString($args['dice']);
38
            if ($request->hasHeader('totally-legit')) {
39
                $dice = $this->makeDiceTotallyLegit($dice, $request);
40
            }
41
            $diceResponse = $this->writeAppropriateFormatResponse($request, $diceResponse, $dice);
42
            $this->diceCounter->count($dice);
43
        } catch (UncreatableDiceException $creationError) {
44
            $diceResponse = $diceResponse->withStatus(400)
45
                ->write("Unable to roll dice: " . $creationError->getMessage());
46
        } catch (UnrenderableDiceException $renderError) {
47
            $diceResponse = $diceResponse->withStatus(400)
48
                ->write("Unable to render request: " . $renderError->getMessage());
49
        }
50
        return $diceResponse;
51
    }
52
53
    private function writeAppropriateFormatResponse(Request $request, Response $response, $dice)
54
    {
55
        $acceptHeader = $request->getHeader('accept');
56
        $requestedContentType = $acceptHeader[0];
57
        try {
58
            $renderer = $this->rendererFactory->newForAcceptType($requestedContentType);
59
            $responseWithOutput = $response->write($renderer->renderDice($dice))
60
                ->withHeader("Content-Type", $renderer->contentType());
61
        } catch (UnknownRendererException $error) {
62
            $responseWithOutput = $response->withStatus(406);
63
            $responseWithOutput->write("Not sure how to respond with: " . $requestedContentType);
64
        }
65
        return $responseWithOutput;
66
    }
67
68
    private function makeDiceTotallyLegit($dice, Request $request)
69
    {
70
        $rolledValue = $request->getHeader('totally-legit')[0];
71
        return array_map(
72
            function (Dice $dice) use ($rolledValue) {
73
                return new TotallyLegit($dice, (int) $rolledValue);
74
            },
75
            $dice
76
        );
77
    }
78
}
79