GrafiteInc/Scaffold

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

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\AdminUserUpdateRequest;
use App\Models\Invite;
use App\Models\User;
use App\Notifications\UserInviteEmail;
use App\View\Forms\AdminUserForm;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Str;
use Throwable;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        $invites = Invite::where([
            'model_id' => null,
        ])->get();

        $index = app(AdminUserForm::class)->index();

        return view('admin.users.index')
            ->with(compact('index', 'invites'));
    }

    /**
     * Search for a matching User.
     *
     * @return \Illuminate\View\View
     */
    public function search(Request $request)
    {
        $query = app(User::class)->search($request->search);

        $index = app(AdminUserForm::class)->index($query);

        $invites = Invite::where([
            'model_id' => null,
        ])->get();

        return view('admin.users.index')
            ->with(compact('index', 'invites'));
    }

    /**
     * Show the form for inviting a User.
     *
     * @return \Illuminate\View\View
     */
    public function getInvite()
    {
        return view('admin.users.invite');
    }

    /**
     * Show the form for inviting a customer.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function postInvite(Request $request)
    {
        $message = trans('general.user.invite');
        $token = Str::uuid();

        try {
            Invite::firstOrCreate([
                'user_id' => auth()->id(),
                'email' => $request->email,
            ], [
                'message' => $message,
                'token' => $token,
            ]);

            Notification::route('mail', $request->email)
                ->notify(new UserInviteEmail(
                    $request->email,
                    $request->user(),
                    $message,
                    $token
                ));

            return redirect()->back()->with('message', 'Invitation was sent');
        } catch (Throwable $th) {
            return redirect()->back()->withErrors(['Invitation was not sent']);
        }
    }

    /**
     * Switch to a different User.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function switchToUser(Request $request, User $user)
    {
        $request->session()->put('original_user', auth()->id());

        Auth::login($user);

        return redirect()->route('home')->withMessage('You switched users!');
    }

    /**
     * Switch back to your original user.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function switchBack(Request $request)
    {
        if (! session('original_user')) {
            abort(401);
        }

        $user = User::find(session('original_user'));

        $request->session()->forget('original_user');

        Auth::login($user);

        return redirect()->route('home')->withMessage('You switched back!');
    }

    /**
     * Create a user
     *
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
        try {
            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => Hash::make(Str::random()),
                'timezone' => $request->timezone,
                'country' => $request->country,
            ]);

            $user->roles()->sync($request->role);

            return redirect()->back()->with('message', 'Successfully created, but will need to reset password.');
        } catch (Exception $e) {
            Log::error($e);

            return redirect()->back()->with('errors', ['Failed to create']);
        }
    }

    /**
     * Show the form for editing the User.
     *
     * @return \Illuminate\View\View
     */
    public function edit(User $user)
    {
        $activities = $user->activities()->orderBy('created_at', 'DESC')
            ->limit(25)->get();

        return view('admin.users.edit')
            ->with(compact('activities', 'user'));
    }

    /**
     * Update the User in storage.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(AdminUserUpdateRequest $request, User $user)
    {
        try {
            $user->update([
                'name' => $request->name,
                'email' => $request->email,
            ]);

            $user->roles()->sync($request->role);

            return redirect()->back()->with('message', 'Successfully updated');
        } catch (Exception $e) {
            Log::error($e);

            return redirect()->back()->with('errors', ['Failed to update']);
        }
    }

    /**
     * Remove the User from storage.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(User $user)
    {
        $user->delete();

        return redirect()->route('admin.users.index');
    }
}