davide-casiraghi/laravel-events-calendar

View on GitHub
src/Http/Controllers/OrganizerController.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace DavideCasiraghi\LaravelEventsCalendar\Http\Controllers;

use DavideCasiraghi\LaravelEventsCalendar\Models\Organizer;
use Illuminate\Foundation\Auth\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class OrganizerController extends Controller
{
    /* Restrict the access to this resource just to logged in users except show view */
    public function __construct()
    {
        $this->middleware('auth', ['except' => ['show', 'organizerBySlug']]);
    }

    /***************************************************************************/

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\View\View
     */
    public function index(Request $request)
    {
        // To show just the organizers created by the the user - If admin or super admin is set to null show all the organizers
        $authorUserId = ($this->getLoggedAuthorId()) ? $this->getLoggedAuthorId() : null; // if is 0 (super admin or admin) it's setted to null to avoid include it in the query

        $searchKeywords = $request->input('keywords');

        if ($searchKeywords) {
            $organizers = DB::table('organizers')
                ->when($authorUserId, function ($query, $authorUserId) {
                    return $query->where('created_by', $authorUserId);
                })
                ->when($searchKeywords, function ($query, $searchKeywords) {
                    return $query->where('name', $searchKeywords)->orWhere('name', 'like', '%'.$searchKeywords.'%');
                })
                ->orderBy('name')
                ->paginate(20);
        } else {
            $organizers = DB::table('organizers')
            ->when($authorUserId, function ($query, $authorUserId) {
                return $query->where('created_by', $authorUserId);
            })
            ->orderBy('name')
            ->paginate(20);
        }

        return view('laravel-events-calendar::organizers.index', compact('organizers'))
            ->with('i', (request()->input('page', 1) - 1) * 20)
            ->with('searchKeywords', $searchKeywords);
    }

    /***************************************************************************/

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\View\View
     */
    public function create()
    {
        $users = User::pluck('name', 'id');
        $authorUserId = $this->getLoggedAuthorId();

        return view('laravel-events-calendar::organizers.create')
            ->with('users', $users)
            ->with('authorUserId', $authorUserId);
    }

    /***************************************************************************/

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
        // Validate form datas
        $validator = $this->organizersValidator($request);
        if ($validator->fails()) {
            return back()->withErrors($validator)->withInput();
        }

        $organizer = new Organizer();
        $organizer->preSave($request->all(), $request->file('profile_picture'));
        $organizer->save();

        return redirect()->route('organizers.index')
                        ->with('success', __('laravel-events-calendar::messages.organizer_added_successfully'));
    }

    /***************************************************************************/

    /**
     * Display the specified resource.
     *
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\Organizer  $organizer
     * @return \Illuminate\View\View
     */
    public function show(Organizer $organizer)
    {
        return view('laravel-events-calendar::organizers.show', compact('organizer'));
    }

    /***************************************************************************/

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\Organizer  $organizer
     * @return \Illuminate\View\View
     */
    public function edit(Organizer $organizer)
    {
        $authorUserId = $this->getLoggedAuthorId();
        $users = User::pluck('name', 'id');

        return view('laravel-events-calendar::organizers.edit', compact('organizer'))
            ->with('users', $users)
            ->with('authorUserId', $authorUserId);
    }

    /***************************************************************************/

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\Organizer  $organizer
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(Request $request, Organizer $organizer)
    {
        // Validate form datas
        $validator = $this->organizersValidator($request);
        if ($validator->fails()) {
            return back()->withErrors($validator)->withInput();
        }

        $organizer->preSave($request->all(), $request->file('profile_picture'));
        $organizer->save();

        return redirect()->route('organizers.index')
                        ->with('success', __('laravel-events-calendar::messages.organizer_updated_successfully'));
    }

    /***************************************************************************/

    /**
     * Remove the specified resource from storage.
     *
     * @param  \DavideCasiraghi\LaravelEventsCalendar\Models\Organizer  $organizer
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(Organizer $organizer)
    {
        $organizer->delete();

        return redirect()->route('organizers.index')
                        ->with('success', __('laravel-events-calendar::messages.organizer_deleted_successfully'));
    }

    /***************************************************************************/

    /**
     * Open a modal in the event view when 'create new organizer' button is clicked.
     *
     * @return \Illuminate\View\View
     */
    public function modal()
    {
        $users = User::pluck('name', 'id');

        return view('laravel-events-calendar::organizers.modal')
                    ->with('users', $users);
    }

    /***************************************************************************/

    /**
     * Store a newly created organizer from the create event view modal in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function storeFromModal(Request $request)
    {
        $organizer = new Organizer();
        $organizer->preSave($request->all(), $request->file('profile_picture'));
        $organizer->save();

        return response()->json([
            'organizerId' => $organizer->id,
            'organizerName' => $organizer->name,
        ]);
    }

    /***************************************************************************/

    /**
     * Return the organizer by SLUG. (eg. http://websitename.com/organizer/xxxxx).
     *
     * @param  string $slug
     * @return \Illuminate\View\View
     */
    public function organizerBySlug($slug)
    {
        $organizer = Organizer::where('slug', $slug)->first();

        if (is_null($organizer)) {
            abort(404);
        }

        return $this->show($organizer);
    }

    /***************************************************************************/

    /**
     * Return the validator with all the defined constraint.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function organizersValidator(Request $request)
    {
        $rules = [
            'name' => 'required',
            'email' => 'required|email',
            'website' => 'nullable|url',
        ];
        $messages = [
            'website.url' => 'The website link is invalid. It should start with https://',
        ];

        $validator = Validator::make($request->all(), $rules, $messages);

        return $validator;
    }
}