Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 55
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
GetPrefillValuesEndpoint
0.00% covered (danger)
0.00%
0 / 55
0.00% covered (danger)
0.00%
0 / 4
420
0.00% covered (danger)
0.00%
0 / 1
 configure
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 handle
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 1
110
 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\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    public function configure(): void {
40        parent::configure();
41        $this->phpStanUtils->registerApiObject(IsoDate::class);
42        $this->phpStanUtils->registerApiObject(IsoCountry::class);
43    }
44
45    protected function handle(mixed $input): mixed {
46        $this->checkPermission('any');
47
48        $auth_user = $this->authUtils()->getCurrentUser();
49        $user_id = $input['userId'] ?? null;
50        if ($user_id) {
51            $user_repo = $this->entityManager()->getRepository(User::class);
52            $user = $user_repo->findOneBy(['id' => $user_id]);
53            if (!$user || $user->getParentUserId() != $auth_user?->getId()) {
54                throw new HttpError(403, "Kein Zugriff!");
55            }
56        } else {
57            $user = $auth_user;
58        }
59        $this->generalUtils()->checkNotNull($user, "No user");
60
61        $first_name = $user->getFirstName() ?: '-';
62        $last_name = $user->getLastName() ?: '-';
63        $username = $user->getUsername() ?: '-';
64        $email = $user->getEmail() ?: '-';
65        $phone = $user->getPhone() ?: '-';
66        $gender = $this->getGenderForApi($user);
67        $birthdate = $user->getBirthdate();
68        $street = $user->getStreet();
69        $postal_code = $user->getPostalCode();
70        $city = $user->getCity();
71        $region = $user->getRegion();
72        $country_code = $user->getCountryCode();
73        $solv_number = $user->getSolvNumber();
74
75        return [
76            'firstName' => $first_name,
77            'lastName' => $last_name,
78            'username' => $username,
79            'email' => $email,
80            'phone' => $phone,
81            'gender' => $gender,
82            'birthdate' => IsoDate::fromDateTime($birthdate),
83            'street' => $street,
84            'postalCode' => $postal_code,
85            'city' => $city,
86            'region' => $region,
87            'countryCode' => $country_code ? IsoCountry::fromData($country_code) : null,
88            'siCardNumber' => $this->getSiCardNumberForApi($user),
89            'solvNumber' => $solv_number,
90        ];
91    }
92
93    // ---
94
95    /** @return 'M'|'F'|'O'|null */
96    protected function getGenderForApi(User $entity): ?string {
97        switch ($entity->getGender()) {
98            case 'M': return 'M';
99            case 'F': return 'F';
100            case 'O': return 'O';
101            case null: return null;
102            default: throw new \Exception("Unknown Gender: {$entity->getGender()} ({$entity})");
103        }
104    }
105
106    /** @return ?int<100000, max> */
107    protected function getSiCardNumberForApi(User $entity): ?int {
108        $string = $entity->getSiCardNumber();
109        if ($string === null) {
110            return null;
111        }
112        $number = intval($string);
113        if ($number < 100000) {
114            throw new \Exception("Invalid SI Card Number: {$string} ({$entity})");
115        }
116        return $number;
117    }
118}