Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.90% covered (success)
97.90%
140 / 143
93.33% covered (success)
93.33%
14 / 15
CRAP
0.00% covered (danger)
0.00%
0 / 1
Request
97.90% covered (success)
97.90%
140 / 143
93.33% covered (success)
93.33%
14 / 15
47
0.00% covered (danger)
0.00%
0 / 1
 readEntity
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
6
 readCollection
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 readRequestByProcessId
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 readRequestsByIds
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 readRequestByArchiveId
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 readListByProvider
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
2
 readListBySource
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
6
 readListByCluster
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
5
 writeEntity
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
2
 writeListBySource
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 writeImportEntity
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
4
 writeDeleteEntity
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 writeDeleteListBySource
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 testSource
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 removeCache
82.35% covered (warning)
82.35%
14 / 17
0.00% covered (danger)
0.00%
0 / 1
9.45
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsdb\Application as App;
6use BO\Zmsentities\Request as Entity;
7use BO\Zmsentities\Collection\RequestList as Collection;
8
9/**
10 *
11 * @SuppressWarnings(TooManyPublicMethods)
12 */
13class Request extends Base
14{
15    public function readEntity($source, $requestId, $resolveReferences = 0, $disableCache = false)
16    {
17        $cacheKey = "request-$source-$requestId-$resolveReferences";
18
19        if (!$disableCache && App::$cache && App::$cache->has($cacheKey)) {
20            return App::$cache->get($cacheKey);
21        }
22
23        $this->testSource($source);
24        $query = new Query\Request(Query\Base::SELECT);
25        $query
26            ->setResolveLevel($resolveReferences)
27            ->addEntityMapping()
28            ->addResolvedReferences($resolveReferences)
29            ->addConditionRequestSource($source)
30            ->addConditionRequestId($requestId);
31        $request = $this->fetchOne($query, new Entity());
32        if (! $request->hasId()) {
33            throw new Exception\Request\RequestNotFound("Could not find request with ID $source/$requestId");
34        }
35
36        if (App::$cache) {
37            App::$cache->set($cacheKey, $request);
38        }
39
40        return $request;
41    }
42
43    /**
44     * @SuppressWarnings(Param)
45     *
46     */
47    protected function readCollection($query)
48    {
49        $requestList = new Collection();
50        $statement = $this->fetchStatement($query);
51        while ($requestData = $statement->fetch(\PDO::FETCH_ASSOC)) {
52            $request = new Entity($query->postProcessJoins($requestData));
53            $requestList->addEntity($request);
54        }
55        return $requestList;
56    }
57
58    public function readRequestByProcessId($processId, $resolveReferences = 0)
59    {
60        $collection = new Collection();
61        if ($processId) {
62            $query = new Query\Request(Query\Base::SELECT);
63            $query->setResolveLevel($resolveReferences);
64            $query->addConditionProcessId($processId);
65            $query->addEntityMapping();
66            $collection = $this->readCollection($query);
67        }
68        return $collection;
69    }
70
71    public function readRequestsByIds($ids, $resolveReferences = 0)
72    {
73        $query = new Query\Request(Query\Base::SELECT);
74        $query->setResolveLevel($resolveReferences);
75        $query->addConditionIds($ids);
76        $query->addEntityMapping();
77
78        return $this->readCollection($query);
79    }
80
81    public function readRequestByArchiveId($archiveId, $resolveReferences = 0)
82    {
83        $collection = new Collection();
84        if ($archiveId) {
85            $query = new Query\Request(Query\Base::SELECT);
86            $query->setResolveLevel($resolveReferences);
87            $query->addConditionArchiveId($archiveId);
88            $query->addEntityMapping();
89            $collection = $this->readCollection($query);
90        }
91        return $collection;
92    }
93
94    public function readListByProvider($source, $providerId, $resolveReferences = 0)
95    {
96        $this->testSource($source);
97        $query = new Query\Request(Query\Base::SELECT);
98        $requestRelationQuery = new RequestRelation();
99        $query->setResolveLevel($resolveReferences);
100        $query->addConditionProvider($providerId, $source);
101        $query->addConditionRequestSource($source);
102        $query->addEntityMapping();
103        $requestList = $this->readCollection($query);
104        foreach ($requestList as $request) {
105            $requestRelation = $requestRelationQuery->readEntity($request->getId(), $providerId);
106            $request['timeSlotCount'] = $requestRelation->getSlotCount();
107        }
108        return $requestList;
109    }
110
111    public function readListBySource($source, $resolveReferences = 0, $disableCache = false)
112    {
113        $cacheKey = "requestReadListBySource-$source-$resolveReferences";
114
115        if (!$disableCache && App::$cache && App::$cache->has($cacheKey)) {
116            return App::$cache->get($cacheKey);
117        }
118
119        $this->testSource($source);
120        $query = new Query\Request(Query\Base::SELECT);
121        $query->setResolveLevel($resolveReferences);
122        $query->addConditionRequestSource($source);
123        $query->addEntityMapping();
124        $requestList = $this->readCollection($query);
125        $requestList = ($requestList->count()) ? $requestList->sortByCustomKey('id') : $requestList;
126
127        if (App::$cache) {
128            App::$cache->set($cacheKey, $requestList);
129        }
130
131        return $requestList;
132    }
133
134    public function readListByCluster(\BO\Zmsentities\Cluster $cluster, $resolveReferences = 0)
135    {
136        $intersectList = array();
137        if ($cluster->scopes->count()) {
138            foreach ($cluster->scopes as $scope) {
139                $requestsByProvider = $this
140                    ->readListByProvider(
141                        $scope->provider['source'],
142                        $scope->getProviderId(),
143                        $resolveReferences - 1
144                    )->getArrayCopy();
145                if (count($requestsByProvider)) {
146                    $intersectList = (count($intersectList)) ?
147                        array_values(array_intersect($intersectList, $requestsByProvider)) : $requestsByProvider;
148                }
149            }
150        }
151        $requestList = new Collection($intersectList);
152        return $requestList;
153    }
154
155    public function writeEntity(Entity $entity)
156    {
157        $additionalData = ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}';
158        $this->writeDeleteEntity($entity->getId(), $entity->getSource());
159        $query = new Query\Request(Query\Base::INSERT);
160        $query->addValues([
161            'source' => $entity->getSource(),
162            'id' => $entity->getId(),
163            'name' => $entity->getName(),
164            'parent_id' => $entity->getParentId(),
165            'group' => $entity->getGroup(),
166            'link' =>  $entity->getLink(),
167            'data' => $additionalData,
168            'variant_id' => $entity->getVariantId()
169        ]);
170        $this->writeItem($query);
171
172        $this->removeCache($entity);
173
174        return $this->readEntity($entity->getSource(), $entity->getId());
175    }
176
177    public function writeListBySource(\BO\Zmsentities\Source $source)
178    {
179        $this->writeDeleteListBySource($source->getSource());
180        foreach ($source->getRequestList() as $request) {
181            $this->writeEntity($request);
182            $this->removeCache($request);
183        }
184        return $this->readListBySource($source->getSource());
185    }
186
187    public function writeImportEntity($request, $source = 'dldb')
188    {
189        $query = new Query\Request(Query\Base::REPLACE);
190        $query->addValues([
191            'source' => $source,
192            'id' => $request['id'],
193            'name' => $request['name'],
194            'group' => (isset($request['group'])) ? $request['group'] : 'Sonstiges',
195            'link' => ('dldb' == $source)
196                ? 'https://service.berlin.de/dienstleistung/' . $request['id'] . '/'
197                : ((isset($request['link'])) ? $request['link'] : ''),
198            'data' => json_encode($request)
199        ]);
200        $this->writeItem($query);
201        return $this->readEntity($source, $request['id'], 0, true);
202    }
203
204    public function writeDeleteEntity($requestId, $source)
205    {
206        $query = new Query\Request(Query\Base::DELETE);
207        $query->addConditionRequestId($requestId);
208        $query->addConditionRequestSource($source);
209
210        return $this->deleteItem($query);
211    }
212
213    public function writeDeleteListBySource($source)
214    {
215        $query = new Query\Request(Query\Base::DELETE);
216        $query->addConditionRequestSource($source);
217        return $this->deleteItem($query);
218    }
219
220    protected function testSource($source)
221    {
222        if (! (new Source())->readEntity($source)) {
223            throw new Exception\Source\UnknownDataSource();
224        }
225    }
226
227    public function removeCache(Entity $request)
228    {
229        if (!App::$cache) {
230            return;
231        }
232
233        $source = $request->getSource();
234
235        if (isset($request->id)) {
236            $requestId = $request->getId();
237            if (App::$cache->has("request-$source-$requestId-0")) {
238                App::$cache->delete("request-$source-$requestId-0");
239            }
240
241            if (App::$cache->has("request-$source-$requestId-1")) {
242                App::$cache->delete("request-$source-$requestId-1");
243            }
244
245            if (App::$cache->has("request-$source-$requestId-2")) {
246                App::$cache->delete("request-$source-$requestId-2");
247            }
248        }
249
250        if (App::$cache->has("requestReadListBySource-$source-0")) {
251            App::$cache->delete("requestReadListBySource-$source-0");
252        }
253
254        if (App::$cache->has("requestReadListBySource-$source-1")) {
255            App::$cache->delete("requestReadListBySource-$source-1");
256        }
257
258        if (App::$cache->has("requestReadListBySource-$source-2")) {
259            App::$cache->delete("requestReadListBySource-$source-2");
260        }
261    }
262}