Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
61.64% |
98 / 159 |
|
70.00% |
14 / 20 |
CRAP | |
0.00% |
0 / 1 |
Useraccount | |
61.64% |
98 / 159 |
|
70.00% |
14 / 20 |
178.10 | |
0.00% |
0 / 1 |
readIsUserExisting | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
3 | |||
readEntity | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
1 | |||
readResolvedReferences | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
3 | |||
readList | |
100.00% |
9 / 9 |
|
100.00% |
1 / 1 |
3 | |||
readListStatement | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
6 | |||
readAssignedDepartmentList | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
4 | |||
readEntityByAuthKey | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
2 | |||
readEntityByUserId | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
2 | |||
readCollectionByDepartmentId | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
3 | |||
readCollectionByDepartmentIds | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
30 | |||
writeEntity | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
2 | |||
writeUpdatedEntity | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
1 | |||
deleteEntity | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
updateAssignedDepartments | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
3 | |||
readEntityIdByLoginName | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
deleteAssignedDepartments | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
readSearch | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
12 | |||
readSearchByDepartmentId | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
12 | |||
readListRole | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
6 | |||
readListByRoleAndDepartment | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
12 |
1 | <?php |
2 | |
3 | namespace BO\Zmsdb; |
4 | |
5 | use BO\Zmsentities\Useraccount as Entity; |
6 | use BO\Zmsentities\Collection\UseraccountList as Collection; |
7 | |
8 | /** |
9 | * @SuppressWarnings(Public) |
10 | * |
11 | */ |
12 | class Useraccount extends Base |
13 | { |
14 | public function readIsUserExisting($loginName, $password = false) |
15 | { |
16 | $query = new Query\Useraccount(Query\Base::SELECT); |
17 | $query->addEntityMapping() |
18 | ->setResolveLevel(0) |
19 | ->addConditionLoginName($loginName); |
20 | if ($password) { |
21 | $query->addConditionPassword($password); |
22 | } |
23 | $useraccount = $this->fetchOne($query, new Entity()); |
24 | return ($useraccount->hasId()) ? true : false; |
25 | } |
26 | |
27 | public function readEntity($loginname, $resolveReferences = 1) |
28 | { |
29 | $query = new Query\Useraccount(Query\Base::SELECT); |
30 | $query->addEntityMapping() |
31 | ->addResolvedReferences($resolveReferences) |
32 | ->addConditionLoginName($loginname); |
33 | $useraccount = $this->fetchOne($query, new Entity()); |
34 | return $this->readResolvedReferences($useraccount, $resolveReferences); |
35 | } |
36 | |
37 | public function readResolvedReferences(\BO\Zmsentities\Schema\Entity $useraccount, $resolveReferences) |
38 | { |
39 | if (0 < $resolveReferences && $useraccount->toProperty()->id->get()) { |
40 | $useraccount->departments = $this->readAssignedDepartmentList($useraccount, $resolveReferences); |
41 | } |
42 | return $useraccount; |
43 | } |
44 | |
45 | /** |
46 | * read list of useraccounts |
47 | * |
48 | * @param |
49 | * resolveReferences |
50 | * |
51 | * @return Resource Collection |
52 | */ |
53 | public function readList($resolveReferences = 0) |
54 | { |
55 | $collection = new Collection(); |
56 | $query = new Query\Useraccount(Query\Base::SELECT); |
57 | $query->addResolvedReferences($resolveReferences) |
58 | ->addEntityMapping(); |
59 | $result = $this->fetchList($query, new Entity()); |
60 | if (count($result)) { |
61 | foreach ($result as $entity) { |
62 | $collection->addEntity($this->readResolvedReferences($entity, $resolveReferences)); |
63 | } |
64 | } |
65 | return $collection; |
66 | } |
67 | |
68 | protected function readListStatement($statement, $resolveReferences) |
69 | { |
70 | $query = new Query\Useraccount(Query\Base::SELECT); |
71 | $collection = new Collection(); |
72 | while ($userAccountData = $statement->fetch(\PDO::FETCH_ASSOC)) { |
73 | $entity = new Entity($query->postProcessJoins($userAccountData)); |
74 | $entity = $this->readResolvedReferences($entity, $resolveReferences); |
75 | $collection->addEntity($entity); |
76 | } |
77 | return $collection; |
78 | } |
79 | |
80 | /** |
81 | * read list assigned departments |
82 | * |
83 | * @param |
84 | * resolveReferences |
85 | * |
86 | * @return Resource Collection |
87 | */ |
88 | public function readAssignedDepartmentList($useraccount, $resolveReferences = 0) |
89 | { |
90 | if ($useraccount->isSuperUser()) { |
91 | $query = Query\Useraccount::QUERY_READ_SUPERUSER_DEPARTMENTS; |
92 | $departmentIds = $this->getReader()->fetchAll($query); |
93 | } else { |
94 | $query = Query\Useraccount::QUERY_READ_ASSIGNED_DEPARTMENTS; |
95 | $departmentIds = $this->getReader()->fetchAll($query, ['useraccountName' => $useraccount->id]); |
96 | } |
97 | $departmentList = new \BO\Zmsentities\Collection\DepartmentList(); |
98 | foreach ($departmentIds as $item) { |
99 | $department = (new \BO\Zmsdb\Department())->readEntity($item['id'], $resolveReferences); |
100 | if ($department instanceof \BO\Zmsentities\Department) { |
101 | $department->name = $item['organisation__name'] . ' -> ' . $department->name; |
102 | $departmentList->addEntity($department); |
103 | } |
104 | } |
105 | return $departmentList; |
106 | } |
107 | |
108 | public function readEntityByAuthKey($xAuthKey, $resolveReferences = 0) |
109 | { |
110 | $hashedAuthKey = hash('sha256', $xAuthKey); |
111 | $query = new Query\Useraccount(Query\Base::SELECT); |
112 | $query->addEntityMapping() |
113 | ->addResolvedReferences($resolveReferences) |
114 | ->addConditionXauthKey($hashedAuthKey); |
115 | $entity = ($hashedAuthKey) ? $this->fetchOne($query, new Entity()) : new Entity(); |
116 | return $this->readResolvedReferences($entity, $resolveReferences); |
117 | } |
118 | |
119 | public function readEntityByUserId($userId, $resolveReferences = 0) |
120 | { |
121 | $query = new Query\Useraccount(Query\Base::SELECT); |
122 | $query->addEntityMapping() |
123 | ->addResolvedReferences($resolveReferences) |
124 | ->addConditionUserId($userId); |
125 | $entity = ($userId) ? $this->fetchOne($query, new Entity()) : new Entity(); |
126 | return $this->readResolvedReferences($entity, $resolveReferences); |
127 | } |
128 | |
129 | public function readCollectionByDepartmentId($departmentId, $resolveReferences = 0) |
130 | { |
131 | $collection = new Collection(); |
132 | $query = new Query\Useraccount(Query\Base::SELECT); |
133 | $query->addResolvedReferences($resolveReferences) |
134 | ->addConditionDepartmentId($departmentId) |
135 | ->addEntityMapping(); |
136 | $result = $this->fetchList($query, new Entity()); |
137 | if (count($result)) { |
138 | foreach ($result as $entity) { |
139 | $collection->addEntity($this->readResolvedReferences($entity, $resolveReferences)); |
140 | } |
141 | } |
142 | return $collection; |
143 | } |
144 | |
145 | public function readCollectionByDepartmentIds($departmentIds, $resolveReferences = 0) |
146 | { |
147 | $collection = new Collection(); |
148 | $query = new Query\Useraccount(Query\Base::SELECT); |
149 | $query->addResolvedReferences($resolveReferences) |
150 | ->addConditionDepartmentIds($departmentIds) |
151 | ->addEntityMapping(); |
152 | $result = $this->fetchList($query, new Entity()); |
153 | if (count($result)) { |
154 | foreach ($result as $entity) { |
155 | if (0 < $resolveReferences && $entity->toProperty()->id->get()) { |
156 | $entity->departments = $this->readAssignedDepartmentList( |
157 | $entity, |
158 | $resolveReferences - 1 |
159 | ); |
160 | } |
161 | $collection->addEntity($entity); |
162 | } |
163 | } |
164 | return $collection; |
165 | } |
166 | |
167 | /** |
168 | * write an useraccount |
169 | * |
170 | * @param |
171 | * entity |
172 | * |
173 | * @return Entity |
174 | */ |
175 | public function writeEntity(\BO\Zmsentities\Useraccount $entity, $resolveReferences = 0) |
176 | { |
177 | if ($this->readIsUserExisting($entity->id)) { |
178 | throw new Exception\Useraccount\DuplicateEntry(); |
179 | } |
180 | $query = new Query\Useraccount(Query\Base::INSERT); |
181 | $values = $query->reverseEntityMapping($entity); |
182 | $query->addValues($values); |
183 | $this->writeItem($query); |
184 | $this->updateAssignedDepartments($entity); |
185 | return $this->readEntity($entity->getId(), $resolveReferences); |
186 | } |
187 | |
188 | /** |
189 | * update a useraccount |
190 | * |
191 | * @param |
192 | * useraccountId |
193 | * |
194 | * @return Entity |
195 | */ |
196 | public function writeUpdatedEntity($loginName, \BO\Zmsentities\Useraccount $entity, $resolveReferences = 0) |
197 | { |
198 | $query = new Query\Useraccount(Query\Base::UPDATE); |
199 | $query->addConditionLoginName($loginName); |
200 | $values = $query->reverseEntityMapping($entity); |
201 | $query->addValues($values); |
202 | $this->writeItem($query); |
203 | $this->updateAssignedDepartments($entity); |
204 | return $this->readEntity($entity->getId(), $resolveReferences); |
205 | } |
206 | |
207 | /** |
208 | * remove an user |
209 | * |
210 | * @param |
211 | * itemId |
212 | * |
213 | * @return Resource Status |
214 | */ |
215 | public function deleteEntity($loginName) |
216 | { |
217 | $query = new Query\Useraccount(Query\Base::DELETE); |
218 | $query->addConditionLoginName($loginName); |
219 | $this->deleteAssignedDepartments($loginName); |
220 | return $this->deleteItem($query); |
221 | } |
222 | |
223 | protected function updateAssignedDepartments($entity) |
224 | { |
225 | $loginName = $entity->id; |
226 | if (!$entity->isSuperUser()) { |
227 | $this->deleteAssignedDepartments($loginName); |
228 | $userId = $this->readEntityIdByLoginName($loginName); |
229 | foreach ($entity->departments as $department) { |
230 | $this->perform( |
231 | Query\Useraccount::QUERY_WRITE_ASSIGNED_DEPARTMENTS, |
232 | array( |
233 | $userId, |
234 | $department['id'] |
235 | ) |
236 | ); |
237 | } |
238 | } |
239 | } |
240 | |
241 | protected function readEntityIdByLoginName($loginName) |
242 | { |
243 | $query = Query\Useraccount::QUERY_READ_ID_BY_USERNAME; |
244 | $result = $this->getReader()->fetchOne($query, [$loginName]); |
245 | return $result['id']; |
246 | } |
247 | |
248 | protected function deleteAssignedDepartments($loginName) |
249 | { |
250 | $query = Query\Useraccount::QUERY_DELETE_ASSIGNED_DEPARTMENTS; |
251 | $userId = $this->readEntityIdByLoginName($loginName); |
252 | return $this->perform($query, [$userId]); |
253 | } |
254 | |
255 | public function readSearch(array $parameter, $resolveReferences = 0) |
256 | { |
257 | $query = new Query\Useraccount(Query\Base::SELECT); |
258 | $query |
259 | ->addResolvedReferences($resolveReferences) |
260 | ->addEntityMapping(); |
261 | |
262 | if (isset($parameter['query'])) { |
263 | if (preg_match('#^\d+$#', $parameter['query'])) { |
264 | $query->addConditionUserId($parameter['query']); |
265 | $query->addConditionSearch($parameter['query'], true); |
266 | } else { |
267 | $query->addConditionSearch($parameter['query']); |
268 | } |
269 | unset($parameter['query']); |
270 | } |
271 | |
272 | $statement = $this->fetchStatement($query); |
273 | return $this->readListStatement($statement, $resolveReferences); |
274 | } |
275 | |
276 | public function readSearchByDepartmentId($departmentId, array $parameter, $resolveReferences = 0) |
277 | { |
278 | $query = new Query\Useraccount(Query\Base::SELECT); |
279 | $query->addResolvedReferences($resolveReferences) |
280 | ->addEntityMapping(); |
281 | |
282 | if (isset($parameter['query'])) { |
283 | if (preg_match('#^\d+$#', $parameter['query'])) { |
284 | $query->addConditionUserId($parameter['query']); |
285 | $query->addConditionDepartmentAndSearch($departmentId, $parameter['query'], true); |
286 | } else { |
287 | $query->addConditionDepartmentAndSearch($departmentId, $parameter['query']); |
288 | } |
289 | unset($parameter['query']); |
290 | } else { |
291 | $query->addConditionDepartmentId($departmentId); |
292 | } |
293 | |
294 | $statement = $this->fetchStatement($query); |
295 | return $this->readListStatement($statement, $resolveReferences); |
296 | } |
297 | |
298 | public function readListRole($roleLevel, $resolveReferences = 0) |
299 | { |
300 | $query = new Query\Useraccount(Query\Base::SELECT); |
301 | $query->addResolvedReferences($resolveReferences) |
302 | ->addEntityMapping(); |
303 | |
304 | if (isset($roleLevel)) { |
305 | $query->addConditionRoleLevel($roleLevel); |
306 | } |
307 | |
308 | $statement = $this->fetchStatement($query); |
309 | return $this->readListStatement($statement, $resolveReferences); |
310 | } |
311 | |
312 | public function readListByRoleAndDepartment($roleLevel, $departmentId, $resolveReferences = 0) |
313 | { |
314 | $query = new Query\Useraccount(Query\Base::SELECT); |
315 | $query->addResolvedReferences($resolveReferences) |
316 | ->addEntityMapping(); |
317 | |
318 | if (isset($roleLevel) && isset($departmentId)) { |
319 | $query->addConditionRoleLevel($roleLevel); |
320 | $query->addConditionDepartmentId($departmentId); |
321 | } |
322 | |
323 | $statement = $this->fetchStatement($query); |
324 | return $this->readListStatement($statement, $resolveReferences); |
325 | } |
326 | } |