MembersController::edit()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
c 0
b 0
f 0
rs 9.4285
cc 1
eloc 4
nc 1
nop 2
1
<?php
2
3
/**
4
 * Storgman - Student Organizations Management
5
 * Copyright (C) 2014-2016, Dejan Angelov <[email protected]>
6
 *
7
 * This file is part of Storgman.
8
 *
9
 * Storgman is free software: you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation, either version 3 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * Storgman is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with Storgman.  If not, see <http://www.gnu.org/licenses/>.
21
 *
22
 * @package Storgman
23
 * @copyright Copyright (C) 2014-2016, Dejan Angelov <[email protected]>
24
 * @license https://github.com/angelov/storgman/blob/master/LICENSE
25
 * @author Dejan Angelov <[email protected]>
26
 */
27
28
namespace Angelov\Storgman\Members\Http\Controllers;
29
30
use Angelov\Storgman\Core\Http\Controllers\BaseController;
31
use Angelov\Storgman\Faculties\Repositories\FacultiesRepositoryInterface;
32
use Angelov\Storgman\Members\Commands\ApproveMemberCommand;
33
use Angelov\Storgman\Members\Commands\CreateMemberCommand;
34
use Angelov\Storgman\Members\Commands\DeclineMemberCommand;
35
use Angelov\Storgman\Members\Commands\DeleteMemberCommand;
36
use Angelov\Storgman\Members\Commands\UpdateMemberCommand;
37
use Angelov\Storgman\Members\Http\Requests\StoreMemberRequest;
38
use Angelov\Storgman\Members\Http\Requests\UpdateMemberRequest;
39
use Angelov\Storgman\Members\MembersPaginator;
40
use Angelov\Storgman\Membership\Repositories\FeesRepositoryInterface;
41
use Angelov\Storgman\Meetings\MeetingsService;
42
use Angelov\Storgman\Members\Repositories\MembersRepositoryInterface;
43
use Illuminate\Contracts\Routing\UrlGenerator;
44
use Illuminate\Contracts\View\View;
45
use Illuminate\Http\JsonResponse;
46
use Illuminate\Http\RedirectResponse;
47
use Illuminate\Http\Request;
48
49
class MembersController extends BaseController
50
{
51
    protected $members;
52
    protected $fees;
53
54
    public function __construct(MembersRepositoryInterface $members, FeesRepositoryInterface $fees)
55
    {
56
        $this->members = $members;
57
        $this->fees = $fees;
58
    }
59
60
    /**
61
     * Display a listing of members
62
     *
63
     * @param Request $request
64
     * @param MembersPaginator $paginator
65
     * @return View
66
     */
67
    public function index(Request $request, MembersPaginator $paginator)
68
    {
69
        $page = $request->get('page', 1);
70
        $members = $paginator->get($page);
71
72
        /** @todo This can get a little optimized */
73
        $pending = count($this->members->getUnapprovedMembers());
74
75
        return view('members.index', compact('members', 'pending'));
76
    }
77
78
    /**
79
     * Returns the list of members to be used for autocompletion
80
     *
81
     * @param UrlGenerator $url
82
     * @return JsonResponse
83
     */
84
    public function prefetch(UrlGenerator $url)
85
    {
86
        $members = $this->members->all();
87
        $result = [];
88
89
        foreach ($members as $member) {
90
            $tmp = [];
91
            $tmp['value'] = $member->getFullName();
92
            $tmp['image'] = $url->route('imagecache', ['xsmall', $member->getPhoto()]);
93
            $tmp['id'] = $member->getId();
94
95
            $result[] = $tmp;
96
        }
97
98
        return new JsonResponse($result);
99
    }
100
101
    /**
102
     * Show a page that lists the board members
103
     *
104
     * @return View
105
     */
106
    public function board()
107
    {
108
        $members = $this->members->getBoardMembers();
109
110
        return view('members.board', compact('members'));
111
    }
112
113
    /**
114
     * Show a page with the unapproved member accounts
115
     *
116
     * @return View
117
     */
118
    public function unapproved()
119
    {
120
        $members = $this->members->getUnapprovedMembers();
121
122
        return view('members.unapproved', compact('members'));
123
    }
124
125
    /**
126
     * Show the form for creating a new member
127
     *
128
     * @param FacultiesRepositoryInterface $faculties
129
     * @return View
130
     */
131
    public function create(FacultiesRepositoryInterface $faculties)
132
    {
133
        $faculties = $faculties->getEnabled();
134
135
        return view('members.create', compact('faculties'));
136
    }
137
138
    /**
139
     * Store a newly created member in storage.
140
     *
141
     * @param StoreMemberRequest $request
142
     * @return RedirectResponse
143
     */
144 View Code Duplication
    public function store(StoreMemberRequest $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...
145
    {
146
        $data = $request->all();
147
148
        dispatch(new CreateMemberCommand($data, $approve = true));
149
150
        session()->flash('action-message', "Member added successfully.");
151
152
        return redirect()->route('members.index');
153
    }
154
155
    /**
156
     * Display the specified member.
157
     *
158
     * @param MeetingsService $meetingsService
159
     * @param int $id
160
     * @return View
161
     *
162
     * @todo Information separated in tabs (in the view) should be separated in few methods
163
     */
164
    public function show(MeetingsService $meetingsService, $id)
165
    {
166
        $member = $this->members->get($id);
167
168
        $attendance = $meetingsService->calculateAttendanceDetailsForMember($member);
169
170
        $latestMeetings = $meetingsService->latestMeetingsAttendanceStatusForMember($member);
171
172
        $monthly = json_encode($meetingsService->calculateMonthlyAttendanceDetailsForMember($member));
173
174
        return view('members.show', compact('member', 'attendance', 'latestMeetings', 'monthly'));
175
    }
176
177
    /**
178
     * Returns html component with short member info
179
     * (focused on the membership)
180
     *
181
     * @param int $id
182
     * @return View
183
     */
184
    public function quickMemberInfo($id)
185
    {
186
        $member = $this->members->get($id);
187
188
        return view('members.components.quick-info', compact('member'));
189
    }
190
191
    /**
192
     * Show the form for editing the specified member.
193
     *
194
     * @param  int $id
195
     * @param FacultiesRepositoryInterface $faculties
196
     * @return View
197
     */
198
    public function edit($id, FacultiesRepositoryInterface $faculties)
199
    {
200
        $member = $this->members->get($id);
201
        $faculties = $faculties->getEnabled();
202
203
        return view('members.edit', compact('member', 'faculties'));
204
    }
205
206
    /**
207
     * Update the specified member in storage.
208
     *
209
     * @param UpdateMemberRequest $request
210
     * @param  int $id
211
     * @return RedirectResponse
212
     */
213 View Code Duplication
    public function update(UpdateMemberRequest $request, $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...
214
    {
215
        $data = $request->all();
216
217
        dispatch(new UpdateMemberCommand($id, $data));
218
219
        session()->flash('action-message', "Member updated successfully.");
220
221
        return redirect()->route('members.index');
222
    }
223
224
    /**
225
     * Remove the specified members from storage.
226
     * Method available only via AJAX requests
227
     *
228
     * @param  int $id
229
     * @return JsonResponse
230
     */
231
    public function destroy($id)
232
    {
233
        dispatch(new DeleteMemberCommand($id));
234
235
        return $this->successfulJsonResponse('Member deleted successfully.');
236
    }
237
238
    /**
239
     * Approve a pending member account
240
     * Method available only via AJAX requests
241
     *
242
     * @param int $id
243
     * @return JsonResponse
244
     */
245
    public function approve($id)
246
    {
247
        dispatch(new ApproveMemberCommand($id));
248
249
        return $this->successfulJsonResponse('Member approved successfully.');
250
    }
251
252
    /**
253
     * Decline a pending member account
254
     * Method available only via AJAX requests
255
     *
256
     * @param int $id
257
     * @return JsonResponse
258
     */
259
    public function decline($id)
260
    {
261
        dispatch(new DeclineMemberCommand($id));
262
263
        return $this->successfulJsonResponse('Member declined successfully.');
264
    }
265
266
    /**
267
     * The new members can create their profiles on the system
268
     *
269
     * @param FacultiesRepositoryInterface $faculties
270
     * @return View
271
     */
272
    public function register(FacultiesRepositoryInterface $faculties)
273
    {
274
        $faculties = $faculties->getEnabled();
275
276
        return view('members.register', compact('faculties'));
277
    }
278
279
    /**
280
     * Proceed the information submitted via the registration form
281
     *
282
     * @param StoreMemberRequest $request
283
     * @return RedirectResponse
284
     */
285 View Code Duplication
    public function postRegister(StoreMemberRequest $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...
286
    {
287
        $data = $request->all();
288
289
        dispatch(new CreateMemberCommand($data));
290
291
        session()->flash(
292
            'action-message',
293
            "Your account was created successfully. You will be notified when the board members approve it."
294
        );
295
296
        return redirect()->route('members.register');
297
    }
298
}
299