StatusCheckRetriever   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Importance

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

5 Methods

Rating   Name   Duplication   Size   Complexity  
A retrieveAll() 0 17 2
A __construct() 0 3 1
B iterate() 0 22 8
A retrieve() 0 8 3
A getSearchFilter() 0 5 1
1
<?php
2
3
namespace Apie\StatusCheckPlugin\DataLayers;
4
5
use Apie\Core\Exceptions\InvalidClassTypeException;
6
use Apie\Core\Exceptions\ResourceNotFoundException;
7
use Apie\Core\Interfaces\ApiResourceRetrieverInterface;
8
use Apie\Core\Interfaces\SearchFilterProviderInterface;
9
use Apie\Core\Models\ApiResourceClassMetadata;
10
use Apie\Core\SearchFilters\PhpPrimitive;
11
use Apie\Core\SearchFilters\SearchFilter;
12
use Apie\Core\SearchFilters\SearchFilterRequest;
13
use Apie\StatusCheckPlugin\ApiResources\Status;
14
use Apie\StatusCheckPlugin\Pagers\StatusCheckPager;
15
use Apie\StatusCheckPlugin\StatusChecks\StatusCheckInterface;
16
use Apie\StatusCheckPlugin\StatusChecks\StatusCheckListInterface;
17
use CallbackFilterIterator;
18
use Generator;
19
use Pagerfanta\Pagerfanta;
20
use RewindableGenerator;
21
22
/**
23
 * Status check retriever retrieves instances of Status. A status check needs to implement StatusCheckInterface
24
 * or StatusCheckListInterface and sent in the constructor of this method.
25
 */
26
class StatusCheckRetriever implements ApiResourceRetrieverInterface, SearchFilterProviderInterface
27
{
28
    private $statusChecks;
29
30
    /**
31
     * @param (StatusCheckInterface|StatusCheckListInterface)[] $statusChecks
32
     */
33
    public function __construct(iterable $statusChecks)
34
    {
35
        $this->statusChecks = $statusChecks;
36
    }
37
38
    /**
39
     * Iterates over all status checks and creates a generator for it.
40
     *
41
     * @return Generator
42
     */
43
    private function iterate(): Generator
44
    {
45
        foreach ($this->statusChecks as $statusCheck) {
46
            $check = false;
47
            if ($statusCheck instanceof StatusCheckInterface) {
48
                $check = true;
49
                yield $statusCheck->getStatus();
50
            }
51
            if ($statusCheck instanceof StatusCheckListInterface) {
52
                $check = true;
53
                foreach ($statusCheck as $check) {
54
                    if ($check instanceof Status) {
55
                        yield $check;
56
                    } else if ($check instanceof StatusCheckInterface) {
57
                        yield $check->getStatus();
58
                    } else {
59
                        throw new InvalidClassTypeException(get_class($check), 'StatusCheckInterface or Status');
60
                    }
61
                }
62
            }
63
            if (!$check) {
64
                throw new InvalidClassTypeException(get_class($statusCheck), 'StatusCheckInterface or StatusCheckListInterface');
65
            }
66
        }
67
    }
68
69
    /**
70
     * Finds the correct status check or throw a 404 if it could not be found.
71
     *
72
     * @param string $resourceClass
73
     * @param mixed $id
74
     * @param array $context
75
     * @return Status
76
     */
77
    public function retrieve(string $resourceClass, $id, array $context)
78
    {
79
        foreach ($this->iterate() as $statusCheck) {
80
            if ($statusCheck->getId() === $id) {
81
                return $statusCheck;
82
            }
83
        }
84
        throw new ResourceNotFoundException($id);
85
    }
86
87
    /**
88
     * Return all status check results.
89
     *
90
     * @param string $resourceClass
91
     * @param array $context
92
     * @param SearchFilterRequest $searchFilterRequest
93
     * @return Pagerfanta
94
     */
95
    public function retrieveAll(string $resourceClass, array $context, SearchFilterRequest $searchFilterRequest): iterable
96
    {
97
        $iterator = new RewindableGenerator(function () {
98
            return $this->iterate();
99
        });
100
        if (array_key_exists('status', $searchFilterRequest->getSearches())) {
101
            $filter = function (Status $status) use ($searchFilterRequest) {
102
                return $status->getStatus() === $searchFilterRequest->getSearches()['status'];
103
            };
104
            $iterator = new CallbackFilterIterator(
105
                $iterator,
106
                $filter
107
            );
108
        }
109
        $paginator = new Pagerfanta(new StatusCheckPager($iterator));
110
        $searchFilterRequest->updatePaginator($paginator);
111
        return $paginator;
112
    }
113
114
    /**
115
     * Retrieves search filter for an api resource.
116
     *
117
     * @param ApiResourceClassMetadata $classMetadata
118
     * @return SearchFilter
119
     */
120
    public function getSearchFilter(ApiResourceClassMetadata $classMetadata): SearchFilter
121
    {
122
        $res = new SearchFilter();
123
        $res->addPrimitiveSearchFilter('status', PhpPrimitive::STRING);
124
        return $res;
125
    }
126
}
127