Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.58% covered (success)
95.58%
108 / 113
81.82% covered (warning)
81.82%
9 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
Provider
95.58% covered (success)
95.58%
108 / 113
81.82% covered (warning)
81.82%
9 / 11
35
0.00% covered (danger)
0.00%
0 / 1
 readEntity
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
5
 readCollection
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 readListBySource
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
4
 writeEntity
96.43% covered (success)
96.43%
27 / 28
0.00% covered (danger)
0.00%
0 / 1
6
 writeListBySource
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 writeImportList
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 writeImportEntity
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
4
 writeDeleteEntity
100.00% covered (success)
100.00%
6 / 6
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
60.00% covered (warning)
60.00%
6 / 10
0.00% covered (danger)
0.00%
0 / 1
8.30
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsdb\Application as App;
6use BO\Zmsentities\Provider as Entity;
7use BO\Zmsentities\Collection\ProviderList as Collection;
8
9class Provider extends Base
10{
11    public function readEntity($source, $providerId, $resolveReferences = 0, $disableCache = false)
12    {
13        $cacheKey = "provider-$source-$providerId-$resolveReferences";
14
15        if (!$disableCache && App::$cache && App::$cache->has($cacheKey)) {
16            return App::$cache->get($cacheKey);
17        }
18
19        $this->testSource($source);
20        $query = new Query\Provider(Query\Base::SELECT);
21        $query
22            ->setResolveLevel($resolveReferences)
23            ->addEntityMapping()
24            ->addResolvedReferences($resolveReferences)
25            ->addConditionProviderSource($source)
26            ->addConditionProviderId($providerId);
27        $provider = $this->fetchOne($query, new Entity());
28
29        if (App::$cache) {
30            App::$cache->set($cacheKey, $provider);
31        }
32
33        return $provider;
34    }
35
36    /**
37     * @SuppressWarnings(Param)
38     *
39     */
40    protected function readCollection($query)
41    {
42        $providerList = new Collection();
43        $statement = $this->fetchStatement($query);
44        while ($providerData = $statement->fetch(\PDO::FETCH_ASSOC)) {
45            $entity = new Entity($query->postProcessJoins($providerData));
46            $providerList->addEntity($entity);
47        }
48        return $providerList;
49    }
50
51    public function readListBySource($source, $resolveReferences = 0, $isAssigned = null, $requestIdCsv = null)
52    {
53        $this->testSource($source);
54        $query = new Query\Provider(Query\Base::SELECT);
55        $query->setDistinctSelect();
56        $query->setResolveLevel($resolveReferences);
57        $query->addEntityMapping();
58        $query->addConditionProviderSource($source);
59        if (null !== $isAssigned) {
60            $query->addConditionIsAssigned($isAssigned);
61        }
62        if (null !== $requestIdCsv) {
63            $query->addConditionRequestCsv($requestIdCsv, $source);
64        }
65        $providerList = $this->readCollection($query);
66        return ($providerList->count()) ? $providerList->sortById() : $providerList;
67    }
68
69    public function writeEntity(Entity $entity)
70    {
71        $this->writeDeleteEntity($entity->getId(), $entity->getSource());
72        $contact =  $entity->getContact();
73        if (! $contact->count()) {
74            throw new Exception\Provider\ProviderContactMissed();
75        }
76        $query = new Query\Provider(Query\Base::INSERT);
77        $additionalData = $entity->getAdditionalData() ?? [];
78
79        $query->addValues([
80            'source' => $entity->getSource(),
81            'id' => $entity->getId(),
82            'name' => $entity->getName(),
83            'parent_id' => $entity->getParentId(),
84            'display_name' => $additionalData && isset($additionalData['displayName'])
85                ? $additionalData['displayName']
86                : $entity->getName(),
87            'contact__city' => $contact->getProperty('city'),
88            'contact__country' => $contact->getProperty('country'),
89            'contact__lat' => $contact->getProperty('lat', 0),
90            'contact__lon' => $contact->getProperty('lon', 0),
91            'contact__postalCode' => intval($contact->getProperty('postalCode')),
92            'contact__region' => $contact->getProperty('region'),
93            'contact__street' => $contact->getProperty('street'),
94            'contact__streetNumber' => $contact->getProperty('streetNumber', '-'),
95            'link' =>  ($entity->getLink()) ? $entity->getLink() : '',
96            'data' => ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}'
97        ]);
98        $this->writeItem($query);
99
100        $this->removeCache($entity);
101
102        return $this->readEntity($entity->getSource(), $entity->getId(), 0, true);
103    }
104
105    public function writeListBySource(\BO\Zmsentities\Source $source)
106    {
107        $this->writeDeleteListBySource($source->getSource());
108        foreach ($source->getProviderList() as $provider) {
109            $this->writeEntity($provider);
110            $this->removeCache($provider);
111        }
112        return $this->readListBySource($source->getSource());
113    }
114
115    public function writeImportList($providerList, $source = 'dldb')
116    {
117        foreach ($providerList as $provider) {
118            $this->writeImportEntity($provider, $source);
119        }
120        return $this->readListBySource($source, 1);
121    }
122
123    public function writeImportEntity($provider, $source = 'dldb')
124    {
125        if ($provider['address']['postal_code']) {
126            $query = new Query\Provider(Query\Base::REPLACE);
127            $query->addValues([
128                'source' => $source,
129                'id' => $provider['id'],
130                'name' => $provider['name'],
131                'display_name' => $provider['displayName'] ?? $provider['name'],
132                'contact__city' => $provider['address']['city'],
133                'contact__country' => $provider['address']['city'],
134                'contact__lat' => $provider['geo']['lat'],
135                'contact__lon' => $provider['geo']['lon'],
136                'contact__postalCode' => intval($provider['address']['postal_code']),
137                'contact__region' => $provider['address']['city'],
138                'contact__street' => $provider['address']['street'],
139                'contact__streetNumber' => $provider['address']['house_number'],
140                'link' => ('dldb' == $source)
141                    ? 'https://service.berlin.de/standort/' . $provider['id'] . '/'
142                    : ((isset($provider['link'])) ? $provider['link'] : ''),
143                'data' => json_encode($provider)
144            ]);
145            $this->writeItem($query);
146            $provider = $this->readEntity($source, $provider['id'], 0, true);
147        }
148        return $provider;
149    }
150
151    public function writeDeleteEntity($providerId, $source)
152    {
153        $provider = $this->readEntity($source, $providerId);
154        $query = new Query\Provider(Query\Base::DELETE);
155        $query->addConditionProviderId($providerId);
156        $query->addConditionProviderSource($source);
157        $this->removeCache($provider);
158        return $this->deleteItem($query);
159    }
160
161    public function writeDeleteListBySource($source)
162    {
163        $query = new Query\Provider(Query\Base::DELETE);
164        $query->addConditionProviderSource($source);
165        return $this->deleteItem($query);
166    }
167
168    protected function testSource($source)
169    {
170        if (! (new Source())->readEntity($source)) {
171            throw new Exception\Source\UnknownDataSource();
172        }
173    }
174
175    public function removeCache(Entity $provider)
176    {
177        if (!App::$cache || !isset($provider->id)) {
178            return;
179        }
180
181        $source = $provider->getSource();
182        $providerId = $provider->getId();
183
184        if (App::$cache->has("request-$source-$providerId-0")) {
185            App::$cache->delete("request-$source-$providerId-0");
186        }
187
188        if (App::$cache->has("request-$source-$providerId-1")) {
189            App::$cache->delete("request-$source-$providerId-1");
190        }
191
192        if (App::$cache->has("request-$source-$providerId-2")) {
193            App::$cache->delete("request-$source-$providerId-2");
194        }
195    }
196}