Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
UpdateMySkillLevelsEndpoint
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 1
 handle
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3namespace Olz\Apps\Quiz\Endpoints;
4
5use Olz\Api\OlzTypedEndpoint;
6use Olz\Apps\Quiz\QuizConstants;
7use Olz\Entity\Quiz\Skill;
8use 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 */
18class 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}