Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 69
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserEndpointTrait
0.00% covered (danger)
0.00%
0 / 69
0.00% covered (danger)
0.00%
0 / 8
1122
0.00% covered (danger)
0.00%
0 / 1
 configureUserEndpointTrait
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getEntityData
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
182
 updateEntityWithData
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
20
 persistUploads
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 editUploads
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 getEntityById
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 getGenderForApi
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
42
 getSiCardNumberForApi
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace Olz\Users\Endpoints;
4
5use Olz\Api\ApiObjects\IsoCountry;
6use Olz\Entity\Users\User;
7use Olz\Utils\WithUtilsTrait;
8use PhpTypeScriptApi\HttpError;
9use PhpTypeScriptApi\PhpStan\IsoDate;
10
11/**
12 * @phpstan-type OlzUserId int
13 * @phpstan-type OlzUserData array{
14 *   parentUserId?: ?int,
15 *   firstName: non-empty-string,
16 *   lastName: non-empty-string,
17 *   username: non-empty-string,
18 *   password?: ?non-empty-string,
19 *   email?: ?non-empty-string,
20 *   phone?: ?non-empty-string,
21 *   gender?: ?('M'|'F'|'O'),
22 *   birthdate?: ?IsoDate,
23 *   street?: ?non-empty-string,
24 *   postalCode?: ?non-empty-string,
25 *   city?: ?non-empty-string,
26 *   region?: ?non-empty-string,
27 *   countryCode?: ?IsoCountry,
28 *   siCardNumber?: ?int<100000, max>,
29 *   solvNumber?: ?non-empty-string,
30 *   avatarImageId?: ?non-empty-string,
31 * }
32 */
33trait UserEndpointTrait {
34    use WithUtilsTrait;
35
36    public function configureUserEndpointTrait(): void {
37        $this->phpStanUtils->registerApiObject(IsoDate::class);
38        $this->phpStanUtils->registerApiObject(IsoCountry::class);
39    }
40
41    /** @return OlzUserData */
42    public function getEntityData(User $entity): array {
43        return [
44            'parentUserId' => $entity->getParentUserId(),
45            'firstName' => $entity->getFirstName() ?: '-',
46            'lastName' => $entity->getLastName() ?: '-',
47            'username' => $entity->getUsername() ?: '-',
48            'password' => null,
49            'email' => $entity->getEmail() ? $entity->getEmail() : null,
50            'phone' => $entity->getPhone() ? $entity->getPhone() : null,
51            'gender' => $this->getGenderForApi($entity),
52            'birthdate' => IsoDate::fromDateTime($entity->getBirthdate()),
53            'street' => $entity->getStreet() ? $entity->getStreet() : null,
54            'postalCode' => $entity->getPostalCode() ? $entity->getPostalCode() : null,
55            'city' => $entity->getCity() ? $entity->getCity() : null,
56            'region' => $entity->getRegion() ? $entity->getRegion() : null,
57            'countryCode' => $entity->getCountryCode() ? IsoCountry::fromData($entity->getCountryCode()) : null,
58            'siCardNumber' => $this->getSiCardNumberForApi($entity),
59            'solvNumber' => $entity->getSolvNumber() ? $entity->getSolvNumber() : null,
60            'avatarImageId' => $entity->getAvatarImageId() ? $entity->getAvatarImageId() : null,
61        ];
62    }
63
64    /** @param OlzUserData $input_data */
65    public function updateEntityWithData(User $entity, array $input_data): void {
66        $birthdate = $input_data['birthdate'] ?? null;
67        $valid_birthdate = $birthdate
68            ? new \DateTime($birthdate->format('Y-m-d').' 12:00:00')
69            : null;
70        $avatar_image_id = $input_data['avatarImageId'] ?? null;
71        $valid_avatar_image_id = $avatar_image_id
72            ? $this->uploadUtils()->getValidUploadId($avatar_image_id)
73            : null;
74        $si_card_number = $input_data['siCardNumber'] ?? null;
75        $valid_si_card_number = $si_card_number ? strval($si_card_number) : null;
76
77        $entity->setParentUserId($input_data['parentUserId'] ?? null);
78        $entity->setUsername($input_data['username']);
79        $entity->setFirstName($input_data['firstName']);
80        $entity->setLastName($input_data['lastName']);
81        $entity->setEmail($input_data['email'] ?? null);
82        $entity->setPhone($input_data['phone'] ?? null);
83        $entity->setGender($input_data['gender'] ?? null);
84        $entity->setBirthdate($valid_birthdate);
85        $entity->setStreet($input_data['street'] ?? null);
86        $entity->setPostalCode($input_data['postalCode'] ?? null);
87        $entity->setCity($input_data['city'] ?? null);
88        $entity->setRegion($input_data['region'] ?? null);
89        $entity->setCountryCode($input_data['countryCode']?->data());
90        $entity->setSiCardNumber($valid_si_card_number);
91        $entity->setSolvNumber($input_data['solvNumber'] ?? null);
92        $entity->setAvatarImageId($valid_avatar_image_id);
93    }
94
95    /** @param OlzUserData $input_data */
96    public function persistUploads(User $entity, array $input_data): void {
97        if ($entity->getAvatarImageId()) {
98            $this->persistOlzImages($entity, [$entity->getAvatarImageId()]);
99        }
100    }
101
102    public function editUploads(User $entity): void {
103        if ($entity->getAvatarImageId() !== null) {
104            $this->editOlzImages($entity, [$entity->getAvatarImageId()]);
105        }
106    }
107
108    protected function getEntityById(int $id): User {
109        $repo = $this->entityManager()->getRepository(User::class);
110        $entity = $repo->findOneBy(['id' => $id]);
111        if (!$entity) {
112            throw new HttpError(404, "Nicht gefunden.");
113        }
114        return $entity;
115    }
116
117    // ---
118
119    /** @return 'M'|'F'|'O'|null */
120    protected function getGenderForApi(User $entity): ?string {
121        switch ($entity->getGender()) {
122            case 'M': return 'M';
123            case 'F': return 'F';
124            case 'O': return 'O';
125            case null: return null;
126            default: throw new \Exception("Unknown Gender: {$entity->getGender()} ({$entity})");
127        }
128    }
129
130    /** @return ?int<100000, max> */
131    protected function getSiCardNumberForApi(User $entity): ?int {
132        $string = $entity->getSiCardNumber();
133        if (!$string) {
134            return null;
135        }
136        $number = intval($string);
137        if ($number < 100000) {
138            throw new \Exception("Invalid SI Card Number: {$string} ({$entity})");
139        }
140        return $number;
141    }
142}