Passed
Push — master ( db1581...a5af1f )
by Ferry
04:30
created

SidebarMenus   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 23
eloc 56
dl 0
loc 91
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A loadData() 0 8 2
A checkPrivilege() 0 9 3
A assignToModel() 0 24 4
A rolePrivilege() 0 2 1
C all() 0 34 13
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: User
5
 * Date: 4/24/2019
6
 * Time: 11:22 PM
7
 */
8
9
namespace crocodicstudio\crudbooster\helpers;
10
11
12
use crocodicstudio\crudbooster\controllers\CBController;
13
use crocodicstudio\crudbooster\models\SidebarModel;
14
use Illuminate\Support\Facades\DB;
15
16
class SidebarMenus
17
{
18
    /**
19
     * @param $menu
20
     * @return SidebarModel
21
     */
22
    private function assignToModel($menu) {
23
        $model = new SidebarModel();
24
        $model->setId($menu->id);
25
        if($menu->type == "url") {
26
            $model->setUrl($menu->path);
27
            $model->setIcon($menu->icon);
28
            $model->setName($menu->name);
29
            $model->setBasepath(basename($model->getUrl()));
30
        }elseif ($menu->type == "module") {
31
            $module = cb()->find("cb_modules", $menu->cb_modules_id);
32
            $className = '\App\Http\Controllers\\'.$module->controller;
33
            $controllerClass = new $className();
34
            /** @var CBController $controllerClass */
35
            $model->setUrl(cb()->getAdminUrl($controllerClass->getData("permalink")));
0 ignored issues
show
Bug introduced by
The method getData() does not exist on crocodicstudio\crudboost...ontrollers\CBController. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

35
            $model->setUrl(cb()->getAdminUrl($controllerClass->/** @scrutinizer ignore-call */ getData("permalink")));
Loading history...
36
            $model->setIcon($module->icon);
37
            $model->setName($module->name);
38
            $model->setBasepath(basename($model->getUrl()));
39
        }elseif ($menu->type == "path") {
40
            $model->setUrl(cb()->getAdminUrl($menu->path));
41
            $model->setIcon($menu->icon);
42
            $model->setName($menu->name);
43
            $model->setBasepath(basename($model->getUrl()));
44
        }
45
        return $model;
46
    }
47
48
    private function loadData($parent_id = null) {
49
        $menus = DB::table("cb_menus");
50
        if($parent_id) {
51
            $menus->where("parent_cb_menus_id",$parent_id);
52
        }else{
53
            $menus->whereNull("parent_cb_menus_id");
54
        }
55
        return $menus->orderBy("sort_number","asc")->get();
56
    }
57
58
    private function rolePrivilege($cb_roles_id, $cb_menus_id) {
59
        return cb()->find("cb_role_privileges",['cb_roles_id'=>$cb_roles_id,'cb_menus_id'=>$cb_menus_id]);
60
    }
61
62
    private function checkPrivilege($roles_id,$menu) {
63
        if($roles_id) {
64
            $privilege = $this->rolePrivilege($roles_id, $menu->id);
65
            if(!$privilege->can_browse) {
66
                return false;
67
            }
68
        }
69
70
        return true;
71
    }
72
73
    public function all($withPrivilege = true) {
74
        $roles_id = ($withPrivilege)?cb()->session()->roleId():null;
75
        $menus = $this->loadData();
76
        $result = [];
77
        foreach($menus as $menu) {
78
79
            if($withPrivilege && !$this->checkPrivilege($roles_id, $menu)) continue;
80
81
            $sidebarModel = $this->assignToModel($menu);
82
            if($menus2 = $this->loadData($menu->id)) {
83
                $sub1 = [];
84
                foreach ($menus2 as $menu2) {
85
86
                    if($withPrivilege && !$this->checkPrivilege($roles_id, $menu2)) continue;
87
88
                    $sidebarModel2 = $this->assignToModel($menu2);
89
                    if($menus3 = $this->loadData($menu2->id)) {
90
                        $sub2 = [];
91
                        foreach ($menus3 as $menu3) {
92
93
                            if($withPrivilege && !$this->checkPrivilege($roles_id, $menu3)) continue;
94
95
                            $sidebarModel3 = $this->assignToModel($menu3);
96
                            $sub2[] = $sidebarModel3;
97
                        }
98
                        $sidebarModel2->setSub($sub2);
99
                    }
100
                    $sub1[] = $sidebarModel2;
101
                }
102
                $sidebarModel->setSub($sub1);
103
            }
104
            $result[] = $sidebarModel;
105
        }
106
        return $result;
107
    }
108
109
}