Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
81.29% covered (warning)
81.29%
113 / 139
61.54% covered (warning)
61.54%
8 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
Provider
81.29% covered (warning)
81.29%
113 / 139
61.54% covered (warning)
61.54%
8 / 13
56.67
0.00% covered (danger)
0.00%
0 / 1
 readEntity
93.33% covered (success)
93.33%
14 / 15
0.00% covered (danger)
0.00%
0 / 1
5.01
 readEntityById
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
42
 readSourceMapByIds
90.91% covered (success)
90.91%
10 / 11
0.00% covered (danger)
0.00%
0 / 1
3.01
 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
16.67% covered (danger)
16.67%
2 / 12
0.00% covered (danger)
0.00%
0 / 1
26.83
1<?php
2
3namespace BO\Zmsbackend\Provider\Service;
4
5use BO\Zmsbackend\Application as App;
6use BO\Zmsentities\Provider as Entity;
7use BO\Zmsentities\Collection\ProviderList as Collection;
8
9class Provider extends \BO\Zmsbackend\Base
10{
11    public function readEntity($source, $providerId, int $resolveReferences = 0, bool $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 \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\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    /** @psalm-api */
37    public function readEntityById($providerId, $resolveReferences = 0, $disableCache = false)
38    {
39        $cacheKey = "provider-byid-$providerId-$resolveReferences";
40
41        if (!$disableCache && App::$cache && App::$cache->has($cacheKey)) {
42            return App::$cache->get($cacheKey);
43        }
44
45        $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::SELECT);
46        $query
47            ->setResolveLevel($resolveReferences)
48            ->addEntityMapping()
49            ->addResolvedReferences($resolveReferences)
50            ->addConditionProviderId($providerId);
51        $provider = $this->fetchOne($query, new Entity());
52
53        if (App::$cache && $provider->hasId()) {
54            App::$cache->set($cacheKey, $provider);
55        }
56
57        return $provider;
58    }
59
60    /**
61     * @return array<string, string>
62     */
63    public function readSourceMapByIds(array $providerIds): array
64    {
65        if ($providerIds === []) {
66            return [];
67        }
68
69        $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::SELECT);
70        $query
71            ->setResolveLevel(0)
72            ->addEntityMapping()
73            ->addConditionProviderIdList($providerIds);
74
75        $map = [];
76        foreach ($this->readCollection($query) as $provider) {
77            $map[(string) $provider->getId()] = (string) $provider->getSource();
78        }
79
80        return $map;
81    }
82
83    /**
84     * @SuppressWarnings(Param)
85     */
86    protected function readCollection(\BO\Zmsbackend\Provider\Repository\Provider $query): Collection
87    {
88        $providerList = new Collection();
89        $statement = $this->fetchStatement($query);
90        while ($providerData = $statement->fetch(\PDO::FETCH_ASSOC)) {
91            $entity = new Entity($query->postProcessJoins($providerData));
92            $providerList->addEntity($entity);
93        }
94        return $providerList;
95    }
96
97    /**
98     * @param null|true $isAssigned
99     *
100     */
101    public function readListBySource($source, int $resolveReferences = 0, bool|null $isAssigned = null, $requestIdCsv = null)
102    {
103        $this->testSource($source);
104        $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::SELECT);
105        $query->setDistinctSelect();
106        $query->setResolveLevel($resolveReferences);
107        $query->addEntityMapping();
108        $query->addConditionProviderSource($source);
109        if (null !== $isAssigned) {
110            $query->addConditionIsAssigned($isAssigned);
111        }
112        if (null !== $requestIdCsv) {
113            $query->addConditionRequestCsv($requestIdCsv, $source);
114        }
115        $providerList = $this->readCollection($query);
116        return ($providerList->count()) ? $providerList->sortById() : $providerList;
117    }
118
119    public function writeEntity(Entity $entity)
120    {
121        $this->writeDeleteEntity($entity->getId(), $entity->getSource());
122        $contact =  $entity->getContact();
123        if (! $contact->count()) {
124            throw new \BO\Zmsbackend\Provider\Exception\ProviderContactMissed();
125        }
126        $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::INSERT);
127        $additionalData = $entity->getAdditionalData() ?? [];
128
129        $query->addValues([
130            'source' => $entity->getSource(),
131            'id' => $entity->getId(),
132            'name' => $entity->getName(),
133            'parent_id' => $entity->getParentId(),
134            'display_name' => $additionalData && isset($additionalData['displayName'])
135                ? $additionalData['displayName']
136                : $entity->getName(),
137            'contact__city' => $contact->getProperty('city'),
138            'contact__country' => $contact->getProperty('country'),
139            'contact__lat' => $contact->getProperty('lat', 0),
140            'contact__lon' => $contact->getProperty('lon', 0),
141            'contact__postalCode' => (string) $contact->getProperty('postalCode'),
142            'contact__region' => $contact->getProperty('region'),
143            'contact__street' => $contact->getProperty('street'),
144            'contact__streetNumber' => $contact->getProperty('streetNumber', '-'),
145            'link' =>  ($entity->getLink()) ? $entity->getLink() : '',
146            'data' => ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}'
147        ]);
148        $this->writeItem($query);
149
150        $this->removeCache($entity);
151
152        return $this->readEntity($entity->getSource(), $entity->getId(), 0, true);
153    }
154
155    public function writeListBySource(\BO\Zmsentities\Source $source)
156    {
157        $this->writeDeleteListBySource($source->getSource());
158        foreach ($source->getProviderList() as $provider) {
159            $this->writeEntity($provider);
160            $this->removeCache($provider);
161        }
162        return $this->readListBySource($source->getSource());
163    }
164
165    public function writeImportList($providerList, $source = 'dldb')
166    {
167        foreach ($providerList as $provider) {
168            $this->writeImportEntity($provider, $source);
169        }
170        return $this->readListBySource($source, 1);
171    }
172
173    public function writeImportEntity($provider, $source = 'dldb')
174    {
175        if ($provider['address']['postal_code']) {
176            $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::REPLACE);
177            $query->addValues([
178                'source' => $source,
179                'id' => $provider['id'],
180                'name' => $provider['name'],
181                'display_name' => $provider['displayName'] ?? $provider['name'],
182                'contact__city' => $provider['address']['city'],
183                'contact__country' => $provider['address']['city'],
184                'contact__lat' => $provider['geo']['lat'],
185                'contact__lon' => $provider['geo']['lon'],
186                'contact__postalCode' => (string) $provider['address']['postal_code'],
187                'contact__region' => $provider['address']['city'],
188                'contact__street' => $provider['address']['street'],
189                'contact__streetNumber' => $provider['address']['house_number'],
190                'link' => ('dldb' == $source)
191                    ? 'https://service.berlin.de/standort/' . $provider['id'] . '/'
192                    : ((isset($provider['link'])) ? $provider['link'] : ''),
193                'data' => json_encode($provider)
194            ]);
195            $this->writeItem($query);
196            $provider = $this->readEntity($source, $provider['id'], 0, true);
197        }
198        return $provider;
199    }
200
201    public function writeDeleteEntity($providerId, $source): bool
202    {
203        $provider = $this->readEntity($source, $providerId);
204        $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::DELETE);
205        $query->addConditionProviderId($providerId);
206        $query->addConditionProviderSource($source);
207        $this->removeCache($provider);
208        return $this->deleteItem($query);
209    }
210
211    public function writeDeleteListBySource(string $source): bool
212    {
213        $query = new \BO\Zmsbackend\Provider\Repository\Provider(\BO\Zmsbackend\Query\Base::DELETE);
214        $query->addConditionProviderSource($source);
215        return $this->deleteItem($query);
216    }
217
218    /**
219     * @return void
220     */
221    protected function testSource($source)
222    {
223        if (! (new \BO\Zmsbackend\Source\Service\Source())->readEntity($source)) {
224            throw new \BO\Zmsbackend\Source\Exception\UnknownDataSource();
225        }
226    }
227
228    /**
229     * @return void
230     */
231    public function removeCache(Entity $provider)
232    {
233        if (!App::$cache || !isset($provider->id)) {
234            return;
235        }
236
237        $source = $provider->getSource();
238        $providerId = $provider->getId();
239
240        foreach ([0, 1, 2] as $resolveReferences) {
241            foreach (
242                [
243                    "provider-$source-$providerId-$resolveReferences",
244                    "provider-byid-$providerId-$resolveReferences",
245                    "request-$source-$providerId-$resolveReferences",
246                ] as $key
247            ) {
248                if (App::$cache->has($key)) {
249                    App::$cache->delete($key);
250                }
251            }
252        }
253    }
254}