Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
64.77% covered (warning)
64.77%
57 / 88
62.50% covered (warning)
62.50%
10 / 16
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiController
64.77% covered (warning)
64.77%
57 / 88
62.50% covered (warning)
62.50%
10 / 16
62.27
0.00% covered (danger)
0.00%
0 / 1
 validateTagCreate
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
5
 apiTagUpdate
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 updateTagFromRequest
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 apiTagCreate
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 validateTagL11nCreate
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 apiTagL11nCreate
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 createTagFromRequest
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 createTagL11nFromRequest
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 apiTagGet
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 apiTagDelete
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 apiTagFind
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 apiTagL11nUpdate
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
 updateTagL11nFromRequest
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 validateTagL11nUpdate
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 apiTagL11nDelete
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 validateTagL11nDelete
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
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 */
13declare(strict_types=1);
14
15namespace Modules\Tag\Controller;
16
17use Modules\Tag\Models\Tag;
18use Modules\Tag\Models\TagL11nMapper;
19use Modules\Tag\Models\TagMapper;
20use phpOMS\Localization\BaseStringL11n;
21use phpOMS\Message\Http\RequestStatusCode;
22use phpOMS\Message\RequestAbstract;
23use phpOMS\Message\ResponseAbstract;
24use 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 */
34final 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}