first commit
This commit is contained in:
137
app/Http/Controllers/Teams/TeamController.php
Normal file
137
app/Http/Controllers/Teams/TeamController.php
Normal file
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Teams;
|
||||
|
||||
use App\Actions\Teams\CreateTeam;
|
||||
use App\Enums\TeamRole;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Teams\DeleteTeamRequest;
|
||||
use App\Http\Requests\Teams\SaveTeamRequest;
|
||||
use App\Models\Team;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class TeamController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the user's teams.
|
||||
*/
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
$user = $request->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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user