Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
RunEndpointTrait
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
3 / 3
7
100.00% covered (success)
100.00%
1 / 1
 getEntityData
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
3
 updateEntityWithData
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
2
 getEntityById
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace Olz\Anniversary\Endpoints;
4
5use Olz\Entity\Anniversary\RunRecord;
6use Olz\Entity\Users\User;
7use Olz\Utils\WithUtilsTrait;
8use PhpTypeScriptApi\HttpError;
9use PhpTypeScriptApi\PhpStan\IsoDateTime;
10
11/**
12 * @phpstan-type OlzRunId int
13 * @phpstan-type OlzRunData array{
14 *   userId?: ?int,
15 *   runAt?: ?IsoDateTime,
16 *   distanceMeters: int,
17 *   elevationMeters: int,
18 *   sportType?: ?non-empty-string,
19 *   source?: ?non-empty-string,
20 * }
21 */
22trait RunEndpointTrait {
23    use WithUtilsTrait;
24
25    /** @return OlzRunData */
26    public function getEntityData(RunRecord $entity): array {
27        $run_at = IsoDateTime::fromDateTime($entity->getRunAt());
28        $this->generalUtils()->checkNotNull($run_at, "Invalid run_at: {$entity}");
29        return [
30            'userId' => $entity->getUser()?->getId(),
31            'runAt' => $run_at,
32            'distanceMeters' => $entity->getDistanceMeters(),
33            'elevationMeters' => $entity->getElevationMeters(),
34            'sportType' => $entity->getSportType() ?: null,
35            'source' => $entity->getSource() ?: null,
36        ];
37    }
38
39    /** @param OlzRunData $input_data */
40    public function updateEntityWithData(RunRecord $entity, array $input_data): void {
41        $now = new \DateTime($this->dateUtils()->getIsoNow());
42        $user_repo = $this->entityManager()->getRepository(User::class);
43        $user = $user_repo->findOneBy(['id' => $input_data['userId'] ?? null]);
44        if ($user === null) {
45            $user = $this->authUtils()->getCurrentUser();
46        }
47        $last_name = substr($user?->getLastName() ?? '', 0, 1).".";
48        $name = "{$user?->getFirstName()} {$last_name}";
49
50        $entity->setUser($user);
51        $entity->setRunnerName($name);
52        $entity->setRunAt($input_data['runAt'] ?? $now);
53        $entity->setIsCounting(true);
54        $entity->setDistanceMeters($input_data['distanceMeters']);
55        $entity->setElevationMeters($input_data['elevationMeters']);
56        $entity->setSportType($input_data['sportType'] ?? null);
57        $entity->setSource($input_data['source'] ?? 'manuell');
58    }
59
60    protected function getEntityById(int $id): RunRecord {
61        $repo = $this->entityManager()->getRepository(RunRecord::class);
62        $entity = $repo->findOneBy(['id' => $id]);
63        if (!$entity) {
64            throw new HttpError(404, "Nicht gefunden.");
65        }
66        return $entity;
67    }
68}