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