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