PermissionMiddleware   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3
Metric Value
wmc 10
lcom 1
cbo 3
dl 0
loc 95
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A handle() 0 18 2
A getSegmentPosition() 0 10 3
A getPermission() 0 4 1
A getModuleName() 0 4 1
A getEntityName() 0 6 2
1
<?php namespace Modules\Core\Http\Middleware;
2
3
use Illuminate\Http\Request;
4
use Illuminate\Routing\Route;
5
use Illuminate\Support\Facades\Redirect;
6
use Laracasts\Flash\Flash;
7
use Modules\Core\Contracts\Authentication;
8
9
class PermissionMiddleware
10
{
11
    /**
12
     * @var Authentication
13
     */
14
    private $auth;
15
    /**
16
     * @var Route
17
     */
18
    private $route;
19
20
    /**
21
     * @param Authentication $auth
22
     * @param Route          $route
23
     */
24
    public function __construct(Authentication $auth, Route $route)
25
    {
26
        $this->auth = $auth;
27
        $this->route = $route;
28
    }
29
30
    /**
31
     * @param Request  $request
32
     * @param callable $next
33
     * @return mixed
34
     */
35
    public function handle(Request $request, \Closure $next)
36
    {
37
        $action = $this->route->getActionName();
38
        $actionMethod = substr($action, strpos($action, "@") + 1);
39
40
        $segmentPosition = $this->getSegmentPosition($request);
41
        $moduleName = $this->getModuleName($request, $segmentPosition);
42
        $entityName = $this->getEntityName($request, $segmentPosition);
43
        $permission = $this->getPermission($moduleName, $entityName, $actionMethod);
44
45
        if (!$this->auth->hasAccess($permission)) {
46
            Flash::error(trans('core::core.permission denied', ['permission' => $permission]));
47
48
            return Redirect::back();
49
        }
50
51
        return $next($request);
52
    }
53
54
    /**
55
     * Get the correct segment position based on the locale or not
56
     *
57
     * @param $request
58
     * @return mixed
59
     */
60
    private function getSegmentPosition(Request $request)
61
    {
62
        $segmentPosition = config('laravellocalization.hideDefaultLocaleInURL', false) ? 3 : 4;
63
64
        if ($request->segment($segmentPosition) == config('asgard.core.core.admin-prefix')) {
65
            return ++ $segmentPosition;
66
        }
67
68
        return $segmentPosition;
69
    }
70
71
    /**
72
     * @param $moduleName
73
     * @param $entityName
74
     * @param $actionMethod
75
     * @return string
76
     */
77
    private function getPermission($moduleName, $entityName, $actionMethod)
78
    {
79
        return ltrim($moduleName . '.' . $entityName . '.' . $actionMethod, '.');
80
    }
81
82
    /**
83
     * @param Request $request
84
     * @param         $segmentPosition
85
     * @return string
86
     */
87
    protected function getModuleName(Request $request, $segmentPosition)
88
    {
89
        return $request->segment($segmentPosition - 1);
90
    }
91
92
    /**
93
     * @param Request $request
94
     * @param         $segmentPosition
95
     * @return string
96
     */
97
    protected function getEntityName(Request $request, $segmentPosition)
98
    {
99
        $entityName = $request->segment($segmentPosition);
100
101
        return $entityName ?: 'dashboard';
102
    }
103
}
104