user(); return Inertia::render('teams/Index', [ 'teams' => $user->toUserTeams(includeCurrent: true), ]); } /** * Store a newly created team. */ public function store(SaveTeamRequest $request, CreateTeam $createTeam): RedirectResponse { $team = $createTeam->handle($request->user(), $request->validated('name')); return to_route('teams.edit', ['team' => $team->slug]); } /** * Show the team edit page. */ public function edit(Request $request, Team $team): Response { $user = $request->user(); return Inertia::render('teams/Edit', [ 'team' => [ 'id' => $team->id, 'name' => $team->name, 'slug' => $team->slug, 'isPersonal' => $team->is_personal, ], 'members' => $team->members()->get()->map(fn ($member) => [ 'id' => $member->id, 'name' => $member->name, 'email' => $member->email, 'avatar' => $member->avatar ?? null, 'role' => $member->pivot->role->value, 'role_label' => $member->pivot->role?->label(), ]), 'invitations' => $team->invitations() ->whereNull('accepted_at') ->get() ->map(fn ($invitation) => [ 'code' => $invitation->code, 'email' => $invitation->email, 'role' => $invitation->role->value, 'role_label' => $invitation->role->label(), 'created_at' => $invitation->created_at->toISOString(), ]), 'permissions' => $user->toTeamPermissions($team), 'availableRoles' => TeamRole::assignable(), ]); } /** * Update the specified team. */ public function update(SaveTeamRequest $request, Team $team): RedirectResponse { Gate::authorize('update', $team); $team = DB::transaction(function () use ($request, $team) { $team = Team::whereKey($team->id)->lockForUpdate()->firstOrFail(); $team->update(['name' => $request->validated('name')]); return $team; }); return to_route('teams.edit', ['team' => $team->slug]); } /** * Switch the user's current team. */ public function switch(Request $request, Team $team): RedirectResponse { abort_unless($request->user()->belongsToTeam($team), 403); $request->user()->switchTeam($team); return back(); } /** * Delete the specified team. */ public function destroy(DeleteTeamRequest $request, Team $team): RedirectResponse { $user = $request->user(); $fallbackTeam = $user->isCurrentTeam($team) ? $user->fallbackTeam($team) : null; DB::transaction(function () use ($user, $team) { User::where('current_team_id', $team->id) ->where('id', '!=', $user->id) ->each(fn (User $affectedUser) => $affectedUser->switchTeam($affectedUser->personalTeam())); $team->invitations()->delete(); $team->memberships()->delete(); $team->delete(); }); if ($fallbackTeam) { $user->switchTeam($fallbackTeam); } return to_route('teams.index'); } }