StatusCheckRetriever::getSearchFilter()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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