user(); $canCreateTeams = $this->permissionService->allows($user, Permission::TeamCreate); $manageableTeamIds = $this->permissionService->manageableTeamIds($user); abort_unless($canCreateTeams || $manageableTeamIds !== [], 403); $teams = Team::query() ->whereIn('id', $manageableTeamIds) ->with('users') ->orderBy('name') ->get(); return Inertia::render('teams/Index', [ 'canCreateTeams' => $canCreateTeams, 'permissionOptions' => PermissionOptionResource::collection( $this->permissionService->permissionOptions(User::class, Team::class), )->resolve(), 'status' => session('status'), 'teamPermissions' => $teams ->mapWithKeys(fn (Team $team): array => [ $team->id => $this->permissionService->assignmentMap(User::class, $team), ]) ->all(), 'teams' => TeamResource::collection($teams)->resolve(), 'users' => UserResource::collection( User::query() ->orderBy('name') ->get(), )->resolve(), ]); } public function store(StoreTeamRequest $request): RedirectResponse { $team = Team::query()->create($request->validated()); return to_route('teams.index') ->with('status', "{$team->name} was created."); } public function updateMembers(UpdateTeamMembersRequest $request, Team $team): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::TeamManage, $team), 403, ); $validated = $request->validated(); $userIds = Arr::get($validated, 'user_ids', []); $team->users()->sync($userIds); return to_route('teams.index') ->with('status', "{$team->name} members were updated."); } public function updateUserPermissions( SyncTeamUserPermissionsRequest $request, Team $team, User $user, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::TeamManage, $team), 403, ); $validated = $request->validated(); $permissions = Arr::get($validated, 'permissions', []); $this->permissionService->sync($user, $team, $permissions); return to_route('teams.index') ->with('status', "{$user->name} permissions on {$team->name} were updated."); } }