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