Completed
Push — master ( 634be5...2c8eb1 )
by Sherif
10:27
created

BaseApiController::deleted()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 4
1
<?php
2
namespace App\Modules\V1\Core\Http\Controllers;
3
4
use App\Http\Controllers\Controller;
5
use Illuminate\Http\Request;
6
7
class BaseApiController extends Controller
8
{
9
    /**
10
     * The model implementation.
11
     * 
12
     * @var model
13
     */
14
    protected $model;
15
16
    /**
17
     * The config implementation.
18
     * 
19
     * @var config
20
     */
21
    protected $config;
22
23
    public function __construct()
24
    {
25
        \Session::set('timeZoneDiff', \Request::header('time-zone-diff') ?: 0);
26
27
        $locale = \Request::header('locale');
28
        switch ($locale) 
29
        {
30
            case 'en':
31
            \App::setLocale('en');
32
            \Session::set('locale', 'en');
33
            break;
34
35
            case 'ar':
36
            \App::setLocale('ar');
37
            \Session::set('locale', 'ar');
38
            break;
39
40
            case 'all':
41
            \App::setLocale('en');
42
            \Session::set('locale', 'all');
43
            break;
44
45
            default:
46
            \App::setLocale('en');
47
            \Session::set('locale', 'en');
48
            break;
49
        }
50
        
51
        $this->config              = \CoreConfig::getConfig();
52
        $this->model               = property_exists($this, 'model') ? $this->model : false;
0 ignored issues
show
Documentation Bug introduced by
It seems like property_exists($this, '... ? $this->model : false can also be of type false. However, the property $model is declared as type object<App\Modules\V1\Co...Http\Controllers\model>. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
53
        $this->validationRules     = property_exists($this, 'validationRules') ? $this->validationRules : false;
54
        $this->skipPermissionCheck = property_exists($this, 'skipPermissionCheck') ? $this->skipPermissionCheck : [];
55
        $this->skipLoginCheck      = property_exists($this, 'skipLoginCheck') ? $this->skipLoginCheck : [];
56
        $this->relations           = array_key_exists($this->model, $this->config['relations']) ? $this->config['relations'][$this->model] : false;
57
        $route                     = explode('@',\Route::currentRouteAction())[1];
58
        $this->checkPermission($route);
59
    }
60
61
    /**
62
     * Fetch all records with relations from model repository.
63
     * 
64
     * @return \Illuminate\Http\Response
65
     */
66
    public function index() 
67
    {
68
        if ($this->model)
69
        {
70
            $relations = $this->relations && $this->relations['all'] ? $this->relations['all'] : [];
71
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->all($relations), 200);
72
        }
73
    }
74
75
    /**
76
     * Fetch the single object with relations from model repository.
77
     * 
78
     * @param  integer $id
79
     * @return \Illuminate\Http\Response
80
     */
81 View Code Duplication
    public function find($id) 
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
82
    {
83
        if ($this->model) 
84
        {
85
            $relations = $this->relations && $this->relations['find'] ? $this->relations['find'] : [];
86
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->find($id, $relations), 200);
87
        }
88
    }
89
90
    /**
91
     * Paginate all records with relations from model repository
92
     * that matche the given query.
93
     * 
94
     * @param  string  $query
95
     * @param  integer $perPage
96
     * @param  string  $sortBy
97
     * @param  boolean $desc
98
     * @return \Illuminate\Http\Response
99
     */
100 View Code Duplication
    public function search($query = '', $perPage = 15, $sortBy = 'created_at', $desc = 1) 
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
101
    {
102
        if ($this->model) 
103
        {
104
            $relations = $this->relations && $this->relations['search'] ? $this->relations['search'] : [];
105
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->search($query, $perPage, $relations, $sortBy, $desc), 200);
106
        }
107
    }
108
109
    /**
110
     * Fetch records from the storage based on the given
111
     * condition.
112
     * 
113
     * @param  \Illuminate\Http\Request  $request
114
     * @param  string  $sortBy
115
     * @param  boolean $desc
116
     * @return \Illuminate\Http\Response
117
     */
118 View Code Duplication
    public function findby(Request $request, $sortBy = 'created_at', $desc = 1) 
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
119
    {
120
        if ($this->model) 
121
        {
122
            $relations = $this->relations && $this->relations['findBy'] ? $this->relations['findBy'] : [];
123
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->findBy($request->all(), $relations, $sortBy, $desc), 200);
124
        }
125
    }
126
127
    /**
128
     * Fetch the first record from the storage based on the given
129
     * condition.
130
     * 
131
     * @param  \Illuminate\Http\Request  $request
132
     * @return \Illuminate\Http\Response
133
     */
