Passed
Branch master (249862)
by Adam
07:51
created

PermissionsController::save()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 23
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 12
nc 1
nop 1
dl 0
loc 23
rs 9.0856
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) {
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