Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
RegisterSkillsEndpoint
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 1
 handle
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
72
1<?php
2
3namespace Olz\Apps\Quiz\Endpoints;
4
5use Olz\Api\OlzTypedEndpoint;
6use Olz\Entity\Quiz\Skill;
7use Olz\Entity\Quiz\SkillCategory;
8
9/**
10 * @phpstan-type OlzSkillData array{
11 *   name: non-empty-string,
12 *   categoryIds: array<non-empty-string>,
13 * }
14 *
15 * @extends OlzTypedEndpoint<
16 *   array{skills: array<OlzSkillData>},
17 *   array{idByName: array<non-empty-string, non-empty-string>}
18 * >
19 */
20class RegisterSkillsEndpoint extends OlzTypedEndpoint {
21    protected function handle(mixed $input): mixed {
22        $skill_repo = $this->entityManager()->getRepository(Skill::class);
23        $skill_category_repo = $this->entityManager()->getRepository(SkillCategory::class);
24        $skill_by_name = [];
25        foreach ($input['skills'] as $input_skill) {
26            $skill_name = $input_skill['name'];
27            $skill_category_ids = $input_skill['categoryIds'];
28            $existing_skill = $skill_repo->findOneBy(['name' => $skill_name]);
29            if ($existing_skill) {
30                $skill = $existing_skill;
31            } else {
32                $skill = new Skill();
33                $this->entityUtils()->createOlzEntity($skill, ['onOff' => true]);
34            }
35            $skill->setName($skill_name);
36            $skill->clearCategories();
37            foreach ($skill_category_ids as $external_category_id) {
38                $internal_category_id = $this->idUtils()->toInternalId($external_category_id, 'SkillCategory');
39                $category = $skill_category_repo->findOneBy(['id' => $internal_category_id]);
40                if (!$category) {
41                    throw new \Exception("No such category: {$internal_category_id}");
42                }
43                $skill->addCategory($category);
44            }
45            $skill_by_name[$skill_name] = $skill;
46        }
47
48        foreach ($skill_by_name as $skill_name => $skill) {
49            $this->entityManager()->persist($skill);
50        }
51        $this->entityManager()->flush();
52
53        $id_by_name = [];
54        foreach ($skill_by_name as $skill_name => $skill) {
55            $id_by_name[$skill_name] = $this->idUtils()->toExternalId($skill->getId() ?? 0, 'Skill') ?: '-';
56        }
57        return ['idByName' => $id_by_name];
58    }
59}