Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
64.77% |
57 / 88 |
|
62.50% |
10 / 16 |
CRAP | |
0.00% |
0 / 1 |
ApiController | |
64.77% |
57 / 88 |
|
62.50% |
10 / 16 |
62.27 | |
0.00% |
0 / 1 |
validateTagCreate | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
5 | |||
apiTagUpdate | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
updateTagFromRequest | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
apiTagCreate | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
2 | |||
validateTagL11nCreate | |
100.00% |
5 / 5 |
|
100.00% |
1 / 1 |
3 | |||
apiTagL11nCreate | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
2 | |||
createTagFromRequest | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
1 | |||
createTagL11nFromRequest | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
1 | |||
apiTagGet | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
apiTagDelete | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
2 | |||
apiTagFind | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
1 | |||
apiTagL11nUpdate | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
6 | |||
updateTagL11nFromRequest | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
validateTagL11nUpdate | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 | |||
apiTagL11nDelete | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
6 | |||
validateTagL11nDelete | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 |
1 | <?php |
2 | /** |
3 | * Jingga |
4 | * |
5 | * PHP Version 8.1 |
6 | * |
7 | * @package Modules\Tag |
8 | * @copyright Dennis Eichhorn |
9 | * @license OMS License 2.0 |
10 | * @version 1.0.0 |
11 | * @link https://jingga.app |
12 | */ |
13 | declare(strict_types=1); |
14 | |
15 | namespace Modules\Tag\Controller; |
16 | |
17 | use Modules\Tag\Models\Tag; |
18 | use Modules\Tag\Models\TagL11nMapper; |
19 | use Modules\Tag\Models\TagMapper; |
20 | use phpOMS\Localization\BaseStringL11n; |
21 | use phpOMS\Message\Http\RequestStatusCode; |
22 | use phpOMS\Message\RequestAbstract; |
23 | use phpOMS\Message\ResponseAbstract; |
24 | use phpOMS\System\MimeType; |
25 | |
26 | /** |
27 | * Tag controller class. |
28 | * |
29 | * @package Modules\Tag |
30 | * @license OMS License 2.0 |
31 | * @link https://jingga.app |
32 | * @since 1.0.0 |
33 | */ |
34 | final class ApiController extends Controller |
35 | { |
36 | /** |
37 | * Validate tag create request |
38 | * |
39 | * @param RequestAbstract $request Request |
40 | * |
41 | * @return array<string, bool> |
42 | * |
43 | * @since 1.0.0 |
44 | */ |
45 | private function validateTagCreate(RequestAbstract $request) : array |
46 | { |
47 | $val = []; |
48 | if (($val['title'] = !$request->hasData('title')) |
49 | || ($val['color'] = ($request->hasData('color') |
50 | && (!\ctype_xdigit(\ltrim((string) $request->getData('color'), '#')) |
51 | || \stripos((string) $request->getData('color'), '#') !== 0))) |
52 | ) { |
53 | return $val; |
54 | } |
55 | |
56 | return []; |
57 | } |
58 | |
59 | /** |
60 | * Api method to create tag |
61 | * |
62 | * @param RequestAbstract $request Request |
63 | * @param ResponseAbstract $response Response |
64 | * @param array $data Generic data |
65 | * |
66 | * @return void |
67 | * |
68 | * @api |
69 | * |
70 | * @since 1.0.0 |
71 | */ |
72 | public function apiTagUpdate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
73 | { |
74 | /** @var Tag $old */ |
75 | $old = TagMapper::get()->where('id', (int) $request->getData('id'))->execute(); |
76 | $new = $this->updateTagFromRequest($request, clone $old); |
77 | |
78 | $this->updateModel($request->header->account, $old, $new, TagMapper::class, 'tag', $request->getOrigin()); |
79 | $this->createStandardUpdateResponse($request, $response, $new); |
80 | } |
81 | |
82 | /** |
83 | * Method to update tag from request. |
84 | * |
85 | * @param RequestAbstract $request Request |
86 | * |
87 | * @return Tag |
88 | * |
89 | * @since 1.0.0 |
90 | */ |
91 | private function updateTagFromRequest(RequestAbstract $request, Tag $new) : Tag |
92 | { |
93 | $new->setL11n($request->getDataString('title') ?? $new->getL11n()); |
94 | $new->color = \str_pad($request->getDataString('color') ?? $new->color, 9, 'ff', \STR_PAD_RIGHT); |
95 | |
96 | return $new; |
97 | } |
98 | |
99 | /** |
100 | * Api method to create tag |
101 | * |
102 | * @param RequestAbstract $request Request |
103 | * @param ResponseAbstract $response Response |
104 | * @param array $data Generic data |
105 | * |
106 | * @return void |
107 | * |
108 | * @api |
109 | * |
110 | * @since 1.0.0 |
111 | */ |
112 | public function apiTagCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
113 | { |
114 | if (!empty($val = $this->validateTagCreate($request))) { |
115 | $response->header->status = RequestStatusCode::R_400; |
116 | $this->createInvalidCreateResponse($request, $response, $val); |
117 | |
118 | return; |
119 | } |
120 | |
121 | $tag = $this->createTagFromRequest($request); |
122 | $this->createModel($request->header->account, $tag, TagMapper::class, 'tag', $request->getOrigin()); |
123 | $this->createStandardCreateResponse($request, $response, $tag); |
124 | } |
125 | |
126 | /** |
127 | * Validate tag l11n create request |
128 | * |
129 | * @param RequestAbstract $request Request |
130 | * |
131 | * @return array<string, bool> |
132 | * |
133 | * @since 1.0.0 |
134 | */ |
135 | private function validateTagL11nCreate(RequestAbstract $request) : array |
136 | { |
137 | $val = []; |
138 | if (($val['title'] = !$request->hasData('title')) |
139 | || ($val['tag'] = !$request->hasData('tag')) |
140 | ) { |
141 | return $val; |
142 | } |
143 | |
144 | return []; |
145 | } |
146 | |
147 | /** |
148 | * Api method to create tag localization |
149 | * |
150 | * @param RequestAbstract $request Request |
151 | * @param ResponseAbstract $response Response |
152 | * @param array $data Generic data |
153 | * |
154 | * @return void |
155 | * |
156 | * @api |
157 | * |
158 | * @since 1.0.0 |
159 | */ |
160 | public function apiTagL11nCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
161 | { |
162 | if (!empty($val = $this->validateTagL11nCreate($request))) { |
163 | $response->header->status = RequestStatusCode::R_400; |
164 | $this->createInvalidCreateResponse($request, $response, $val); |
165 | |
166 | return; |
167 | } |
168 | |
169 | $l11nTag = $this->createTagL11nFromRequest($request); |
170 | $this->createModel($request->header->account, $l11nTag, TagL11nMapper::class, 'tag_l11n', $request->getOrigin()); |
171 | $this->createStandardCreateResponse($request, $response, $l11nTag); |
172 | } |
173 | |
174 | /** |
175 | * Method to create tag from request. |
176 | * |
177 | * @param RequestAbstract $request Request |
178 | * |
179 | * @return Tag |
180 | * |
181 | * @since 1.0.0 |
182 | */ |
183 | private function createTagFromRequest(RequestAbstract $request) : Tag |
184 | { |
185 | $tag = new Tag(); |
186 | $tag->color = \str_pad($request->getDataString('color') ?? '#000000ff', 9, 'f'); |
187 | $tag->icon = $request->getDataString('icon') ?? ''; |
188 | |
189 | $tag->setL11n( |
190 | $request->getDataString('title') ?? '', |
191 | $request->getDataString('language') ?? $request->header->l11n->language |
192 | ); |
193 | |
194 | return $tag; |
195 | } |
196 | |
197 | /** |
198 | * Method to create tag localization from request. |
199 | * |
200 | * @param RequestAbstract $request Request |
201 | * |
202 | * @return BaseStringL11n |
203 | * |
204 | * @since 1.0.0 |
205 | */ |
206 | private function createTagL11nFromRequest(RequestAbstract $request) : BaseStringL11n |
207 | { |
208 | $tagL11n = new BaseStringL11n(); |
209 | $tagL11n->ref = $request->getDataInt('tag') ?? 0; |
210 | $tagL11n->setLanguage( |
211 | $request->getDataString('language') ?? $request->header->l11n->language |
212 | ); |
213 | $tagL11n->content = $request->getDataString('title') ?? ''; |
214 | |
215 | return $tagL11n; |
216 | } |
217 | |
218 | /** |
219 | * Api method to get a tag |
220 | * |
221 | * @param RequestAbstract $request Request |
222 | * @param ResponseAbstract $response Response |
223 | * @param array $data Generic data |
224 | * |
225 | * @return void |
226 | * |
227 | * @api |
228 | * |
229 | * @since 1.0.0 |
230 | */ |
231 | public function apiTagGet(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
232 | { |
233 | /** @var Tag $tag */ |
234 | $tag = TagMapper::get()->where('id', (int) $request->getData('id'))->execute(); |
235 | $this->createStandardReturnResponse($request, $response, $tag); |
236 | } |
237 | |
238 | /** |
239 | * Api method to delete tag |
240 | * |
241 | * @param RequestAbstract $request Request |
242 | * @param ResponseAbstract $response Response |
243 | * @param array $data Generic data |
244 | * |
245 | * @return void |
246 | * |
247 | * @api |
248 | * |
249 | * @since 1.0.0 |
250 | */ |
251 | public function apiTagDelete(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
252 | { |
253 | /** @var Tag $tag */ |
254 | $tag = TagMapper::get()->where('id', (int) $request->getData('id'))->execute(); |
255 | $this->deleteModel($request->header->account, $tag, TagMapper::class, 'tag', $request->getOrigin()); |
256 | $this->createStandardDeleteResponse($request, $response, $tag); |
257 | } |
258 | |
259 | /** |
260 | * Api method to find tags |
261 | * |
262 | * @param RequestAbstract $request Request |
263 | * @param ResponseAbstract $response Response |
264 | * @param array $data Generic data |
265 | * |
266 | * @return void |
267 | * |
268 | * @api |
269 | * |
270 | * @since 1.0.0 |
271 | */ |
272 | public function apiTagFind(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
273 | { |
274 | /** @var \Modules\Tag\Models\Tag[] $tags */ |
275 | $tags = TagMapper::getAll() |
276 | ->with('title') |
277 | ->where('title/language', $request->header->l11n->language) |
278 | ->where('title/content', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE') |
279 | ->execute(); |
280 | |
281 | $response->header->set('Content-Type', MimeType::M_JSON, true); |
282 | $response->set($request->uri->__toString(), \array_values($tags)); |
283 | } |
284 | |
285 | /** |
286 | * Api method to update TagL11n |
287 | * |
288 | * @param RequestAbstract $request Request |
289 | * @param ResponseAbstract $response Response |
290 | * @param array $data Generic data |
291 | * |
292 | * @return void |
293 | * |
294 | * @api |
295 | * |
296 | * @since 1.0.0 |
297 | */ |
298 | public function apiTagL11nUpdate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
299 | { |
300 | if (!empty($val = $this->validateTagL11nUpdate($request))) { |
301 | $response->header->status = RequestStatusCode::R_400; |
302 | $this->createInvalidUpdateResponse($request, $response, $val); |
303 | |
304 | return; |
305 | } |
306 | |
307 | /** @var BaseStringL11n $old */ |
308 | $old = TagL11nMapper::get()->where('id', (int) $request->getData('id'))->execute(); |
309 | $new = $this->updateTagL11nFromRequest($request, clone $old); |
310 | |
311 | $this->updateModel($request->header->account, $old, $new, TagL11nMapper::class, 'tag_l11n', $request->getOrigin()); |
312 | $this->createStandardUpdateResponse($request, $response, $new); |
313 | } |
314 | |
315 | /** |
316 | * Method to update TagL11n from request. |
317 | * |
318 | * @param RequestAbstract $request Request |
319 | * @param BaseStringL11n $new Model to modify |
320 | * |
321 | * @return BaseStringL11n |
322 | * |
323 | * @todo: implement |
324 | * |
325 | * @since 1.0.0 |
326 | */ |
327 | public function updateTagL11nFromRequest(RequestAbstract $request, BaseStringL11n $new) : BaseStringL11n |
328 | { |
329 | $new->setLanguage( |
330 | $request->getDataString('language') ?? $new->language |
331 | ); |
332 | $new->content = $request->getDataString('title') ?? $new->content; |
333 | |
334 | return $new; |
335 | } |
336 | |
337 | /** |
338 | * Validate TagL11n update request |
339 | * |
340 | * @param RequestAbstract $request Request |
341 | * |
342 | * @return array<string, bool> |
343 | * |
344 | * @todo: implement |
345 | * |
346 | * @since 1.0.0 |
347 | */ |
348 | private function validateTagL11nUpdate(RequestAbstract $request) : array |
349 | { |
350 | $val = []; |
351 | if (($val['id'] = !$request->hasData('id'))) { |
352 | return $val; |
353 | } |
354 | |
355 | return []; |
356 | } |
357 | |
358 | /** |
359 | * Api method to delete TagL11n |
360 | * |
361 | * @param RequestAbstract $request Request |
362 | * @param ResponseAbstract $response Response |
363 | * @param array $data Generic data |
364 | * |
365 | * @return void |
366 | * |
367 | * @api |
368 | * |
369 | * @since 1.0.0 |
370 | */ |
371 | public function apiTagL11nDelete(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void |
372 | { |
373 | if (!empty($val = $this->validateTagL11nDelete($request))) { |
374 | $response->header->status = RequestStatusCode::R_400; |
375 | $this->createInvalidDeleteResponse($request, $response, $val); |
376 | |
377 | return; |
378 | } |
379 | |
380 | /** @var BaseStringL11n $tagL11n */ |
381 | $tagL11n = TagL11nMapper::get()->where('id', (int) $request->getData('id'))->execute(); |
382 | $this->deleteModel($request->header->account, $tagL11n, TagL11nMapper::class, 'tag_l11n', $request->getOrigin()); |
383 | $this->createStandardDeleteResponse($request, $response, $tagL11n); |
384 | } |
385 | |
386 | /** |
387 | * Validate TagL11n delete request |
388 | * |
389 | * @param RequestAbstract $request Request |
390 | * |
391 | * @return array<string, bool> |
392 | * |
393 | * @todo: implement |
394 | * |
395 | * @since 1.0.0 |
396 | */ |
397 | private function validateTagL11nDelete(RequestAbstract $request) : array |
398 | { |
399 | $val = []; |
400 | if (($val['id'] = !$request->hasData('id'))) { |
401 | return $val; |
402 | } |
403 | |
404 | return []; |
405 | } |
406 | } |