Passed
Push — master ( d17f27...9f17bc )
by Davide
41:18
created

EventVenueController::saveOnDb()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 31
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 20
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 31
ccs 20
cts 20
cp 1
rs 9.6333
cc 2
nc 2
nop 2
crap 2
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\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 13
    public function __construct()
21
    {
22 13
        $this->middleware('auth', ['except' => ['show']]);
23 13
    }
24
25
    /***************************************************************************/
26
27
    /**
28
     * Display a listing of the resource.
29
     *
30
     * @return \Illuminate\View\View
31
     */
32 3
    public function index(Request $request)
33
    {
34 3
        $countries = Country::getCountries();
35 3
        $regions = Region::listsTranslations('name')->pluck('name', 'id');
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('regions', $regions)
70 3
                ->with('searchKeywords', $searchKeywords)
71 3
                ->with('searchCountry', $searchCountry);
72
    }
73
74
    /***************************************************************************/
75
76
    /**
77
     * Show the form for creating a new resource.
78
     *
79
     * @return \Illuminate\View\View
80
     */
81 1
    public function create()
82
    {
83 1
        $authorUserId = $this->getLoggedAuthorId();
84 1
        $users = User::pluck('name', 'id');
85 1
        $countries = Country::getCountries();
86 1
        $regions = [];
87
88 1
        return view('laravel-events-calendar::eventVenues.create')
89 1
                ->with('countries', $countries)
90 1
                ->with('regions', $regions)
91 1
                ->with('users', $users)
92 1
                ->with('authorUserId', $authorUserId);
93
    }
94
95
    /***************************************************************************/
96
97
    /**
98
     * Store a newly created resource in storage.
99
     *
100
     * @param  \Illuminate\Http\Request  $request
101
     * @return \Illuminate\Http\RedirectResponse
102
     */
103 2
    public function store(Request $request)
104
    {
105
        // Validate form datas
106 2
        $validator = $this->eventsVenueValidator($request);
107 2
        if ($validator->fails()) {
108 1
            return back()->withErrors($validator)->withInput();
109
        }
110
111 1
        $eventVenue = new EventVenue();
112 1
        $this->saveOnDb($request, $eventVenue);
113
114 1
        return redirect()->route('eventVenues.index')
115 1
                        ->with('success', __('laravel-events-calendar::messages.venue_added_successfully'));
116
    }
117
118
    /***************************************************************************/
119
120
    /**
121
     * Display the specified resource.
122
     *
123
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
124
     * @return \Illuminate\View\View
125
     */
126 1
    public function show(EventVenue $eventVenue)
127
    {
128 1
        $country = DB::table('countries')
129 1
                ->select('id', 'name', 'continent_id')
130 1
                ->where('id', $eventVenue->country_id)
131 1
                ->first();
132
133 1
        return view('laravel-events-calendar::eventVenues.show', compact('eventVenue'))->with('country', $country);
134
    }
135
136
    /***************************************************************************/
137
138
    /**
139
     * Show the form for editing the specified resource.
140
     *
141
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
142
     * @return \Illuminate\Http\RedirectResponse | \Illuminate\View\View
143
     */
144 1
    public function edit(EventVenue $eventVenue)
145
    {
146
        //if (Auth::user()->id == $eventVenue->created_by || Auth::user()->isSuperAdmin() || Auth::user()->isAdmin()) {
147
        //if (Auth::user()->id == $eventVenue->created_by) {
148 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...
149 1
            $authorUserId = $this->getLoggedAuthorId();
150 1
            $users = User::pluck('name', 'id');
151 1
            $countries = Country::getCountries();
152 1
            $regions = Region::getRegionsByCountry($eventVenue->country_id);
153
154
            // Invalidate cache tags for events map - This is not needed in event create() because the marker is created when an event gets creted.
155 1
            Cache::forget('active_events_map_markers_json');
156 1
            Cache::forget('active_events_map_markers_db_data');
157
158 1
            return view('laravel-events-calendar::eventVenues.edit', compact('eventVenue'))
159 1
                ->with('countries', $countries)
160 1
                ->with('regions', $regions)
161 1
                ->with('users', $users)
162 1
                ->with('authorUserId', $authorUserId);
163
        } else {
164
            return redirect()->route('home')->with('message', __('auth.not_allowed_to_access'));
165
        }
166
    }
167
168
    /***************************************************************************/
169
170
    /**
171
     * Update the specified resource in storage.
172
     *
173
     * @param  \Illuminate\Http\Request  $request
174
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
175
     * @return \Illuminate\Http\RedirectResponse
176
     */
177 2
    public function update(Request $request, EventVenue $eventVenue)
178
    {
179
        // Validate form datas
180 2
        $validator = $this->eventsVenueValidator($request);
181 2
        if ($validator->fails()) {
182 1
            return back()->withErrors($validator)->withInput();
183
        }
184
185
        //$eventVenue->update($request->all());
186 1
        $this->saveOnDb($request, $eventVenue);
187
188 1
        return redirect()->route('eventVenues.index')
189 1
                        ->with('success', __('laravel-events-calendar::messages.venue_updated_successfully'));
190
    }
191
192
    /***************************************************************************/
193
194
    /**
195
     * Remove the specified resource from storage.
196
     *
197
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
198
     * @return \Illuminate\Http\RedirectResponse
199
     */
200 2
    public function destroy(EventVenue $eventVenue)
201
    {
202 2
        if (EventVenue::venueContainsEvents($eventVenue->id)) {
203 1
            return redirect()->route('eventVenues.index')
204 1
                            ->with('success', __('laravel-events-calendar::messages.venue_not_deleted'));
205
        } else {
206 1
            $eventVenue->delete();
207
208 1
            return redirect()->route('eventVenues.index')
209 1
                            ->with('success', __('laravel-events-calendar::messages.venue_deleted_successfully'));
210
        }
211
    }
212
213
    /***************************************************************************/
214
215
    /**
216
     * Save the record on DB.
217
     *
218
     * @param  \Illuminate\Http\Request  $request
219
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\EventVenue  $eventVenue
220
     * @return \Illuminate\Http\Response
221
     */
222 3
    public function saveOnDb(Request $request, EventVenue $eventVenue)
223
    {
224 3
        $eventVenue->name = $request->get('name');
225
        //$eventVenue->description = $request->get('description');
226 3
        $eventVenue->description = clean($request->get('description'));
227 3
        $eventVenue->continent_id = Country::where('id', $request->get('country_id'))->pluck('continent_id')->first();
228 3
        $eventVenue->country_id = $request->get('country_id');
229 3
        $eventVenue->region_id = $request->get('region_id');
230 3
        $eventVenue->city = $request->get('city');
231
        //$eventVenue->state_province = $request->get('state_province');
232 3
        $eventVenue->address = $request->get('address');
233 3
        $eventVenue->zip_code = $request->get('zip_code');
234 3
        $eventVenue->extra_info = $request->get('extra_info');
235 3
        $eventVenue->website = $request->get('website');
236
237
        // Get GPS coordinates
238 3
        $address = Country::getCountryName($eventVenue->country_id).', '.$eventVenue->city.', '.$eventVenue->address;
239 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

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