From 8ea86b8ef2766fd45cea9c4c0112e38fc112948f Mon Sep 17 00:00:00 2001 From: mubbasher-ahmed Date: Sun, 20 Jul 2025 00:49:41 +0500 Subject: [PATCH 1/3] fix: fix user resource for undefined key access_token --- app/Http/Resources/V1/Auth/UserResource.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/Http/Resources/V1/Auth/UserResource.php b/app/Http/Resources/V1/Auth/UserResource.php index 5bcdfc9..281f713 100644 --- a/app/Http/Resources/V1/Auth/UserResource.php +++ b/app/Http/Resources/V1/Auth/UserResource.php @@ -49,13 +49,16 @@ public function toArray(Request $request): array return array_values(array_unique($permissionSlugs)); }), - $this->mergeWhen(isset($this->resource->access_token), [ - 'access_token' => $this->resource->access_token, - 'refresh_token' => $this->resource->refresh_token, - 'access_token_expires_at' => $this->resource->access_token_expires_at?->toISOString(), - 'refresh_token_expires_at' => $this->resource->refresh_token_expires_at?->toISOString(), - 'token_type' => 'Bearer', - ]), + $this->mergeWhen( + array_key_exists('access_token', $this->resource->getAttributes()), + fn () => [ + 'access_token' => $this->resource->getAttributes()['access_token'], + 'refresh_token' => $this->resource->getAttributes()['refresh_token'] ?? null, + 'access_token_expires_at' => optional($this->resource->getAttributes()['access_token_expires_at'] ?? null)?->toISOString(), + 'refresh_token_expires_at' => optional($this->resource->getAttributes()['refresh_token_expires_at'] ?? null)?->toISOString(), + 'token_type' => 'Bearer', + ] + ), ]; } } From 29dc842af648c5dbd7c18467ecf9ec12f5d6ab96 Mon Sep 17 00:00:00 2001 From: mubbasher-ahmed Date: Sun, 20 Jul 2025 00:51:37 +0500 Subject: [PATCH 2/3] feat: added Me controller for get user profile API --- .../Controllers/Api/V1/User/MeController.php | 36 +++++++++++++++++++ lang/en/common.php | 1 + routes/api_v1.php | 4 +-- 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/Api/V1/User/MeController.php diff --git a/app/Http/Controllers/Api/V1/User/MeController.php b/app/Http/Controllers/Api/V1/User/MeController.php new file mode 100644 index 0000000..0cb8f6c --- /dev/null +++ b/app/Http/Controllers/Api/V1/User/MeController.php @@ -0,0 +1,36 @@ +user(); + $user->load(['roles.permissions']); + + return response()->apiSuccess( + new \App\Http\Resources\V1\Auth\UserResource($user), + __('common.success') + ); + } +} diff --git a/lang/en/common.php b/lang/en/common.php index cf59e63..0a67c9d 100644 --- a/lang/en/common.php +++ b/lang/en/common.php @@ -11,4 +11,5 @@ */ 'something_went_wrong' => 'Something went wrong! Try again later.', + 'success' => 'Response returned successfully.', ]; diff --git a/routes/api_v1.php b/routes/api_v1.php index 2dbf567..f105c64 100644 --- a/routes/api_v1.php +++ b/routes/api_v1.php @@ -18,8 +18,6 @@ // User Routes Route::middleware(['auth:sanctum', 'ability:access-api'])->group(function () { - Route::get('/me', function (Request $request) { - return auth()->user(); - }); + Route::get('/me', \App\Http\Controllers\Api\V1\User\MeController::class); }); }); From c8549c9106f3a5d54d34e7fba8b9b6a8c47b9966 Mon Sep 17 00:00:00 2001 From: mubbasher-ahmed Date: Sun, 20 Jul 2025 00:59:26 +0500 Subject: [PATCH 3/3] feat: add test coverage for me controller --- .../Controllers/Api/V1/User/MeController.php | 2 + .../Feature/API/V1/User/MeControllerTest.php | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 tests/Feature/API/V1/User/MeControllerTest.php diff --git a/app/Http/Controllers/Api/V1/User/MeController.php b/app/Http/Controllers/Api/V1/User/MeController.php index 0cb8f6c..98d9aeb 100644 --- a/app/Http/Controllers/Api/V1/User/MeController.php +++ b/app/Http/Controllers/Api/V1/User/MeController.php @@ -1,5 +1,7 @@ create([ + 'name' => 'John Doe', + 'email' => 'john@example.com', + ]); + + // Authenticate the user with Sanctum + Sanctum::actingAs($user, ['access-api']); + + // Make request to /me endpoint + $response = $this->getJson('/api/v1/me'); + + // Assert response structure + $response + ->assertStatus(200) + ->assertJsonStructure([ + 'status', + 'message', + 'data' => [ + 'id', + 'name', + 'email', + 'email_verified_at', + 'bio', + 'avatar_url', + 'twitter', + 'facebook', + 'linkedin', + 'github', + 'website', + ], + ]) + ->assertJson([ + 'status' => true, + 'data' => [ + 'id' => $user->id, + 'name' => 'John Doe', + 'email' => 'john@example.com', + ], + ]); + }); +});