Test Failed
Pull Request — master (#22)
by Maximo
05:35
created

RolesAccesListController::create()   A

Complexity

Conditions 5
Paths 10

Size

Total Lines 38
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 5.2742

Importance

Changes 0
Metric Value
cc 5
eloc 17
nc 10
nop 0
dl 0
loc 38
ccs 14
cts 18
cp 0.7778
crap 5.2742
rs 9.3888
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gewaer\Api\Controllers;
6
7
use Gewaer\Models\AccessList;
8
use Phalcon\Http\Response;
9
use Phalcon\Acl\Role;
10
use Phalcon\Validation;
11
use Phalcon\Validation\Validator\PresenceOf;
12
use Gewaer\Models\Apps;
13
use Gewaer\Exception\NotFoundHttpException;
14
use Gewaer\Exception\ServerErrorHttpException;
15
use Gewaer\Models\Roles;
16
use Baka\Http\QueryParser;
17
18
/**
19
 * Class RolesController
20
 *
21
 * @package Gewaer\Api\Controllers
22
 *
23
 * @property Users $userData
24
 * @property Request $request
25
 * @property Config $config
26
 * @property \Baka\Mail\Message $mail
27
 * @property Apps $app
28
 *
29
 */
30
class RolesAccesListController extends BaseController
31
{
32
    /*
33
     * fields we accept to create
34
     *
35
     * @var array
36
     */
37
    protected $createFields = [];
38
39
    /*
40
     * fields we accept to create
41
     *
42
     * @var array
43
     */
44
    protected $updateFields = [];
45
46
    /**
47
     * set objects
48
     *
49
     * @return void
50
     */
51 5
    public function onConstruct()
52
    {
53 5
        $this->model = new AccessList();
54
55
        //get the list of roes for the systema + my company
56 5
        $this->additionalSearchFields = [
57 5
            ['is_deleted', ':', 0],
58 5
            ['apps_id', ':', $this->app->getId()],
59
        ];
60 5
    }
61
62
    /**
63
     * Add a new item
64
     *
65
     * @method POST
66
     * @url /v1/roles-acceslist
67
     *
68
     * @return Response
69
     */
70 1
    public function create() : Response
71
    {
72 1
        $request = $this->request->getPost();
73
74 1
        if (empty($request)) {
75
            $request = $this->request->getJsonRawBody(true);
76
        }
77
78
        //Ok let validate user password
79 1
        $validation = new Validation();
80 1
        $validation->add('roles', new PresenceOf(['message' => _('Role information is required.')]));
81 1
        $validation->add('access', new PresenceOf(['message' => _('Access list is required.')]));
82
83
        //validate this form for password
84 1
        $messages = $validation->validate($request);
85 1
        if (count($messages)) {
86
            foreach ($messages as $message) {
87
                throw new ServerErrorHttpException((string)$message);
88
            }
89
        }
90
91
        //set the company and app
92 1
        $this->acl->setCompany($this->userData->DefaultCompany);
0 ignored issues
show
Bug Best Practice introduced by
The property acl does not exist on Gewaer\Api\Controllers\RolesAccesListController. Since you implemented __get, consider adding a @property annotation.
Loading history...
93 1
        $this->acl->setApp($this->app);
94
95 1
        $scope = 1;
96
        //create the role , the scope is level 1 , that means user
97 1
        $this->acl->addRole(new Role($request['roles']['name'], $request['roles']['description']), $scope);
98
99
        /**
100
         * we always deny permision, by default the canvas set allow to all
101
         * so we only have to take away permissions
102
         */
103 1
        foreach ($request['access'] as $access) {
104 1
            $this->acl->deny($request['roles']['name'], $access['resources_name'], $access['access_name']);
105
        }
106
107
        return $this->response($request['roles']);
108
    }
109
110
    /**
111
     * get item
112
     *
113
     * @param mixed $id
114
     *
115
     * @method GET
116
     * @url /v1/roles-acceslist/{id}
117
     *
118
     * @return Response
119
     */
120
    public function getById($id) : Response
121
    {
122
        $objectInfo = $this->model->findFirst([
123
            'roles_id = ?0 AND is_deleted = 0 AND apps_id in (?1, ?2)',
124
            'bind' => [$id, $this->app->getId(), Apps::GEWAER_DEFAULT_APP_ID],
125
        ]);
126
127
        //get relationship
128
        if ($this->request->hasQuery('relationships')) {
129
            $relationships = $this->request->getQuery('relationships', 'string');
130
131
            $objectInfo = QueryParser::parseRelationShips($relationships, $objectInfo);
132
        }
133
134
        if ($objectInfo) {
135
            return $this->response($objectInfo);
136
        } else {
137
            throw new NotFoundHttpException('Record not found');
138
        }
139
    }
140
141
    /**
142
     * Update a new Entry
143
     *
144
     * @method PUT
145
     * @url /v1/roles-acceslist/{id}
146
     *
147
     * @return Response
148
     */
149 1
    public function edit($id) : Response
150
    {
151 1
        if (!$role = Roles::findFirst($id)) {
152
            throw new NotFoundHttpException('Record not found');
153
        }
154
155 1
        $request = $this->request->getPut();
156
157 1
        if (empty($request)) {
158
            $request = $this->request->getJsonRawBody(true);
159
        }
160
161
        //Ok let validate user password
162 1
        $validation = new Validation();
163 1
        $validation->add('roles', new PresenceOf(['message' => _('Role information is required.')]));
164 1
        $validation->add('access', new PresenceOf(['message' => _('Access list is required.')]));
165
166
        //validate this form for password
167 1
        $messages = $validation->validate($request);
168 1
        if (count($messages)) {
169
            foreach ($messages as $message) {
170
                throw new ServerErrorHttpException((string)$message);
171
            }
172
        }
173
174
        //set the company and app
175 1
        $this->acl->setCompany($this->userData->DefaultCompany);
0 ignored issues
show
Bug Best Practice introduced by
The property acl does not exist on Gewaer\Api\Controllers\RolesAccesListController. Since you implemented __get, consider adding a @property annotation.
Loading history...
176 1
        $this->acl->setApp($this->app);
177
178 1
        $role->name = $request['roles']['name'];
179 1
        $role->description = $request['roles']['description'];
180 1
        if (!$role->update()) {
181
            throw new ServerErrorHttpException((string) current($role->getMessages()));
182
        }
183
184
        //delete the acces list before hand
185 1
        AccessList::deleteAllByRole($role);
186
187
        /**
188
         * we always deny permision, by default the canvas set allow to all
189
         * so we only have to take away permissions
190
         */
191 1
        foreach ($request['access'] as $access) {
192 1
            $this->acl->deny($request['roles']['name'], $access['resources_name'], $access['access_name']);
193
        }
194
195
        return $this->response($role);
196
    }
197
198
    /**
199
     * delete a new Entry
200
     *
201
     * @method DELETE
202
     * @url /v1/roles-acceslist/{id}
203
     *
204
     * @return Response
205
     */
206
    public function delete($id) : Response
207
    {
208
        if ($role = Roles::findFirst($id)) {
209
            if ($this->softDelete == 1) {
210
                $role->softDelete();
211
            } else {
212
                //delete the acces list before hand
213
                AccessList::deleteAllByRole($role);
214
215
                $role->delete();
216
            }
217
218
            return $this->response(['Delete Successfully']);
219
        } else {
220
            throw new NotFoundHttpException('Record not found');
221
        }
222
    }
223
}
224