Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.92% covered (success)
97.92%
47 / 48
83.33% covered (warning)
83.33%
5 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
KarteEndpointTrait
97.92% covered (success)
97.92%
47 / 48
83.33% covered (warning)
83.33%
5 / 6
23
0.00% covered (danger)
0.00%
0 / 1
 getEntityData
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
9
 updateEntityWithData
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
2
 persistUploads
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 editUploads
100.00% covered (success)
100.00%
2 / 2
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
 getKindForApi
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
6.17
1<?php
2
3namespace Olz\Karten\Endpoints;
4
5use Olz\Entity\Karten\Karte;
6use Olz\Utils\MapUtils;
7use Olz\Utils\WithUtilsTrait;
8use PhpTypeScriptApi\HttpError;
9
10/**
11 * @phpstan-type OlzKarteId int
12 *
13 * @phpstan-import-type OlzLocationCoordinates from MapUtils
14 *
15 * @phpstan-type OlzKarteData array{
16 *   kartennr?: ?int,
17 *   name: non-empty-string,
18 *   location?: ?OlzLocationCoordinates,
19 *   year?: ?int,
20 *   scale?: ?non-empty-string,
21 *   place?: ?non-empty-string,
22 *   zoom?: ?int,
23 *   kind?: ?OlzKarteKind,
24 *   previewImageId?: ?non-empty-string,
25 * }
26 * @phpstan-type OlzKarteKind 'ol'|'stadt'|'scool'
27 */
28trait KarteEndpointTrait {
29    use WithUtilsTrait;
30
31    /** @return OlzKarteData */
32    public function getEntityData(Karte $entity): array {
33        $name = $entity->getName();
34        $year = $entity->getYear();
35        $scale = $entity->getScale();
36        $place = $entity->getPlace();
37        $zoom = $entity->getZoom();
38        $preview_image_id = $entity->getPreviewImageId();
39
40        return [
41            'kartennr' => $entity->getKartenNr() ?? null,
42            'name' => $name ? $name : '-',
43            'location' => ($entity->getLatitude() && $entity->getLongitude()) ? [
44                'latitude' => $entity->getLatitude(),
45                'longitude' => $entity->getLongitude(),
46            ] : null,
47            'year' => $year ? intval($year) : null,
48            'scale' => $scale ? $scale : null,
49            'place' => $place ? $place : null,
50            'zoom' => $zoom ? intval($zoom) : null,
51            'kind' => $this->getKindForApi($entity),
52            'previewImageId' => $preview_image_id ? $preview_image_id : null,
53        ];
54    }
55
56    /** @param OlzKarteData $input_data */
57    public function updateEntityWithData(Karte $entity, array $input_data): void {
58        $year = $input_data['year'] ?? null;
59        $valid_year = $year ? strval($year) : null;
60        $preview_image_id = $input_data['previewImageId'] ?? null;
61        $valid_preview_image_id = $this->uploadUtils()->getValidUploadId($preview_image_id);
62
63        $entity->setKartenNr($input_data['kartennr'] ?? null);
64        $entity->setName($input_data['name']);
65        $entity->setLatitude($input_data['location']['latitude'] ?? null);
66        $entity->setLongitude($input_data['location']['longitude'] ?? null);
67        $entity->setYear($valid_year);
68        $entity->setScale($input_data['scale'] ?? null);
69        $entity->setPlace($input_data['place'] ?? null);
70        $entity->setZoom($input_data['zoom'] ?? null);
71        $entity->setKind($input_data['kind'] ?? null);
72        $entity->setPreviewImageId($valid_preview_image_id);
73    }
74
75    /** @param OlzKarteData $input_data */
76    public function persistUploads(Karte $entity, array $input_data): void {
77        if ($entity->getPreviewImageId()) {
78            $this->persistOlzImages($entity, [$entity->getPreviewImageId()]);
79        }
80    }
81
82    public function editUploads(Karte $entity): void {
83        if ($entity->getPreviewImageId() !== null) {
84            $this->editOlzImages($entity, [$entity->getPreviewImageId()]);
85        }
86    }
87
88    protected function getEntityById(int $id): Karte {
89        $repo = $this->entityManager()->getRepository(Karte::class);
90        $entity = $repo->findOneBy(['id' => $id]);
91        if (!$entity) {
92            throw new HttpError(404, "Nicht gefunden.");
93        }
94        return $entity;
95    }
96
97    // ---
98
99    /** @return ?OlzKarteKind */
100    protected function getKindForApi(Karte $entity): ?string {
101        switch ($entity->getKind()) {
102            case 'ol': return 'ol';
103            case 'stadt': return 'stadt';
104            case 'scool': return 'scool';
105            case null: return null;
106            default: throw new \Exception("Unknown karten kind: {$entity->getKind()} ({$entity})");
107        }
108    }
109}