Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
96.55% |
28 / 29 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 1 |
UpdateMySkillLevelsEndpoint | |
96.55% |
28 / 29 |
|
0.00% |
0 / 1 |
4 | |
0.00% |
0 / 1 |
handle | |
96.55% |
28 / 29 |
|
0.00% |
0 / 1 |
4 |
1 | <?php |
2 | |
3 | namespace Olz\Apps\Quiz\Endpoints; |
4 | |
5 | use Olz\Api\OlzTypedEndpoint; |
6 | use Olz\Apps\Quiz\QuizConstants; |
7 | use Olz\Entity\Quiz\Skill; |
8 | use Olz\Entity\Quiz\SkillLevel; |
9 | |
10 | /** |
11 | * Note: `change` must be between -1.0 and 1.0. |
12 | * |
13 | * @extends OlzTypedEndpoint< |
14 | * array{updates: array<non-empty-string, array{change: float}>}, |
15 | * array{status: 'OK'|'ERROR'} |
16 | * > |
17 | */ |
18 | class UpdateMySkillLevelsEndpoint extends OlzTypedEndpoint { |
19 | protected function handle(mixed $input): mixed { |
20 | $this->checkPermission('any'); |
21 | |
22 | $current_user = $this->authUtils()->getCurrentUser(); |
23 | $skill_repo = $this->entityManager()->getRepository(Skill::class); |
24 | $skill_level_repo = $this->entityManager()->getRepository(SkillLevel::class); |
25 | $now_datetime = new \DateTime($this->dateUtils()->getIsoNow()); |
26 | |
27 | foreach ($input['updates'] as $external_skill_id => $update) { |
28 | $internal_skill_id = $this->idUtils()->toInternalId($external_skill_id, 'Skill'); |
29 | $skill_level = $skill_level_repo->findOneBy([ |
30 | 'skill' => $internal_skill_id, |
31 | 'user' => $current_user, |
32 | ]); |
33 | if ($skill_level === null) { |
34 | $skill = $skill_repo->findOneBy(['id' => $internal_skill_id]); |
35 | if (!$skill) { |
36 | throw new \Exception("No such skill: {$internal_skill_id}"); |
37 | } |
38 | $skill_level = new SkillLevel(); |
39 | $this->entityUtils()->createOlzEntity($skill_level, ['onOff' => true]); |
40 | $skill_level->setSkill($skill); |
41 | $skill_level->setUser($current_user); |
42 | $skill_level->setRecordedAt($now_datetime); |
43 | $skill_level->setValue(QuizConstants::INITIAL_SKILL_LEVEL_VALUE); |
44 | $this->entityManager()->persist($skill_level); |
45 | } |
46 | $value_change = $update['change']; |
47 | $value = $skill_level->getValue(); |
48 | $value = $value + $value_change; |
49 | $value = min(1, max(0, $value)); |
50 | $skill_level->setValue($value); |
51 | } |
52 | |
53 | $this->entityManager()->flush(); |
54 | |
55 | return ['status' => 'OK']; |
56 | } |
57 | } |