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