GrafiteInc/Scaffold

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

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Http\Controllers;

use App\Http\Requests\TeamCreateRequest;
use App\Http\Requests\TeamUpdateRequest;
use App\Models\Team;
use App\Services\TeamService;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;

class TeamsController extends Controller
{
    public $service;

    public function __construct(TeamService $service)
    {
        $this->service = $service;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\View\View
     */
    public function index(Request $request)
    {
        $teams = $request->user()->teams;
        $memberships = $request->user()->memberships;

        return view('teams.index')->with(compact('memberships', 'teams'));
    }

    /**
     * Show the form for creating a new team.
     *
     * @return \Illuminate\View\View
     */
    public function create()
    {
        abort_unless(
            Gate::allows('subscribed') || auth()->user()->hasRole('admin'),
            403,
            'Subscription is required.'
        );

        return view('teams.create');
    }

    /**
     * Store a newly created team in storage.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(TeamCreateRequest $request)
    {
        abort_unless(
            Gate::allows('subscribed') || auth()->user()->hasRole('admin'),
            403,
            'Subscription is required.'
        );

        try {
            $team = $this->service->create($request->except('_token'));

            if ($team) {
                return redirect()->route('teams.edit', $team->id)
                    ->withMessage('Successfully created a team');
            }

            return redirect()->route('teams')->withMessage('Failed to create a team');
        } catch (Exception $e) {
            return redirect()->back()->withErrors($e->getMessage());
        }
    }

    /**
     * Show the form for editing the specified team.
     *
     * @return \Illuminate\View\View
     */
    public function edit(Team $team)
    {
        $this->handleAccess($team);

        if (! Gate::allows('team-admin', $team)) {
            abort(403);
        }

        return view('teams.edit')->with(compact('team'));
    }

    /**
     * Show the form for handling members the specified team.
     *
     * @return \Illuminate\View\View
     */
    public function members(Team $team)
    {
        $this->handleAccess($team);

        if (! Gate::allows('team-admin', $team)) {
            abort(403);
        }

        return view('teams.members')->with(compact('team'));
    }

    /**
     * Update the specified team in storage.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(TeamUpdateRequest $request, Team $team)
    {
        $this->handleAccess($team);

        if (Gate::denies('team-admin', $team)) {
            return redirect()->back()->withErrors(['You do not have permission to do this.']);
        }

        try {
            if ($this->service->update($team, $request)) {
                return redirect()->back()->withMessage('Successfully updated');
            }

            return redirect()->back()->withMessage('Failed to update');
        } catch (Exception $e) {
            return redirect()->back()->withErrors($e->getMessage());
        }
    }

    /**
     * Remove the specified team from storage.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(Team $team)
    {
        $this->handleAccess($team);

        if (Gate::denies('team-admin', $team)) {
            return redirect()->back()->withErrors(['You do not have permission to do this.']);
        }

        try {
            $result = $this->service->destroy($team);

            if ($result) {
                return redirect()->route('teams')->withMessage('Successfully deleted');
            }

            return redirect()->route('teams')->withMessage('Failed to delete the team');
        } catch (Exception $e) {
            return redirect()->back()->withErrors($e->getMessage());
        }
    }

    /**
     * Remove the specified team avatar from storage.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroyAvatar(Request $request)
    {
        $team = Team::find($request->team);

        $this->handleAccess($team);

        if (Gate::denies('team-admin', $team)) {
            return redirect()->back()->withErrors(['You do not have permission to do this.']);
        }

        try {
            Storage::delete($team->avatar);

            if ($team->update([
                'avatar' => null,
            ])) {
                return redirect()->back()->withMessage('Successfully deleted the team avatar.');
            }

            return redirect()->back()->withMessage('Failed to delete the team avatar.');
        } catch (Exception $e) {
            return redirect()->back()->withErrors($e->getMessage());
        }
    }

    protected function handleAccess($team)
    {
        abort_unless(
            $team->hasActiveSubscription() || $team->user->onTrial() || auth()->user()->hasRole('admin'),
            403,
            'Subscription is required.'
        );
    }
}