Completed
Push — master ( 8f387d...47c518 )
by Davide
12:19
created

EventVenueController   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 280
Duplicated Lines 0 %

Test Coverage

Coverage 90.74%

Importance

Changes 3
Bugs 1 Features 0
Metric Value
wmc 22
eloc 104
c 3
b 1
f 0
dl 0
loc 280
ccs 98
cts 108
cp 0.9074
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A store() 0 13 2
A edit() 0 15 4
A __construct() 0 3 1
A create() 0 10 1
A index() 0 41 4
A show() 0 8 1
A update() 0 13 2
A destroy() 0 10 2
A saveOnDb() 0 23 2
A modal() 0 8 1
A storeFromModal() 0 10 1
A eventsVenueValidator() 0 13 1
1
<?php
2
3
namespace DavideCasiraghi\LaravelEventsCalendar\Http\Controllers;
4
5
use Validator;
6
use Illuminate\Support\Str;
7
use Illuminate\Http\Request;
8
use Illuminate\Support\Facades\DB;
9
use Illuminate\Foundation\Auth\User;
10
use Illuminate\Support\Facades\Auth;
11
use Illuminate\Support\Facades\Cache;
12
use DavideCasiraghi\LaravelEventsCalendar\Models\Country;
13
use DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue;
14
15
class EventVenueController extends Controller
16
{
17
    /* Restrict the access to this resource just to logged in users except show view */
18 12
    public function __construct()
19
    {
20 12
        $this->middleware('auth', ['except' => ['show']]);
21 12
    }
22
23
    /***************************************************************************/
24
25
    /**
26
     * Display a listing of the resource.
27
     *
28
     * @return \Illuminate\Http\Response
29
     */
30 3
    public function index(Request $request)
31
    {
32 3
        $cacheExpireTime = 900; // Set the duration time of the cache (15 min - 900sec)
33
        $countries = Cache::remember('countries', $cacheExpireTime, function () {
34 3
            return Country::orderBy('name')->pluck('name', 'id');
35 3
        });
36
37 3
        $searchKeywords = $request->input('keywords');
38 3
        $searchCountry = $request->input('country_id');
39
40
        // To show just the veues created by the the user - If admin or super admin is set to null show all the venues
41 3
        $authorUserId = ($this->getLoggedAuthorId()) ? $this->getLoggedAuthorId() : null;
42
43 3
        if ($searchKeywords || $searchCountry) {
44 1
            $eventVenues = DB::table('event_venues')
45
                ->when($authorUserId, function ($query, $authorUserId) {
46
                    return $query->where('created_by', $authorUserId);
47 1
                })
48
                ->when($searchKeywords, function ($query, $searchKeywords) {
49 1
                    return $query->where('name', $searchKeywords)->orWhere('name', 'like', '%'.$searchKeywords.'%');
50 1
                })
51
                ->when($searchCountry, function ($query, $searchCountry) {
52
                    return $query->where('country_id', '=', $searchCountry);
53 1
                })
54 1
                ->orderBy('name')
55 1
                ->paginate(20);
56
        } else {
57
            $eventVenues = EventVenue::
58
                when($authorUserId, function ($query, $authorUserId) {
59
                    return $query->where('created_by', $authorUserId);
60 2
                })
61 2
                ->orderBy('name')
62 2
                ->paginate(20);
63
        }
64
        //dd(DB::getQueryLog());
65
66 3
        return view('laravel-events-calendar::eventVenues.index', compact('eventVenues'))
67 3
                ->with('i', (request()->input('page', 1) - 1) * 20)
68 3
                ->with('countries', $countries)
69 3
                ->with('searchKeywords', $searchKeywords)
70 3
                ->with('searchCountry', $searchCountry);
71
    }
72
73
    /***************************************************************************/
74
75
    /**
76
     * Show the form for creating a new resource.
77
     *
78
     * @return \Illuminate\Http\Response
79
     */
80 1
    public function create()
81
    {
82 1
        $authorUserId = $this->getLoggedAuthorId();
83 1
        $users = User::pluck('name', 'id');
84 1
        $countries = Country::getCountries();
85
86 1
        return view('laravel-events-calendar::eventVenues.create')
87 1
                ->with('countries', $countries)
88 1
                ->with('users', $users)
89 1
                ->with('authorUserId', $authorUserId);
90
    }
91
92
    /***************************************************************************/
93
94
    /**
95
     * Store a newly created resource in storage.
96
     *
97
     * @param  \Illuminate\Http\Request  $request
98
     * @return \Illuminate\Http\Response
99
     */
100 2
    public function store(Request $request)
101
    {
102
        // Validate form datas
103 2
        $validator = $this->eventsVenueValidator($request);
104 2
        if ($validator->fails()) {
105 1
            return back()->withErrors($validator)->withInput();
106
        }
107
108 1
        $eventVenue = new EventVenue();
109 1
        $this->saveOnDb($request, $eventVenue);
110
111 1
        return redirect()->route('eventVenues.index')
112 1
                        ->with('success', __('laravel-events-calendar::messages.venue_added_successfully'));
113
    }
114
115
    /***************************************************************************/
116
117
    /**
118
     * Display the specified resource.
119
     *
120
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
121
     * @return \Illuminate\Http\Response
122
     */
123 1
    public function show(EventVenue $eventVenue)
124
    {
125 1
        $country = DB::table('countries')
126 1
                ->select('id', 'name', 'continent_id')
127 1
                ->where('id', $eventVenue->country_id)
128 1
                ->first();
129
130 1
        return view('laravel-events-calendar::eventVenues.show', compact('eventVenue'))->with('country', $country);
131
    }
132
133
    /***************************************************************************/
134
135
    /**
136
     * Show the form for editing the specified resource.
137
     *
138
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
139
     * @return \Illuminate\Http\Response
140
     */
141 1
    public function edit(EventVenue $eventVenue)
142
    {
143
        //if (Auth::user()->id == $eventVenue->created_by || Auth::user()->isSuperAdmin() || Auth::user()->isAdmin()) {
144
        //if (Auth::user()->id == $eventVenue->created_by) {
145 1
        if (Auth::user()->id == $eventVenue->created_by || Auth::user()->group == 1 || Auth::user()->group == 2) {
0 ignored issues
show
Bug introduced by
Accessing group on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
Bug introduced by
Accessing id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
146 1
            $authorUserId = $this->getLoggedAuthorId();
147 1
            $users = User::pluck('name', 'id');
148 1
            $countries = Country::getCountries();
149
150 1
            return view('laravel-events-calendar::eventVenues.edit', compact('eventVenue'))
151 1
                ->with('countries', $countries)
152 1
                ->with('users', $users)
153 1
                ->with('authorUserId', $authorUserId);
154
        } else {
155
            return redirect()->route('home')->with('message', __('auth.not_allowed_to_access'));
156
        }
157
    }
158
159
    /***************************************************************************/
160
161
    /**
162
     * Update the specified resource in storage.
163
     *
164
     * @param  \Illuminate\Http\Request  $request
165
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
166
     * @return \Illuminate\Http\Response
167
     */
168 2
    public function update(Request $request, EventVenue $eventVenue)
169
    {
170
        // Validate form datas
171 2
        $validator = $this->eventsVenueValidator($request);
172 2
        if ($validator->fails()) {
173 1
            return back()->withErrors($validator)->withInput();
174
        }
175
176
        //$eventVenue->update($request->all());
177 1
        $this->saveOnDb($request, $eventVenue);
178
179 1
        return redirect()->route('eventVenues.index')
180 1
                        ->with('success', __('laravel-events-calendar::messages.venue_updated_successfully'));
181
    }
182
183
    /***************************************************************************/
184
185
    /**
186
     * Remove the specified resource from storage.
187
     *
188
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
189
     * @return \Illuminate\Http\Response
190
     */
191 2
    public function destroy(EventVenue $eventVenue)
192
    {
193 2
        if (EventVenue::venueContainsEvents($eventVenue->id)) {
194 1
            return redirect()->route('eventVenues.index')
195 1
                            ->with('success', __('laravel-events-calendar::messages.venue_not_deleted'));
196
        } else {
197 1
            $eventVenue->delete();
198
199 1
            return redirect()->route('eventVenues.index')
200 1
                            ->with('success', __('laravel-events-calendar::messages.venue_deleted_successfully'));
201
        }
202
    }
203
204
    /***************************************************************************/
205
206
    /**
207
     * Save the record on DB.
208
     *
209
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
210
     * @return \Illuminate\Http\Response
211
     */
212 3
    public function saveOnDb($request, $eventVenue)
213
    {
214 3
        $eventVenue->name = $request->get('name');
215
        //$eventVenue->description = $request->get('description');
216 3
        $eventVenue->description = clean($request->get('description'));
217 3
        $eventVenue->continent_id = Country::where('id', $request->get('country_id'))->pluck('continent_id')->first();
218 3
        $eventVenue->country_id = $request->get('country_id');
219 3
        $eventVenue->city = $request->get('city');
220 3
        $eventVenue->state_province = $request->get('state_province');
221 3
        $eventVenue->address = $request->get('address');
222 3
        $eventVenue->zip_code = $request->get('zip_code');
223 3
        $eventVenue->website = $request->get('website');
224
225 3
        if (! $eventVenue->slug) {
226 2
            $eventVenue->slug = Str::slug($eventVenue->name, '-').rand(10000, 100000);
227
        }
228
229
        //$eventVenue->created_by = Auth::id();
230 3
        $eventVenue->created_by = $request->get('created_by');
231
232 3
        $eventVenue->save();
233
234 3
        return $eventVenue->id;
235
    }
236
237
    /***************************************************************************/
238
239
    /**
240
     * Open a modal in the event view when create teachers is clicked.
241
     *
242
     * @return \Illuminate\Http\Response
243
     */
244
    public function modal()
245
    {
246
        $countries = Country::getCountries();
247
        $users = User::pluck('name', 'id');
248
249
        return view('laravel-events-calendar::eventVenues.modal')
250
                    ->with('countries', $countries)
251
                    ->with('users', $users);
252
    }
253
254
    /***************************************************************************/
255
256
    /**
257
     * Store a newly created VENUE from the create event view modal in storage.
258
     *
259
     * @param  \Illuminate\Http\Request  $request
260
     * @return \Illuminate\Http\Response
261
     */
262 1
    public function storeFromModal(Request $request)
263
    {
264 1
        $eventVenue = new EventVenue();
265
266 1
        $eventVenueId = $this->saveOnDb($request, $eventVenue);
267 1
        $eventVenue = EventVenue::find($eventVenueId);
268
269 1
        return response()->json([
270 1
                        'eventVenueId' => $eventVenueId,
271 1
                        'eventVenueName' => $eventVenue->name,
272
                    ]);
273
    }
274
275
    /***************************************************************************/
276
277
    /**
278
     * Return the Venue validator with all the defined constraint.
279
     *
280
     * @return \Illuminate\Validation\Validator
281
     */
282 4
    public function eventsVenueValidator($request)
283
    {
284
        $rules = [
285 4
            'name' => 'required',
286
            'city' => 'required',
287
            'country_id' => 'required',
288
            'website' => 'nullable|url',
289
        ];
290 4
        $messages = [];
291
292 4
        $validator = Validator::make($request->all(), $rules, $messages);
293
294 4
        return $validator;
295
    }
296
}
297