CyberRegister/CyberRegister

View on GitHub
app/Http/Controllers/UserController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Http\Controllers;

use App\Http\Requests\UserSearchRequest;
use App\Http\Requests\UserStoreRequest;
use App\Http\Requests\UserUpdateRequest;
use App\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Intervention\Image\Facades\Image;

class UserController extends Controller
{
    /**
     * Display a User search box.
     *
     * @return View
     */
    public function index(): View
    {
        return view('users.index', ['users' => [], 'q' => '']);
    }

    /**
     * Display a listing of the Users.
     *
     * @param UserSearchRequest $request
     *
     * @return View
     */
    public function search(UserSearchRequest $request): View
    {
        $users = User::with(['expertises' => function ($query) {
            $query->where('cyber_expertise_id', 1);
        }])
            ->where('cyber_code', 'like', '%'.$request->q.'%')
            ->orWhere('first_name', 'like', '%'.$request->q.'%')
            ->orWhere('last_name', 'like', '%'.$request->q.'%')
            ->get();

        return view('users.index', ['users' => $users, 'q' => $request->q]);
    }

    /**
     * Show the form for creating a new User.
     *
     * @return View
     */
    public function create(): View
    {
        return view('users.create');
    }

    /**
     * Store a newly created User in storage.
     *
     * @param UserStoreRequest $request
     *
     * @return RedirectResponse
     */
    public function store(UserStoreRequest $request): RedirectResponse
    {
        try {
            User::create(
                [
                    'cyber_code'     => $request->cyber_code,
                    'first_name'     => $request->first_name,
                    'middle_name'    => $request->middle_name,
                    'last_name'      => $request->last_name,
                    'date_of_birth'  => $request->date_of_birth,
                    'place_of_birth' => $request->place_of_birth,
                    'email'          => $request->email,
                    'password'       => bcrypt($request->password),
                ]
            );
        } catch (\Exception $e) {
            return redirect()
                ->route('users.create')->withInput()->withErrors([$e->getMessage()]);
        }
        // todo notification
        return redirect()->route('users.index');
    }

    /**
     * Display the specified User.
     *
     * @param User $user
     *
     * @return View
     */
    public function show(User $user): View
    {
        return view('users.show', ['user' => $user]);
    }

    /**
     * Show the form for editing the specified User.
     *
     * @param User $user
     *
     * @throws AuthorizationException
     *
     * @return View
     */
    public function edit(User $user): View
    {
        $this->authorize('edit', $user);

        return view('users.edit', ['user' => $user]);
    }

    /**
     * Update the specified User in storage.
     *
     * @param UserUpdateRequest $request
     * @param User              $user
     *
     * @throws AuthorizationException
     *
     * @return RedirectResponse
     */
    public function update(UserUpdateRequest $request, User $user): RedirectResponse
    {
        $this->authorize('update', $user);

        try {
            $user->update($request->all());
            if ($request->hasFile('file') && $request->file('file')->isValid()) {
                $user->photo = Image::make($request->file('file')->getRealPath())->encode('data-url');
                $user->save();
            }
        } catch (\Exception $e) {
            return redirect()->route('users.edit', ['cyber_code' => $user->cyber_code])
                ->withInput()->withErrors([$e->getMessage()]);
        }
        // todo notification
        return redirect()->route('users.index');
    }

    /**
     * Remove the specified User from storage.
     *
     * @param User $user
     *
     * @throws \Illuminate\Auth\Access\AuthorizationException
     *
     * @return RedirectResponse
     */
    public function destroy(User $user): RedirectResponse
    {
        $this->authorize('delete', $user);

        try {
            $user->delete();
        } catch (\Exception $e) {
            return redirect()->route('users.edit', ['cyber_code' => $user->cyber_code])
                ->withInput()->withErrors([$e->getMessage()]);
        }
        // todo notification
        return redirect()->route('users.index');
    }
}