From 0ed25fec039ea98b3ac0bc4a6ad2b4d863719f92 Mon Sep 17 00:00:00 2001 From: Refringe Date: Wed, 7 Aug 2024 23:30:09 -0400 Subject: [PATCH] User API Updates Adds user profile links to the user API resource. Fixes structure of relationship data and link sections. Adds parameter to include related user data when requesting mod data. --- app/Http/Controllers/Api/V0/ApiController.php | 22 ++++++++++++++ app/Http/Controllers/Api/V0/ModController.php | 3 +- .../Controllers/Api/V0/UsersController.php | 3 +- app/Http/Resources/Api/V0/ModResource.php | 29 ++++++++++++------- app/Http/Resources/Api/V0/UserResource.php | 6 ++-- 5 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 app/Http/Controllers/Api/V0/ApiController.php diff --git a/app/Http/Controllers/Api/V0/ApiController.php b/app/Http/Controllers/Api/V0/ApiController.php new file mode 100644 index 0000000..e6c3955 --- /dev/null +++ b/app/Http/Controllers/Api/V0/ApiController.php @@ -0,0 +1,22 @@ +get('include'); + + if (! $param) { + return false; + } + + $includeValues = explode(',', Str::lower($param)); + + return in_array(Str::lower($relationship), $includeValues); + } +} diff --git a/app/Http/Controllers/Api/V0/ModController.php b/app/Http/Controllers/Api/V0/ModController.php index 2711ce1..1f69eb2 100644 --- a/app/Http/Controllers/Api/V0/ModController.php +++ b/app/Http/Controllers/Api/V0/ModController.php @@ -2,13 +2,12 @@ namespace App\Http\Controllers\Api\V0; -use App\Http\Controllers\Controller; use App\Http\Requests\Api\V0\StoreModRequest; use App\Http\Requests\Api\V0\UpdateModRequest; use App\Http\Resources\Api\V0\ModResource; use App\Models\Mod; -class ModController extends Controller +class ModController extends ApiController { /** * Display a listing of the resource. diff --git a/app/Http/Controllers/Api/V0/UsersController.php b/app/Http/Controllers/Api/V0/UsersController.php index d876348..a93f52c 100644 --- a/app/Http/Controllers/Api/V0/UsersController.php +++ b/app/Http/Controllers/Api/V0/UsersController.php @@ -2,13 +2,12 @@ namespace App\Http\Controllers\Api\V0; -use App\Http\Controllers\Controller; use App\Http\Requests\Api\V0\StoreUserRequest; use App\Http\Requests\Api\V0\UpdateUserRequest; use App\Http\Resources\Api\V0\UserResource; use App\Models\User; -class UsersController extends Controller +class UsersController extends ApiController { /** * Display a listing of the resource. diff --git a/app/Http/Resources/Api/V0/ModResource.php b/app/Http/Resources/Api/V0/ModResource.php index 42fd8d4..6b2d2e9 100644 --- a/app/Http/Resources/Api/V0/ModResource.php +++ b/app/Http/Resources/Api/V0/ModResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources\Api\V0; +use App\Http\Controllers\Api\V0\ApiController; use App\Models\Mod; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; @@ -35,23 +36,29 @@ class ModResource extends JsonResource 'published_at' => $this->published_at, ], 'relationships' => [ - 'users' => [ - 'data' => $this->users->map(fn ($user) => [ + 'users' => $this->users->map(fn ($user) => [ + 'data' => [ 'type' => 'user', 'id' => $user->id, - ])->toArray(), - - // TODO: Provide 'links.self' to user profile - //'links' => ['self' => '#'], - ], + ], + 'links' => [ + 'self' => $user->profileUrl(), + ], + ])->toArray(), 'license' => [ - 'data' => [ - 'type' => 'license', - 'id' => $this->license_id, + [ + 'data' => [ + 'type' => 'license', + 'id' => $this->license_id, + ], ], ], ], - 'included' => $this->users->map(fn ($user) => new UserResource($user)), + + 'includes' => $this->when( + ApiController::shouldInclude('users'), + fn () => $this->users->map(fn ($user) => new UserResource($user)) + ), // TODO: Provide 'included' data for attached 'license': //new LicenseResource($this->license) diff --git a/app/Http/Resources/Api/V0/UserResource.php b/app/Http/Resources/Api/V0/UserResource.php index f4e2e68..f4e63d1 100644 --- a/app/Http/Resources/Api/V0/UserResource.php +++ b/app/Http/Resources/Api/V0/UserResource.php @@ -30,11 +30,13 @@ class UserResource extends JsonResource ], ], ], + // TODO: Provide 'included' data for attached 'user_role' //'included' => [new UserRoleResource($this->role)], - // TODO: Provide 'links.self' to user profile: - //'links' => ['self' => '#'], + 'links' => [ + 'self' => $this->profileUrl(), + ], ]; } }