Skip to content

Commit 6f9a28f

Browse files
committed
Updated accept invitation logic and created decline invitation route
1 parent 1aba5b0 commit 6f9a28f

3 files changed

Lines changed: 41 additions & 22 deletions

File tree

kits/API/Teams/app/Http/Controllers/Teams/AcceptTeamInvitationController.php

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,26 @@
33
namespace App\Http\Controllers\Teams;
44

55
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Teams\AcceptTeamInvitationRequest;
67
use App\Http\Responses\MessageResponse;
78
use App\Models\TeamInvitation;
8-
use App\Models\User;
9-
use Illuminate\Http\Request;
109
use Illuminate\Http\Response;
1110
use Illuminate\Support\Facades\DB;
12-
use Illuminate\Validation\ValidationException;
11+
use Knuckles\Scribe\Attributes\Authenticated;
1312
use Knuckles\Scribe\Attributes\Endpoint;
1413
use Knuckles\Scribe\Attributes\Group;
1514
use Knuckles\Scribe\Attributes\Response as ScribeResponse;
1615

1716
#[Group('Team Invitations')]
17+
#[Authenticated]
1818
class AcceptTeamInvitationController extends Controller
1919
{
20-
#[Endpoint('Accept an invitation', 'Accept a team invitation using the signed link delivered to the invitee by email. The link must be valid, unexpired, and resolve to an existing user account.')]
20+
#[Endpoint('Accept an invitation', 'Accept a pending team invitation for the authenticated user.')]
2121
#[ScribeResponse(['message' => 'Invitation accepted successfully.'], description: 'Invitation accepted')]
22-
#[ScribeResponse(status: Response::HTTP_FORBIDDEN, description: 'Invalid signature or no matching user.')]
23-
#[ScribeResponse(status: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Invitation already accepted or expired.')]
24-
public function __invoke(Request $request, TeamInvitation $invitation): MessageResponse
22+
#[ScribeResponse(status: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Invitation already accepted, expired, or sent to a different email address.')]
23+
public function __invoke(AcceptTeamInvitationRequest $request, TeamInvitation $invitation): MessageResponse
2524
{
26-
if ($invitation->isAccepted() || $invitation->isExpired()) {
27-
throw ValidationException::withMessages([
28-
'invitation' => __('This invitation is no longer valid.'),
29-
]);
30-
}
31-
32-
$user = User::query()
33-
->whereRaw('LOWER(email) = ?', [strtolower($invitation->email)])
34-
->first();
35-
36-
abort_if($user === null, Response::HTTP_FORBIDDEN);
25+
$user = $request->user();
3726

3827
DB::transaction(function () use ($user, $invitation) {
3928
$invitation->team->memberships()->firstOrCreate(
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Teams;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Teams\AcceptTeamInvitationRequest;
7+
use App\Http\Responses\MessageResponse;
8+
use App\Models\TeamInvitation;
9+
use Illuminate\Http\Response;
10+
use Knuckles\Scribe\Attributes\Authenticated;
11+
use Knuckles\Scribe\Attributes\Endpoint;
12+
use Knuckles\Scribe\Attributes\Group;
13+
use Knuckles\Scribe\Attributes\Response as ScribeResponse;
14+
15+
#[Group('Team Invitations')]
16+
#[Authenticated]
17+
class DeclineTeamInvitationController extends Controller
18+
{
19+
#[Endpoint('Decline an invitation', 'Decline a pending team invitation for the authenticated user.')]
20+
#[ScribeResponse(['message' => 'Invitation declined successfully.'], description: 'Invitation declined')]
21+
#[ScribeResponse(status: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Invitation already accepted, expired, or sent to a different email address.')]
22+
public function __invoke(AcceptTeamInvitationRequest $request, TeamInvitation $invitation): MessageResponse
23+
{
24+
$invitation->delete();
25+
26+
return new MessageResponse('Invitation declined successfully.');
27+
}
28+
}

kits/API/Teams/routes/teams.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
<?php
22

33
use App\Http\Controllers\Teams\AcceptTeamInvitationController;
4+
use App\Http\Controllers\Teams\DeclineTeamInvitationController;
45
use App\Http\Controllers\Teams\TeamController;
56
use App\Http\Controllers\Teams\TeamInvitationController;
67
use App\Http\Controllers\Teams\TeamMemberController;
78
use App\Http\Middleware\EnsureTeamMembership;
89
use Illuminate\Support\Facades\Route;
910

10-
Route::get('invitations/{invitation}/accept', AcceptTeamInvitationController::class)
11-
->middleware('signed')
12-
->name('invitations.accept');
13-
1411
Route::middleware('auth:sanctum')->group(function () {
12+
Route::post('invitations/{invitation}/accept', AcceptTeamInvitationController::class)
13+
->name('invitations.accept');
14+
Route::delete('invitations/{invitation}', DeclineTeamInvitationController::class)
15+
->name('invitations.decline');
16+
1517
Route::middleware('verified')->group(function () {
1618
Route::get('teams', [TeamController::class, 'index'])->name('teams.index');
1719
Route::post('teams', [TeamController::class, 'store'])->name('teams.store');

0 commit comments

Comments
 (0)