user(); $groups = Group::query() ->where('owner_id', $user->id) ->orWhereHas('members', fn ($q) => $q->where('users.id', $user->id)) ->withCount('members') ->orderBy('name') ->get(); return view('groups.index', compact('groups')); } public function create(): View { $this->authorize('create', Group::class); return view('groups.create'); } public function store(Request $request): RedirectResponse { $this->authorize('create', Group::class); $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string', 'max:5000'], ]); $group = Group::create([ ...$data, 'owner_id' => $request->user()->id, ]); return redirect()->route('groups.show', $group); } public function show(Request $request, Group $group): View { $this->authorize('view', $group); $group->load('owner', 'members'); return view('groups.show', [ 'group' => $group, 'canManage' => $request->user()->can('manageMembers', $group), ]); } public function addMember(Request $request, Group $group): RedirectResponse { $this->authorize('manageMembers', $group); $data = $request->validate([ 'email' => ['required', 'email'], ]); $user = User::where('email', $data['email'])->first(); if (! $user) { return back()->withErrors(['email' => 'No user found with that email address.']); } if ($user->id === $group->owner_id) { return back()->withErrors(['email' => 'The group owner is already implicitly a member.']); } $group->members()->syncWithoutDetaching([$user->id]); return redirect()->route('groups.show', $group); } public function removeMember(Request $request, Group $group, User $user): RedirectResponse { $this->authorize('manageMembers', $group); $group->members()->detach($user->id); return redirect()->route('groups.show', $group); } }