Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.38% covered (success)
90.38%
47 / 52
33.33% covered (danger)
33.33%
1 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
GetPrefillValuesEndpoint
90.38% covered (success)
90.38%
47 / 52
33.33% covered (danger)
33.33%
1 / 3
19.32
0.00% covered (danger)
0.00%
0 / 1
 handle
100.00% covered (success)
100.00%
39 / 39
100.00% covered (success)
100.00%
1 / 1
10
 getGenderForApi
50.00% covered (danger)
50.00%
3 / 6
0.00% covered (danger)
0.00%
0 / 1
10.50
 getSiCardNumberForApi
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
3.21
1<?php
2
3namespace Olz\Apps\Anmelden\Endpoints;
4
5use Olz\Api\ApiObjects\IsoCountry;
6use Olz\Api\OlzTypedEndpoint;
7use Olz\Entity\Users\User;
8use PhpTypeScriptApi\HttpError;
9use PhpTypeScriptApi\PhpStan\IsoDate;
10
11/**
12 * Note: `userId` can be of a managed user.
13 *
14 * @phpstan-type UserPrefillData array{
15 *   firstName: non-empty-string,
16 *   lastName: non-empty-string,
17 *   username: non-empty-string,
18 *   email: non-empty-string,
19 *   phone?: ?non-empty-string,
20 *   gender?: ?('M'|'F'|'O'),
21 *   birthdate?: ?IsoDate,
22 *   street?: ?string,
23 *   postalCode?: ?string,
24 *   city?: ?string,
25 *   region?: ?string,
26 *   countryCode?: ?IsoCountry,
27 *   siCardNumber?: ?int<100000, max>,
28 *   solvNumber?: ?string,
29 * }
30 *
31 * @extends OlzTypedEndpoint<
32 *   array{
33 *     userId?: ?int<1, max>,
34 *   },
35 *   UserPrefillData,
36 * >
37 */
38class GetPrefillValuesEndpoint extends OlzTypedEndpoint {
39    protected function handle(mixed $input): mixed {
40        $this->checkPermission('any');
41
42        $auth_user = $this->authUtils()->getCurrentUser();
43        $user_id = $input['userId'] ?? null;
44        if ($user_id) {
45            $user_repo = $this->entityManager()->getRepository(User::class);
46            $user = $user_repo->findOneBy(['id' => $user_id]);
47            if (!$user || $user->getParentUserId() != $auth_user?->getId()) {
48                throw new HttpError(403, "Kein Zugriff!");
49            }
50        } else {
51            $user = $auth_user;
52        }
53        $this->generalUtils()->checkNotNull($user, "No user");
54
55        $first_name = $user->getFirstName() ?: '-';
56        $last_name = $user->getLastName() ?: '-';
57        $username = $user->getUsername() ?: '-';
58        $email = $user->getEmail() ?: '-';
59        $phone = $user->getPhone() ?: '-';
60        $gender = $this->getGenderForApi($user);
61        $birthdate = $user->getBirthdate();
62        $street = $user->getStreet();
63        $postal_code = $user->getPostalCode();
64        $city = $user->getCity();
65        $region = $user->getRegion();
66        $country_code = $user->getCountryCode();
67        $solv_number = $user->getSolvNumber();
68
69        return [
70            'firstName' => $first_name,
71            'lastName' => $last_name,
72            'username' => $username,
73            'email' => $email,
74            'phone' => $phone,
75            'gender' => $gender,
76            'birthdate' => IsoDate::fromDateTime($birthdate),
77            'street' => $street,
78            'postalCode' => $postal_code,
79            'city' => $city,
80            'region' => $region,
81            'countryCode' => $country_code ? IsoCountry::fromData($country_code) : null,
82            'siCardNumber' => $this->getSiCardNumberForApi($user),
83            'solvNumber' => $solv_number,
84        ];
85    }
86
87    // ---
88
89    /** @return 'M'|'F'|'O'|null */
90    protected function getGenderForApi(User $entity): ?string {
91        switch ($entity->getGender()) {
92            case 'M': return 'M';
93            case 'F': return 'F';
94            case 'O': return 'O';
95            case null: return null;
96            default: throw new \Exception("Unknown Gender: {$entity->getGender()} ({$entity})");
97        }
98    }
99
100    /** @return ?int<100000, max> */
101    protected function getSiCardNumberForApi(User $entity): ?int {
102        $string = $entity->getSiCardNumber();
103        if ($string === null) {
104            return null;
105        }
106        $number = intval($string);
107        if ($number < 100000) {
108            throw new \Exception("Invalid SI Card Number: {$string} ({$entity})");
109        }
110        return $number;
111    }
112}