Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
67.83% |
97 / 143 |
|
73.68% |
14 / 19 |
CRAP | |
0.00% |
0 / 1 |
Useraccount | |
67.83% |
97 / 143 |
|
73.68% |
14 / 19 |
104.55 | |
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% |
6 / 6 |
|
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 | |||
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 | // TODO subtract -1 from resolveReference, but check calling functions! |
41 | $useraccount->departments = $this->readAssignedDepartmentList($useraccount, $resolveReferences); |
42 | } |
43 | return $useraccount; |
44 | } |
45 | |
46 | /** |
47 | * read list of useraccounts |
48 | * |
49 | * @param |
50 | * resolveReferences |
51 | * |
52 | * @return Resource Collection |
53 | */ |
54 | public function readList($resolveReferences = 0) |
55 | { |
56 | $collection = new Collection(); |
57 | $query = new Query\Useraccount(Query\Base::SELECT); |
58 | $query->addResolvedReferences($resolveReferences) |
59 | ->addEntityMapping(); |
60 | $result = $this->fetchList($query, new Entity()); |
61 | if (count($result)) { |
62 | foreach ($result as $entity) { |
63 | $collection->addEntity($this->readResolvedReferences($entity, $resolveReferences)); |
64 | } |
65 | } |
66 | return $collection; |
67 | } |
68 | |
69 | protected function readListStatement($statement, $resolveReferences) |
70 | { |
71 | $query = new Query\Useraccount(Query\Base::SELECT); |
72 | $collection = new Collection(); |
73 | while ($userAccountData = $statement->fetch(\PDO::FETCH_ASSOC)) { |
74 | $entity = new Entity($query->postProcessJoins($userAccountData)); |
75 | $entity = $this->readResolvedReferences($entity, $resolveReferences); |
76 | $collection->addEntity($entity); |
77 | } |
78 | return $collection; |
79 | } |
80 | |
81 | /** |
82 | * read list assigned departments |
83 | * |
84 | * @param |
85 | * resolveReferences |
86 | * |
87 | * @return Resource Collection |
88 | */ |
89 | public function readAssignedDepartmentList($useraccount, $resolveReferences = 0) |
90 | { |
91 | if ($useraccount->isSuperUser()) { |
92 | $query = Query\Useraccount::QUERY_READ_SUPERUSER_DEPARTMENTS; |
93 | $departmentIds = $this->getReader()->fetchAll($query); |
94 | } else { |
95 | $query = Query\Useraccount::QUERY_READ_ASSIGNED_DEPARTMENTS; |
96 | $departmentIds = $this->getReader()->fetchAll($query, ['useraccountName' => $useraccount->id]); |
97 | } |
98 | $departmentList = new \BO\Zmsentities\Collection\DepartmentList(); |
99 | foreach ($departmentIds as $item) { |
100 | $department = (new \BO\Zmsdb\Department())->readEntity($item['id'], $resolveReferences); |
101 | if ($department instanceof \BO\Zmsentities\Department) { |
102 | $department->name = $item['organisation__name'] . ' -> ' . $department->name; |
103 | $departmentList->addEntity($department); |
104 | } |
105 | } |
106 | return $departmentList; |
107 | } |
108 | |
109 | public function readEntityByAuthKey($xAuthKey, $resolveReferences = 0) |
110 | { |
111 | $query = new Query\Useraccount(Query\Base::SELECT); |
112 | $query->addEntityMapping() |
113 | ->addResolvedReferences($resolveReferences) |
114 | ->addConditionXauthKey($xAuthKey); |
115 | $entity = ($xAuthKey) ? $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 | /** |
146 | * write an useraccount |
147 | * |
148 | * @param |
149 | * entity |
150 | * |
151 | * @return Entity |
152 | */ |
153 | public function writeEntity(\BO\Zmsentities\Useraccount $entity, $resolveReferences = 0) |
154 | { |
155 | if ($this->readIsUserExisting($entity->id)) { |
156 | throw new Exception\Useraccount\DuplicateEntry(); |
157 | } |
158 | $query = new Query\Useraccount(Query\Base::INSERT); |
159 | $values = $query->reverseEntityMapping($entity); |
160 | $query->addValues($values); |
161 | $this->writeItem($query); |
162 | $this->updateAssignedDepartments($entity); |
163 | return $this->readEntity($entity->getId(), $resolveReferences); |
164 | } |
165 | |
166 | /** |
167 | * update a useraccount |
168 | * |
169 | * @param |
170 | * useraccountId |
171 | * |
172 | * @return Entity |
173 | */ |
174 | public function writeUpdatedEntity($loginName, \BO\Zmsentities\Useraccount $entity, $resolveReferences = 0) |
175 | { |
176 | $query = new Query\Useraccount(Query\Base::UPDATE); |
177 | $query->addConditionLoginName($loginName); |
178 | $values = $query->reverseEntityMapping($entity); |
179 | $query->addValues($values); |
180 | $this->writeItem($query); |
181 | $this->updateAssignedDepartments($entity); |
182 | return $this->readEntity($entity->getId(), $resolveReferences); |
183 | } |
184 | |
185 | /** |
186 | * remove an user |
187 | * |
188 | * @param |
189 | * itemId |
190 | * |
191 | * @return Resource Status |
192 | */ |
193 | public function deleteEntity($loginName) |
194 | { |
195 | $query = new Query\Useraccount(Query\Base::DELETE); |
196 | $query->addConditionLoginName($loginName); |
197 | $this->deleteAssignedDepartments($loginName); |
198 | return $this->deleteItem($query); |
199 | } |
200 | |
201 | protected function updateAssignedDepartments($entity) |
202 | { |
203 | $loginName = $entity->id; |
204 | if (!$entity->isSuperUser()) { |
205 | $this->deleteAssignedDepartments($loginName); |
206 | $userId = $this->readEntityIdByLoginName($loginName); |
207 | foreach ($entity->departments as $department) { |
208 | $this->perform( |
209 | Query\Useraccount::QUERY_WRITE_ASSIGNED_DEPARTMENTS, |
210 | array( |
211 | $userId, |
212 | $department['id'] |
213 | ) |
214 | ); |
215 | } |
216 | } |
217 | } |
218 | |
219 | protected function readEntityIdByLoginName($loginName) |
220 | { |
221 | $query = Query\Useraccount::QUERY_READ_ID_BY_USERNAME; |
222 | $result = $this->getReader()->fetchOne($query, [$loginName]); |
223 | return $result['id']; |
224 | } |
225 | |
226 | protected function deleteAssignedDepartments($loginName) |
227 | { |
228 | $query = Query\Useraccount::QUERY_DELETE_ASSIGNED_DEPARTMENTS; |
229 | $userId = $this->readEntityIdByLoginName($loginName); |
230 | return $this->perform($query, [$userId]); |
231 | } |
232 | |
233 | public function readSearch(array $parameter, $resolveReferences = 0) |
234 | { |
235 | $query = new Query\Useraccount(Query\Base::SELECT); |
236 | $query |
237 | ->addResolvedReferences($resolveReferences) |
238 | ->addEntityMapping(); |
239 | |
240 | if (isset($parameter['query'])) { |
241 | if (preg_match('#^\d+$#', $parameter['query'])) { |
242 | $query->addConditionUserId($parameter['query']); |
243 | $query->addConditionSearch($parameter['query'], true); |
244 | } else { |
245 | $query->addConditionSearch($parameter['query']); |
246 | } |
247 | unset($parameter['query']); |
248 | } |
249 | |
250 | $statement = $this->fetchStatement($query); |
251 | return $this->readListStatement($statement, $resolveReferences); |
252 | } |
253 | |
254 | public function readSearchByDepartmentId($departmentId, array $parameter, $resolveReferences = 0) |
255 | { |
256 | $query = new Query\Useraccount(Query\Base::SELECT); |
257 | $query->addResolvedReferences($resolveReferences) |
258 | ->addEntityMapping(); |
259 | |
260 | if (isset($parameter['query'])) { |
261 | if (preg_match('#^\d+$#', $parameter['query'])) { |
262 | $query->addConditionUserId($parameter['query']); |
263 | $query->addConditionDepartmentAndSearch($departmentId, $parameter['query'], true); |
264 | } else { |
265 | $query->addConditionDepartmentAndSearch($departmentId, $parameter['query']); |
266 | } |
267 | unset($parameter['query']); |
268 | } else { |
269 | $query->addConditionDepartmentId($departmentId); |
270 | } |
271 | |
272 | $statement = $this->fetchStatement($query); |
273 | return $this->readListStatement($statement, $resolveReferences); |
274 | } |
275 | |
276 | public function readListRole($roleLevel, $resolveReferences = 0) |
277 | { |
278 | $query = new Query\Useraccount(Query\Base::SELECT); |
279 | $query->addResolvedReferences($resolveReferences) |
280 | ->addEntityMapping(); |
281 | |
282 | if (isset($roleLevel)) { |
283 | $query->addConditionRoleLevel($roleLevel); |
284 | } |
285 | |
286 | $statement = $this->fetchStatement($query); |
287 | return $this->readListStatement($statement, $resolveReferences); |
288 | } |
289 | |
290 | public function readListByRoleAndDepartment($roleLevel, $departmentId, $resolveReferences = 0) |
291 | { |
292 | $query = new Query\Useraccount(Query\Base::SELECT); |
293 | $query->addResolvedReferences($resolveReferences) |
294 | ->addEntityMapping(); |
295 | |
296 | if (isset($roleLevel) && isset($departmentId)) { |
297 | $query->addConditionRoleLevel($roleLevel); |
298 | $query->addConditionDepartmentId($departmentId); |
299 | } |
300 | |
301 | $statement = $this->fetchStatement($query); |
302 | return $this->readListStatement($statement, $resolveReferences); |
303 | } |
304 | } |