Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.67% covered (success)
96.67%
58 / 60
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
RoleEdit
96.67% covered (success)
96.67%
58 / 60
0.00% covered (danger)
0.00%
0 / 2
12
0.00% covered (danger)
0.00%
0 / 1
 readResponse
97.30% covered (success)
97.30%
36 / 37
0.00% covered (danger)
0.00%
0 / 1
7
 writeUpdatedRole
95.65% covered (success)
95.65%
22 / 23
0.00% covered (danger)
0.00%
0 / 1
5
1<?php
2
3namespace BO\Zmsadmin;
4
5use BO\Mellon\Validator;
6use BO\Slim\Render;
7use BO\Zmsentities\Exception\UserAccountMissingRights;
8use BO\Zmsentities\Role;
9
10class RoleEdit extends BaseController
11{
12    /**
13     * @return \Psr\Http\Message\ResponseInterface
14     */
15    public function readResponse(
16        \Psr\Http\Message\RequestInterface $request,
17        \Psr\Http\Message\ResponseInterface $response,
18        array $args
19    ) {
20        $workstation = \App::$http->readGetResult('/workstation/', ['resolveReferences' => 1])->getEntity();
21        if (!$workstation->getUseraccount()->hasPermissions(['superuser'])) {
22            throw new UserAccountMissingRights();
23        }
24
25        $roleId = (int) Validator::value($args['id'] ?? null)->isNumber()->getValue();
26        $validator = $request->getAttribute('validator');
27        $confirmSuccess = $validator->getParameter('success')->isString()->getValue();
28        $permissionList = \App::$http->readGetResult('/permissions/', [])->getCollection();
29
30        $role = \App::$http->readGetResult('/roles/' . $roleId . '/', [])->getEntity();
31        if (!$role->hasId()) {
32            return Render::redirect('roles', [], []);
33        }
34
35        $submitted = null;
36        $result = null;
37        if ($request->getMethod() === 'POST') {
38            $input = $request->getParsedBody();
39            $submitted = is_array($input) ? $input : [];
40            $result = $this->writeUpdatedRole($roleId, $role->name, $submitted);
41            if ($result instanceof Role) {
42                return Render::redirect(
43                    'roleEdit',
44                    ['id' => $roleId],
45                    ['success' => 'role_updated']
46                );
47            }
48        }
49
50        return Render::withHtml(
51            $response,
52            'page/roleForm.twig',
53            [
54                'title' => 'Rolle bearbeiten',
55                'menuActive' => 'roles',
56                'workstation' => $workstation,
57                'permissionList' => $permissionList,
58                'role' => $submitted !== null ? $submitted : $role,
59                'formAction' => 'edit',
60                'roleId' => $roleId,
61                'success' => $confirmSuccess,
62                'exception' => $result,
63            ]
64        );
65    }
66
67    protected function writeUpdatedRole(int $roleId, string $currentRoleName, array $input): Role|array|null
68    {
69        $data = $input;
70        unset($data['id'], $data['assignedUserCount']);
71        $permissions = $data['permissions'] ?? [];
72        $data['permissions'] = is_array($permissions)
73            ? array_values(array_unique($permissions))
74            : [];
75        $entity = (new Role($data))->withCleanedUpFormData();
76
77        if ($entity->name !== $currentRoleName) {
78            $roles = \App::$http->readGetResult('/roles/', [])->getCollection();
79            foreach ($roles as $existing) {
80                if ((string) $existing->name === $entity->name) {
81                    return [
82                        'template' => 'exception/bo/zmsentities/exception/schemavalidation.twig',
83                        'include' => true,
84                        'data' => [
85                            'name' => [
86                                'messages' => ['Eine Rolle mit diesem Namen existiert bereits.'],
87                            ],
88                        ],
89                    ];
90                }
91            }
92        }
93
94        return $this->handleEntityWrite(function () use ($roleId, $entity) {
95            return \App::$http->readPostResult('/roles/' . $roleId . '/', $entity)->getEntity();
96        });
97    }
98}