Passed
Pull Request — master (#158)
by Davide
142:57 queued 103:47
created

EventVenueController::index()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 40
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 4.0245

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 27
c 1
b 0
f 1
dl 0
loc 40
ccs 23
cts 26
cp 0.8846
rs 9.488
cc 4
nc 4
nop 1
crap 4.0245
1
<?php
2
3
namespace DavideCasiraghi\LaravelEventsCalendar\Http\Controllers;
4
5
use DavideCasiraghi\LaravelEventsCalendar\Facades\LaravelEventsCalendar;
6
use DavideCasiraghi\LaravelEventsCalendar\Models\Country;
7
use DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue;
8
use DavideCasiraghi\LaravelEventsCalendar\Models\Region;
9
use Illuminate\Foundation\Auth\User;
10
use Illuminate\Http\Request;
11
use Illuminate\Support\Facades\Auth;
12
use Illuminate\Support\Facades\DB;
13
use Illuminate\Support\Str;
14
use Validator;
15
16
class EventVenueController extends Controller
17
{
18
    /* Restrict the access to this resource just to logged in users except show view */
19 13
    public function __construct()
20
    {
21 13
        $this->middleware('auth', ['except' => ['show']]);
22 13
    }
23
24
    /***************************************************************************/
25
26
    /**
27
     * Display a listing of the resource.
28
     *
29
     * @return \Illuminate\View\View
30
     */
31 3
    public function index(Request $request)
32
    {
33 3
        $countries = Country::getCountries();
34 3
        $regions = Region::listsTranslations('name')->pluck('name', 'id');
35
36 3
        $searchKeywords = $request->input('keywords');
37 3
        $searchCountry = $request->input('country_id');
38
39
        // To show just the veues created by the the user - If admin or super admin is set to null show all the venues
40 3
        $authorUserId = ($this->getLoggedAuthorId()) ? $this->getLoggedAuthorId() : null;
41
42 3
        if ($searchKeywords || $searchCountry) {
43 1
            $eventVenues = DB::table('event_venues')
44
                ->when($authorUserId, function ($query, $authorUserId) {
45
                    return $query->where('created_by', $authorUserId);
46 1
                })
47
                ->when($searchKeywords, function ($query, $searchKeywords) {
48 1
                    return $query->where('name', $searchKeywords)->orWhere('name', 'like', '%'.$searchKeywords.'%');
49 1
                })
50
                ->when($searchCountry, function ($query, $searchCountry) {
51
                    return $query->where('country_id', '=', $searchCountry);
52 1
                })
53 1
                ->orderBy('name')
54 1
                ->paginate(20);
55
        } else {
56
            $eventVenues = EventVenue::
57
                when($authorUserId, function ($query, $authorUserId) {
58
                    return $query->where('created_by', $authorUserId);
59 2
                })
60 2
                ->orderBy('name')
61 2
                ->paginate(20);
62
        }
63
        //dd(DB::getQueryLog());
64
65 3
        return view('laravel-events-calendar::eventVenues.index', compact('eventVenues'))
66 3
                ->with('i', (request()->input('page', 1) - 1) * 20)
67 3
                ->with('countries', $countries)
68 3
                ->with('regions', $regions)
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\View\View
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 1
        $regions = [];
86
87 1
        return view('laravel-events-calendar::eventVenues.create')
88 1
                ->with('countries', $countries)
89 1
                ->with('regions', $regions)
90 1
                ->with('users', $users)
91 1
                ->with('authorUserId', $authorUserId);
92
    }
93
94
    /***************************************************************************/
95
96
    /**
97
     * Store a newly created resource in storage.
98
     *
99
     * @param  \Illuminate\Http\Request  $request
100
     * @return \Illuminate\Http\RedirectResponse
101
     */
102 2
    public function store(Request $request)
103
    {
104
        // Validate form datas
105 2
        $validator = $this->eventsVenueValidator($request);
106 2
        if ($validator->fails()) {
107 1
            return back()->withErrors($validator)->withInput();
108
        }
109
110 1
        $eventVenue = new EventVenue();
111 1
        $this->saveOnDb($request, $eventVenue);
112
113 1
        return redirect()->route('eventVenues.index')
114 1
                        ->with('success', __('laravel-events-calendar::messages.venue_added_successfully'));
115
    }
116
117
    /***************************************************************************/
118
119
    /**
120
     * Display the specified resource.
121
     *
122
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
123
     * @return \Illuminate\View\View
124
     */
125 1
    public function show(EventVenue $eventVenue)
126
    {
127 1
        $country = DB::table('countries')
128 1
                ->select('id', 'name', 'continent_id')
129 1
                ->where('id', $eventVenue->country_id)
130 1
                ->first();
131
132 1
        return view('laravel-events-calendar::eventVenues.show', compact('eventVenue'))->with('country', $country);
133
    }
134
135
    /***************************************************************************/
136
137
    /**
138
     * Show the form for editing the specified resource.
139
     *
140
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
141
     * @return \Illuminate\Http\RedirectResponse | \Illuminate\View\View
142
     */
143 1
    public function edit(EventVenue $eventVenue)
144
    {
145
        //if (Auth::user()->id == $eventVenue->created_by || Auth::user()->isSuperAdmin() || Auth::user()->isAdmin()) {
146
        //if (Auth::user()->id == $eventVenue->created_by) {
147 1
        if (Auth::user()->id == $eventVenue->created_by || Auth::user()->group == 1 || Auth::user()->group == 2) {
0 ignored issues
show
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...
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...
148 1
            $authorUserId = $this->getLoggedAuthorId();
149 1
            $users = User::pluck('name', 'id');
150 1
            $countries = Country::getCountries();
151 1
            $regions = Region::getRegionsByCountry($eventVenue->country_id);
152
153 1
            return view('laravel-events-calendar::eventVenues.edit', compact('eventVenue'))
154 1
                ->with('countries', $countries)
155 1
                ->with('regions', $regions)
156 1
                ->with('users', $users)
157 1
                ->with('authorUserId', $authorUserId);
158
        } else {
159
            return redirect()->route('home')->with('message', __('auth.not_allowed_to_access'));
160
        }
161
    }
162
163
    /***************************************************************************/
164
165
    /**
166
     * Update the specified resource in storage.
167
     *
168
     * @param  \Illuminate\Http\Request  $request
169
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
170
     * @return \Illuminate\Http\RedirectResponse
171
     */
172 2
    public function update(Request $request, EventVenue $eventVenue)
173
    {
174
        // Validate form datas
175 2
        $validator = $this->eventsVenueValidator($request);
176 2
        if ($validator->fails()) {
177 1
            return back()->withErrors($validator)->withInput();
178
        }
179
180
        //$eventVenue->update($request->all());
181 1
        $this->saveOnDb($request, $eventVenue);
182
183 1
        return redirect()->route('eventVenues.index')
184 1
                        ->with('success', __('laravel-events-calendar::messages.venue_updated_successfully'));
185
    }
186
187
    /***************************************************************************/
188
189
    /**
190
     * Remove the specified resource from storage.
191
     *
192
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
193
     * @return \Illuminate\Http\RedirectResponse
194
     */
195 2
    public function destroy(EventVenue $eventVenue)
196
    {
197 2
        if (EventVenue::venueContainsEvents($eventVenue->id)) {
198 1
            return redirect()->route('eventVenues.index')
199 1
                            ->with('success', __('laravel-events-calendar::messages.venue_not_deleted'));
200
        } else {
201 1
            $eventVenue->delete();
202
203 1
            return redirect()->route('eventVenues.index')
204 1
                            ->with('success', __('laravel-events-calendar::messages.venue_deleted_successfully'));
205
        }
206
    }
207
208
    /***************************************************************************/
209
210
    /**
211
     * Save the record on DB.
212
     *
213
     * @param  \Illuminate\Http\Request  $request
214
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
215
     * @return \Illuminate\Http\Response
216
     */
217 3
    public function saveOnDb(Request $request, EventVenue $eventVenue)
218
    {
219 3
        $eventVenue->name = $request->get('name');
220
        //$eventVenue->description = $request->get('description');
221 3
        $eventVenue->description = clean($request->get('description'));
222 3
        $eventVenue->continent_id = Country::where('id', $request->get('country_id'))->pluck('continent_id')->first();
223 3
        $eventVenue->country_id = $request->get('country_id');
224 3
        $eventVenue->region_id = $request->get('region_id');
225 3
        $eventVenue->city = $request->get('city');
226
        //$eventVenue->state_province = $request->get('state_province');
227 3
        $eventVenue->address = $request->get('address');
228 3
        $eventVenue->zip_code = $request->get('zip_code');
229 3
        $eventVenue->extra_info = $request->get('extra_info');
230 3
        $eventVenue->website = $request->get('website');
231
232
        // Get GPS coordinates
233 3
        $address = Country::getCountryName($eventVenue->country_id).', '.$eventVenue->city.', '.$eventVenue->address;
234 3
        $gpsCoordinates = LaravelEventsCalendar::getVenueGpsCoordinates($address);
0 ignored issues
show
Bug introduced by
The method getVenueGpsCoordinates() does not exist on DavideCasiraghi\LaravelE...s\LaravelEventsCalendar. Since you implemented __callStatic, 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

234
        /** @scrutinizer ignore-call */ 
235
        $gpsCoordinates = LaravelEventsCalendar::getVenueGpsCoordinates($address);
Loading history...
235 3
        $eventVenue->lat = $gpsCoordinates['lat'];
236 3
        $eventVenue->lng = $gpsCoordinates['lng'];
237
238 3
        if (! $eventVenue->slug) {
239 2
            $eventVenue->slug = Str::slug($eventVenue->name, '-').rand(10000, 100000);
240
        }
241
242
        //$eventVenue->created_by = Auth::id();
243 3
        $eventVenue->created_by = $request->get('created_by');
244
245 3
        $eventVenue->save();
246
247 3
        return $eventVenue->id;
248
    }
249
250
    /***************************************************************************/
251
252
    /**
253
     * Open a modal in the event view when 'create new venue' button is clicked.
254
     *
255
     * @return \Illuminate\View\View
256
     */
257
    public function modal()
258
    {
259
        $countries = Country::getCountries();
260
        $regions = [];
261
        $users = User::pluck('name', 'id');
262
263
        return view('laravel-events-calendar::eventVenues.modal')
264
                    ->with('countries', $countries)
265
                    ->with('regions', $regions)
266
                    ->with('users', $users);
267
    }
268
269
    /***************************************************************************/
270
271
    /**
272
     * Store a newly created VENUE from the create event view modal in storage.
273
     *
274
     * @param  \Illuminate\Http\Request  $request
275
     * @return \Illuminate\Http\JsonResponse
276
     */
277 1
    public function storeFromModal(Request $request)
278
    {
279 1
        $eventVenue = new EventVenue();
280
281 1
        $eventVenueId = $this->saveOnDb($request, $eventVenue);
282 1
        $eventVenue = EventVenue::find($eventVenueId);
283
284 1
        return response()->json([
285 1
            'eventVenueId' => $eventVenueId,
286 1
            'eventVenueName' => $eventVenue->name,
287
        ]);
288
    }
289
290
    /***************************************************************************/
291
292
    /**
293
     * Return the Venue validator with all the defined constraint.
294
     *
295
     * @param  \Illuminate\Http\Request  $request
296
     * @return \Illuminate\Contracts\Validation\Validator
297
     */
298 4
    public function eventsVenueValidator(Request $request)
299
    {
300
        $rules = [
301 4
            'name' => 'required',
302
            'city' => 'required',
303
            'country_id' => 'required',
304
            'website' => 'nullable|url',
305
        ];
306 4
        $messages = [];
307
308 4
        $validator = Validator::make($request->all(), $rules, $messages);
309
310 4
        return $validator;
311
    }
312
}
313