Passed
Push — master ( 1ae1eb...ea535e )
by Davide
27:31
created

EventVenueController::show()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

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

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