Completed
Branch master (8e0976)
by Adam
04:13
created

PermissionsController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Coyote\Http\Controllers\Adm\Forum;
4
5
use Coyote\Events\ForumWasSaved;
6
use Coyote\Http\Controllers\Adm\BaseController;
7
use Coyote\Http\Grids\Adm\Forum\PermissionsGrid;
8
use Coyote\Permission;
9
use Coyote\Repositories\Contracts\ForumRepositoryInterface as ForumRepository;
10
use Coyote\Repositories\Contracts\GroupRepositoryInterface as GroupRepository;
11
use Boduch\Grid\Source\CollectionSource;
12
use Coyote\Services\Forum\TreeBuilder;
13
use Illuminate\Http\Request;
14
15
class PermissionsController extends BaseController
16
{
17
    /**
18
     * @var ForumRepository
19
     */
20
    private $forum;
21
22
    /**
23
     * @var GroupRepository
24
     */
25
    private $group;
26
27
    /**
28
     * @param ForumRepository $forum
29
     * @param GroupRepository $group
30
     */
31
    public function __construct(ForumRepository $forum, GroupRepository $group)
32
    {
33
        parent::__construct();
34
35
        $this->forum = $forum;
36
        $this->group = $group;
37
        $this->breadcrumb->push('Prawa dostępu', route('adm.forum.permissions'));
38
    }
39
40
    /**
41
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
42
     */
43
    public function index()
44
    {
45
        $categoriesList = (new TreeBuilder())->listById($this->forum->list());
46
47
        return $this->view('adm.forum.permissions.home')->with('categoriesList', $categoriesList);
48
    }
49
50
    /**
51
     * @param Request $request
52
     * @return \Illuminate\View\View
53
     */
54
    public function edit(Request $request)
55
    {
56
        /** @var \Coyote\Forum $forum */
57
        $forum = $this->forum->findOrFail((int) $request->input('id'));
58
        $permissions = $forum->permissions()->get();
59
        $groups = $this->group->all();
60
61
        $this->breadcrumb->push($forum->name);
62
63
        $data = collect();
64
65
        // ugly way to get only forum permissions
66
        foreach (Permission::where('name', 'ilike', 'forum%')->get() as $permission) {
67
            $row = collect([
68
                'name' => $permission->name,
69
                'description' => $permission->description,
70
                'permission_id' => $permission->id
71
            ]);
72
73
            foreach ($groups as $group) {
74
                $filtered = $permissions->filter(function ($value) use ($group, $permission) {
75
                    return $value->group_id == $group->id && $value->permission_id == $permission->id;
76
                })->first();
77
78
                $row['group_' . $group->id] = isset($filtered->value) ? $filtered->value : $permission->default;
79
            }
80
81
            $data->push($row);
82
        }
83
84
        $grid = $this
85
            ->gridBuilder()
86
            ->createGrid(PermissionsGrid::class)
87
            ->setEnablePagination(false)
88
            ->setSource(new CollectionSource($data))
89
            ->setViewData(['http_method' => 'post', 'form_url' => route('adm.forum.permissions.save', ['id' => $forum->id])]);
90
91
        return $this->view('adm.forum.permissions.home', [
92
            'grid' => $grid,
93
            'categoriesList' => (new TreeBuilder())->listById($this->forum->list())
94
        ]);
95
    }
96
97
    /**
98
     * @param Request $request
99
     * @return \Illuminate\Http\RedirectResponse
100
     */
101
    public function save(Request $request)
102
    {
103
        /** @var \Coyote\Forum $forum */
104
        $forum = $this->forum->findOrFail($request->input('id'));
105
106
        $this->transaction(function () use ($forum, $request) {
107
            $forum->permissions()->delete();
108
109
            foreach ($request->input('group') as $groupId => $permissions) {
0 ignored issues
show
Bug introduced by
The expression $request->input('group') of type string|array|null is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
110
                foreach ($permissions as $permissionId => $value) {
111
                    $forum->permissions()->create([
112
                        'group_id' => $groupId,
113
                        'permission_id' => $permissionId,
114
                        'value' => $value
115
                    ]);
116
                }
117
            }
118
119
            $this->flushPermission();
120
            event(new ForumWasSaved($forum));
121
        });
122
123
        return redirect()->route('adm.forum.permissions')->with('success', 'Zmiany uprawnień zostały zapisane.');
124
    }
125
}
126