Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 69 |
|
0.00% |
0 / 8 |
CRAP | |
0.00% |
0 / 1 |
UserEndpointTrait | |
0.00% |
0 / 69 |
|
0.00% |
0 / 8 |
1122 | |
0.00% |
0 / 1 |
configureUserEndpointTrait | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
getEntityData | |
0.00% |
0 / 19 |
|
0.00% |
0 / 1 |
182 | |||
updateEntityWithData | |
0.00% |
0 / 26 |
|
0.00% |
0 / 1 |
20 | |||
persistUploads | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
6 | |||
editUploads | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
6 | |||
getEntityById | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
6 | |||
getGenderForApi | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
42 | |||
getSiCardNumberForApi | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
12 |
1 | <?php |
2 | |
3 | namespace Olz\Users\Endpoints; |
4 | |
5 | use Olz\Api\ApiObjects\IsoCountry; |
6 | use Olz\Entity\Users\User; |
7 | use Olz\Utils\WithUtilsTrait; |
8 | use PhpTypeScriptApi\HttpError; |
9 | use 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 | */ |
33 | trait 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 | } |