Files
econom/app/Http/Controllers/Teams/TeamController.php
brusnitsyn fb2e6c58e3
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (8.3) (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled
first commit
2026-04-06 00:06:00 +09:00

138 lines
4.0 KiB
PHP

<?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');
}
}