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