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