134 View Code Duplication
    public function first(Request $request) 
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
135
    {
136
        if ($this->model) 
137
        {
138
            $relations = $this->relations && $this->relations['first'] ? $this->relations['first'] : [];
139
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->first($request->all(), $relations), 200);
140
        }
141
    }
142
143
    /**
144
     * Paginate all records with relations from model repository.
145
     * 
146
     * @param  integer $perPage
147
     * @param  string  $sortBy
148
     * @param  boolean $desc
149
     * @return \Illuminate\Http\Response
150
     */
151 View Code Duplication
    public function paginate($perPage = 15, $sortBy = 'created_at', $desc = 1) 
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
152
    {
153
        if ($this->model) 
154
        {
155
            $relations = $this->relations && $this->relations['paginate'] ? $this->relations['paginate'] : [];
156
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->paginate($perPage, $relations, $sortBy, $desc), 200);
157
        }
158
    }
159
160
    /**
161
     * Fetch all records with relations based on
162
     * the given condition from storage in pages.
163
     * 
164
     * @param  \Illuminate\Http\Request  $request
165
     * @param  integer $perPage
166
     * @param  string  $sortBy
167
     * @param  boolean $desc
168
     * @return \Illuminate\Http\Response
169
     */
170 View Code Duplication
    public function paginateby(Request $request, $perPage = 15, $sortBy = 'created_at', $desc = 1) 
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
171
    {
172
        if ($this->model) 
173
        {
174
            $relations = $this->relations && $this->relations['paginateBy'] ? $this->relations['paginateBy'] : [];
175
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->paginateBy($request->all(), $perPage, $relations, $sortBy, $desc), 200);
176
        }
177
    }
178
179
    /**
180
     * Save the given model to repository.
181
     * 
182
     * @param  \Illuminate\Http\Request  $request
183
     * @return \Illuminate\Http\Response
184
     */
185
    public function save(Request $request) 
186
    {
187
        foreach ($this->validationRules as &$rule) 
188
        {
189
            if (strpos($rule, 'exists') && ! strpos($rule, 'deleted_at,NULL')) 
190
            {
191
                $rule .= ',deleted_at,NULL';
192
            }
193
194
            if ($request->has('id')) 
195
            {
196
                $rule = str_replace('{id}', $request->get('id'), $rule);
197
            }
198
            else
199
            {
200
                $rule = str_replace(',{id}', '', $rule);
201
            }
202
        }
203
        
204
        $this->validate($request, $this->validationRules);
205
206
        if ($this->model) 
207
        {
208
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->save($request->all()), 200);
209
        }
210
    }
211
212
    /**
213
     * Delete by the given id from model repository.
214
     * 
215
     * @param  integer  $id
216
     * @return \Illuminate\Http\Response
217
     */
218
    public function delete($id) 
219
    {
220
        if ($this->model) 
221
        {
222
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->delete($id), 200);
223
        }
224
    }
225
226
    /**
227
     * Return the deleted models in pages based on the given conditions.
228
     *
229
     * @param  \Illuminate\Http\Request  $request
230
     * @param  integer $perPage
231
     * @param  string  $sortBy
232
     * @param  boolean $desc
233
     * @return \Illuminate\Http\Response
234
     */
235
    public function deleted(Request $request, $perPage = 15, $sortBy = 'created_at', $desc = 1) 
236
    {
237
        return \Response::json(call_user_func_array("\Core::{$this->model}", [])->deleted($request->all(), $perPage, $sortBy, $desc), 200);
238
    }
239
240
    /**
241
     * Restore the deleted model.
242
     * 
243
     * @param  integer  $id
244
     * @return \Illuminate\Http\Response
245
     */
246
    public function restore($id) 
247
    {
248
        if ($this->model) 
249
        {
250
            return \Response::json(call_user_func_array("\Core::{$this->model}", [])->restore($id), 200);
251
        }
252
    }
253
254
    /**
255
     * Check if the logged in user can do the given permission.
256
     * 
257
     * @param  string $permission
258
     * @return void
259
     */
260
    private function checkPermission($permission)
261
    {
262
        $permission = $permission !== 'index' ? $permission : 'list';
263
        if ( ! in_array($permission, $this->skipLoginCheck)) 
264
        {
265
            $user = \Core::users()->find(\JWTAuth::parseToken()->authenticate()->id);
266
            if ($user->blocked)
267
            {
268
                \ErrorHandler::userIsBlocked();
269
            }
270
            
271
            if ( ! in_array($permission, $this->skipPermissionCheck) && ! \Core::users()->can($permission, $this->model))
272
            {
273
                \ErrorHandler::noPermissions();
274
            }
275
        }
276
    }
277
}
278