Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.40% covered (success)
97.40%
75 / 77
75.00% covered (warning)
75.00%
6 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Source
97.40% covered (success)
97.40%
75 / 77
75.00% covered (warning)
75.00%
6 / 8
26
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
7
 readList
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
4
 readResolvedReferences
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
2
 writeEntity
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
4.00
 writeInsertRelations
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 writeDeleteBySource
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 writeDeleteRelations
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 removeCache
87.50% covered (warning)
87.50%
7 / 8
0.00% covered (danger)
0.00%
0 / 1
5.05
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsdb\Application as App;
6use BO\Zmsentities\Collection\ScopeList;
7use BO\Zmsentities\Source as Entity;
8use BO\Zmsentities\Collection\SourceList as Collection;
9use BO\Zmsentities\Collection\ProviderList;
10use BO\Zmsentities\Collection\RequestList;
11use BO\Zmsentities\Collection\RequestRelationList;
12
13/**
14 *
15 * @SuppressWarnings(Coupling)
16 *
17 */
18class Source extends Base
19{
20    /**
21     * Fetch source from db
22     *
23     * @return \BO\Zmsentities\Source
24     */
25    public function readEntity($sourceName, $resolveReferences = 0, $disableCache = false)
26    {
27        $cacheKey = "source-$sourceName-$resolveReferences";
28
29        if (!$disableCache && App::$cache && App::$cache->has($cacheKey)) {
30            $entity = App::$cache->get($cacheKey);
31        }
32
33        if (empty($entity)) {
34            $query = new Query\Source(Query\Base::SELECT);
35            $query
36                ->addEntityMapping()
37                ->addResolvedReferences($resolveReferences)
38                ->addConditionSource($sourceName);
39            $entity = $this->fetchOne($query, new Entity());
40            if (! $entity->hasId()) {
41                return null;
42            }
43
44            if (App::$cache) {
45                App::$cache->set($cacheKey, $entity);
46            }
47        }
48
49        return $this->readResolvedReferences($entity, $resolveReferences, $disableCache);
50    }
51
52    /**
53     * read a list of sources
54     *
55     * @return \BO\Zmsentities\Collection\SourceList
56     */
57    public function readList($resolveReferences = 0)
58    {
59        $collection = new Collection();
60        $query = new Query\Source(Query\Base::SELECT);
61        $query->addEntityMapping()
62            ->addResolvedReferences($resolveReferences);
63        $result = $this->fetchList($query, new Entity());
64        if (count($result)) {
65            foreach ($result as $entity) {
66                if ($entity instanceof Entity) {
67                    $entity = $this->readResolvedReferences($entity, $resolveReferences);
68                    $collection->addEntity($entity);
69                }
70            }
71        }
72        return $collection;
73    }
74
75    /**
76     * resolve entity references
77     *
78     * @return \BO\Zmsentities\Source
79     */
80    #[\Override]
81    public function readResolvedReferences(
82        \BO\Zmsentities\Schema\Entity $entity,
83        $resolveReferences,
84        $disableCache = false
85    ) {
86        if (0 < $resolveReferences) {
87            $entity['providers'] = (new ProviderList())
88                ->addList((new Provider())->readListBySource($entity->source, $resolveReferences - 1));
89            $entity['requests'] = (new RequestList())
90                ->addList((new Request())->readListBySource(
91                    $entity->source,
92                    $resolveReferences - 1,
93                    $disableCache
94                ));
95            $entity['requestrelation'] = (new RequestRelationList())
96                ->addList((new RequestRelation())->readListBySource($entity->source));
97            $entity['scopes'] = (new ScopeList())
98                ->addList((new Scope())->readList($disableCache));
99        }
100
101        return $entity;
102    }
103
104    /**
105     * write or update a source
106     *
107     * @return \BO\Zmsentities\Source
108     */
109    public function writeEntity(Entity $entity, $resolveReferences = 0)
110    {
111        if (! $entity->isCompleteAndEditable()) {
112            throw new Exception\Source\SourceInvalidInput();
113        }
114        $this->writeDeleteBySource($entity->getSource());
115        $query = new Query\Source(Query\Base::INSERT);
116        $query->addValues(
117            array(
118                'source' => $entity->getSource(),
119                'label' => $entity->getLabel(),
120                'editable' => ($entity->isEditable()) ? 1 : 0,
121                'contact__name' => $entity->contact['name'],
122                'contact__email' => $entity->contact['email']
123            )
124        );
125        if ($this->writeItem($query)) {
126            $this->writeInsertRelations($entity);
127        }
128
129        $this->removeCache($entity->getSource());
130
131        return $this->readEntity($entity->getSource(), $resolveReferences, true);
132    }
133
134    /**
135     * delete provider and request relations of source
136     *
137     */
138    public function writeInsertRelations(\BO\Zmsentities\Source $entity)
139    {
140        (new Provider())->writeListBySource($entity);
141        (new Request())->writeListBySource($entity);
142        (new RequestRelation())->writeListBySource($entity);
143    }
144
145    /**
146     * delete by sourcename
147     *
148     * @return \BO\Zmsentities\Source
149     */
150    public function writeDeleteBySource($sourceName)
151    {
152        $entity = $this->readEntity($sourceName);
153        $query = new Query\Source(Query\Base::DELETE);
154        $query->addConditionSource($sourceName);
155        $this->writeDeleteRelations($sourceName);
156
157        $this->removeCache($sourceName);
158
159        return ($this->deleteItem($query)) ? $entity : null;
160    }
161
162    /**
163     * delete provider and request relations of source
164     *
165     */
166    public function writeDeleteRelations($sourceName)
167    {
168        (new Provider())->writeDeleteListBySource($sourceName);
169        (new Request())->writeDeleteListBySource($sourceName);
170        (new RequestRelation())->writeDeleteListBySource($sourceName);
171    }
172
173    public function removeCache($sourceName)
174    {
175        if (!App::$cache) {
176            return;
177        }
178
179        if (App::$cache->has("source-$sourceName-0")) {
180            App::$cache->delete("source-$sourceName-0");
181        }
182
183        if (App::$cache->has("source-$sourceName-1")) {
184            App::$cache->delete("source-$sourceName-1");
185        }
186
187        if (App::$cache->has("source-$sourceName-2")) {
188            App::$cache->delete("source-$sourceName-2");
189        }
190    }
191}