PXG_2026_API/app/Http/Controllers/Api/V1/GroupController.php

104 lines
3.4 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Http\Requests\CreateGroupRequest;
use App\Http\Requests\JoinGroupRequest;
use App\Models\Event;
use App\Models\Group;
use App\Models\Player;
use App\Models\Registration;
use App\Services\GroupCodeService;
use App\Services\RegistrationCodeService;
class GroupController extends Controller
{
public function store(Event $event, CreateGroupRequest $request, GroupCodeService $groupCodeService)
{
$data = $request->validated();
$group = Group::create([
'event_id' => $event->id,
'group_code' => $groupCodeService->make(),
'size_target' => $data['size_target'],
'group_name' => $data['group_name'] ?? null,
'leader_player_id' => null,
'status' => 'OPEN',
]);
return response()->json([
'id' => $group->id,
'group_code' => $group->group_code,
'size_target' => $group->size_target,
'status' => $group->status,
], 201);
}
public function show(string $code)
{
$group = Group::where('group_code', $code)->firstOrFail();
$membersCount = Registration::where('group_id', $group->id)->count();
return response()->json([
'id' => $group->id,
'group_code' => $group->group_code,
'size_target' => $group->size_target,
'status' => $group->status,
'members_count' => $membersCount,
'group_name' => $group->group_name,
]);
}
public function join(string $code, JoinGroupRequest $request, RegistrationCodeService $regCodeService)
{
$group = Group::where('group_code', $code)->firstOrFail();
$data = $request->validated();
// Simple "full" guard
$membersCount = Registration::where('group_id', $group->id)->count();
if ($membersCount >= $group->size_target) {
return response()->json(['message' => 'Group is full'], 409);
}
$player = Player::create([
'name' => $data['player']['name'],
'phone' => $data['player']['phone'],
'email' => $data['player']['email'],
]);
$registration = Registration::create([
'event_id' => $group->event_id,
'player_id' => $player->id,
'type' => $membersCount === 0 ? 'GROUP_LEADER' : 'GROUP_MEMBER',
'group_id' => $group->id,
'status' => 'PENDING_PAYMENT',
'handicap_type' => $data['handicap']['type'],
'handicap_value' => $data['handicap']['value'] ?? null,
'handicap_band' => $data['handicap']['band'],
// Use balanced as default for group members; can be changed later in v2
'pairing_mode' => 'BALANCED',
'course_pref' => 'ANY',
'registration_code' => $regCodeService->make(),
]);
if ($membersCount === 0) {
$group->leader_player_id = $player->id;
$group->save();
}
// Update group status
$membersCount2 = $membersCount + 1;
if ($membersCount2 >= $group->size_target) {
$group->status = 'FULL';
$group->save();
}
return response()->json([
'id' => $registration->id,
'registration_code' => $registration->registration_code,
], 201);
}
}