104 lines
3.4 KiB
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);
|
|
}
|
|
}
|