UIValidationCollectionException   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 2
dl 0
loc 78
ccs 16
cts 16
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 2
A add() 0 4 1
A normalize() 0 10 2
A guardAgainstNoUIValidationException() 0 6 2
1
<?php
2
declare(strict_types = 1);
3
4
namespace Imedia\Ammit\UI\Resolver\Exception;
5
6
/**
7
 * UI Validation Exception Collection
8
 *
9
 * @author Guillaume MOREL <[email protected]>
10
 */
11
class UIValidationCollectionException extends AbstractNormalizableCommandResolverException
12
{
13
    /** @var UIValidationException[] */
14
    private $uiValidationExceptions = [];
15
16
    /**
17
     * @param UIValidationException[] $uiValidationExceptions
18
     */
19
    public function __construct(array $uiValidationExceptions)
20
    {
21 1
        $this->guardAgainstNoUIValidationException($uiValidationExceptions);
22
23 1
        parent::__construct(
24 1
            'Command Resolver UI Validation Exception',
25 1
            'collection'
26
        );
27
28 1
        foreach ($uiValidationExceptions as $uiValidationException) {
29 1
            $this->add($uiValidationException);
30
        }
31 1
    }
32
33
    private function add(UIValidationException $uiValidationException)
34
    {
35 1
        $this->uiValidationExceptions[] = $uiValidationException;
36 1
    }
37
38
    /**
39
     * @inheritdoc
40
     * See http://jsonapi.org/examples/#error-objects-basics
41
     * Example:
42
     * {
43
     *   "errors": [
44
     *     {
45
     *       "status": "403",
46
     *       "source": { "pointer": "/data/attributes/secret-powers" },
47
     *       "detail": "Editing secret powers is not authorized on Sundays."
48
     *     },
49
     *     {
50
     *      "source": { "parameter": "include" },
51
     *      "title":  "Invalid Query Parameter",
52
     *      "detail": "The resource does not have an `auther` relationship path."
53
     *     },
54
     *     {
55
     *       "status": "422",
56
     *       "source": { "pointer": "/data/attributes/volume" },
57
     *       "detail": "Volume does not, in fact, go to 11."
58
     *     },
59
     *     {
60
     *       "status": "500",
61
     *       "source": { "pointer": "/data/attributes/reputation" },
62
     *       "title": "The backend responded with an error",
63
     *       "detail": "Reputation service not responding after three requests."
64
     *     }
65
     *   ]
66
     * }
67
     */
68
    public function normalize(): array
69
    {
70 1
        $normalizedExceptions = ['errors' => []];
71
72 1
        foreach ($this->uiValidationExceptions as $exception) {
73 1
            $normalizedExceptions['errors'][] = $exception->normalize();
74
        }
75
76 1
        return $normalizedExceptions;
77
    }
78
79
    /**
80
     * @param UIValidationException[] $uiValidationExceptions
81
     */
82
    private function guardAgainstNoUIValidationException(array $uiValidationExceptions)
83
    {
84 1
        if (empty($uiValidationExceptions)) {
85 1
            throw new \LogicException('Can\'t create a UIValidationCollectionException without UIValidationException.');
86
        }
87 1
    }
88
}
89