Add room participant moderation

This commit is contained in:
2026-09-03 11:35:05 +02:00
parent e30d2e61aa
commit 2f05e56089
14 changed files with 453 additions and 15 deletions
@@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\KickRoomPlayerRequest;
use App\Models\Player;
use App\Models\Room;
use App\Models\User;
use App\Services\Rooms\RoomParticipationService;
use Illuminate\Http\RedirectResponse;
use Inertia\Inertia;
class RoomPlayerKickController extends Controller
{
public function __construct(
private readonly RoomParticipationService $roomParticipation,
) {}
public function __invoke(KickRoomPlayerRequest $request, Room $room, Player $player): RedirectResponse
{
$user = $request->user();
abort_unless($user instanceof User, 403);
$this->roomParticipation->kick($room, $player, $user);
Inertia::flash('toast', [
'type' => 'success',
'message' => "{$player->name} wurde aus dem Raum entfernt.",
]);
return back();
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Http\Requests;
use App\Models\Player;
use App\Models\Room;
use Illuminate\Foundation\Http\FormRequest;
class KickRoomPlayerRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
$room = $this->route('room');
$player = $this->route('player');
return $room instanceof Room
&& $player instanceof Player
&& $this->user()?->id === $room->owner_id
&& $player->room_id === $room->id
&& $player->user_id !== $room->owner_id;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, array<int, string>>
*/
public function rules(): array
{
return [];
}
}
@@ -19,6 +19,17 @@ class DashboardRoomResource extends JsonResource
'current_round' => $this->resource->current_round,
'players_count' => $this->resource->players_count,
'active_player_count' => $this->resource->active_player_count,
'players' => $this->resource->relationLoaded('activePlayers')
? $this->resource->activePlayers
->map(fn ($player): array => [
'id' => $player->id,
'name' => $player->name,
'is_moderator' => $player->is_moderator,
'is_owner' => $player->user_id === $this->resource->owner_id,
])
->values()
->all()
: [],
'last_activity_at' => $this->resource->last_activity_at?->toIso8601String(),
'closed_at' => $this->resource->closed_at?->toIso8601String(),
];