From 39455af3c91d1c09120b4176cd43d9024891b627 Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sat, 23 Jan 2021 14:47:40 -0800 Subject: [PATCH] Add API relationships --- .../Adapters/IngredientAmountAdapter.php | 11 +++++++ app/JsonApi/Adapters/JournalEntryAdapter.php | 17 ++++++++++ app/JsonApi/Adapters/RecipeAdapter.php | 11 +++++++ app/JsonApi/Adapters/RecipeStepAdapter.php | 6 ++++ .../Schemas/IngredientAmountSchema.php | 25 ++++++++++++++ app/JsonApi/Schemas/JournalEntrySchema.php | 33 +++++++++++++++++++ app/JsonApi/Schemas/RecipeSchema.php | 26 +++++++++++++++ app/JsonApi/Schemas/RecipeStepSchema.php | 13 ++++++++ routes/api.php | 10 +++--- 9 files changed, 148 insertions(+), 4 deletions(-) diff --git a/app/JsonApi/Adapters/IngredientAmountAdapter.php b/app/JsonApi/Adapters/IngredientAmountAdapter.php index 7272e7f..13f1a34 100644 --- a/app/JsonApi/Adapters/IngredientAmountAdapter.php +++ b/app/JsonApi/Adapters/IngredientAmountAdapter.php @@ -3,6 +3,7 @@ namespace App\JsonApi\Adapters; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; +use CloudCreativity\LaravelJsonApi\Eloquent\BelongsTo; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; @@ -44,4 +45,14 @@ class IngredientAmountAdapter extends AbstractAdapter $this->filterWithScopes($query, $filters); } + protected function ingredient(): BelongsTo + { + return $this->belongsTo(); + } + + protected function parent(): BelongsTo + { + return $this->belongsTo(); + } + } diff --git a/app/JsonApi/Adapters/JournalEntryAdapter.php b/app/JsonApi/Adapters/JournalEntryAdapter.php index 0cc0c9f..6cefcfb 100644 --- a/app/JsonApi/Adapters/JournalEntryAdapter.php +++ b/app/JsonApi/Adapters/JournalEntryAdapter.php @@ -3,6 +3,8 @@ namespace App\JsonApi\Adapters; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; +use CloudCreativity\LaravelJsonApi\Eloquent\BelongsTo; +use CloudCreativity\LaravelJsonApi\Eloquent\MorphHasMany; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; @@ -44,4 +46,19 @@ class JournalEntryAdapter extends AbstractAdapter $this->filterWithScopes($query, $filters); } + protected function user(): BelongsTo + { + return $this->belongsTo(); + } + + protected function foods(): MorphHasMany + { + return $this->morphMany(); + } + + protected function recipes(): MorphHasMany + { + return $this->morphMany(); + } + } diff --git a/app/JsonApi/Adapters/RecipeAdapter.php b/app/JsonApi/Adapters/RecipeAdapter.php index 28b7d5e..6e57caa 100644 --- a/app/JsonApi/Adapters/RecipeAdapter.php +++ b/app/JsonApi/Adapters/RecipeAdapter.php @@ -3,6 +3,7 @@ namespace App\JsonApi\Adapters; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; +use CloudCreativity\LaravelJsonApi\Eloquent\HasMany; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; @@ -44,4 +45,14 @@ class RecipeAdapter extends AbstractAdapter $this->filterWithScopes($query, $filters); } + protected function ingredientAmounts(): HasMany + { + return $this->hasMany(); + } + + protected function steps(): HasMany + { + return $this->hasMany(); + } + } diff --git a/app/JsonApi/Adapters/RecipeStepAdapter.php b/app/JsonApi/Adapters/RecipeStepAdapter.php index ab38b9d..767e705 100644 --- a/app/JsonApi/Adapters/RecipeStepAdapter.php +++ b/app/JsonApi/Adapters/RecipeStepAdapter.php @@ -3,6 +3,7 @@ namespace App\JsonApi\Adapters; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; +use CloudCreativity\LaravelJsonApi\Eloquent\BelongsTo; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; @@ -44,4 +45,9 @@ class RecipeStepAdapter extends AbstractAdapter $this->filterWithScopes($query, $filters); } + protected function recipe(): BelongsTo + { + return $this->belongsTo(); + } + } diff --git a/app/JsonApi/Schemas/IngredientAmountSchema.php b/app/JsonApi/Schemas/IngredientAmountSchema.php index bc38a6e..d832ca8 100644 --- a/app/JsonApi/Schemas/IngredientAmountSchema.php +++ b/app/JsonApi/Schemas/IngredientAmountSchema.php @@ -45,4 +45,29 @@ class IngredientAmountSchema extends SchemaProvider 'updatedAt' => $resource->updated_at, ]; } + + /** + * @inheritdoc + */ + public function getRelationships($resource, $isPrimary, array $includeRelationships): array + { + return [ + 'ingredient' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['ingredient']), + self::DATA => function () use ($resource) { + return $resource->ingredient; + }, + ], + 'parent' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['parent']), + self::DATA => function () use ($resource) { + return $resource->parent; + }, + ] + ]; + } } diff --git a/app/JsonApi/Schemas/JournalEntrySchema.php b/app/JsonApi/Schemas/JournalEntrySchema.php index 3b1560e..9d1a54e 100644 --- a/app/JsonApi/Schemas/JournalEntrySchema.php +++ b/app/JsonApi/Schemas/JournalEntrySchema.php @@ -43,4 +43,37 @@ class JournalEntrySchema extends SchemaProvider 'updatedAt' => $resource->updated_at, ]; } + + /** + * @inheritdoc + */ + public function getRelationships($resource, $isPrimary, array $includeRelationships): array + { + return [ + 'user' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['user']), + self::DATA => function () use ($resource) { + return $resource->user; + }, + ], + 'foods' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['foods']), + self::DATA => function () use ($resource) { + return $resource->foods; + }, + ], + 'recipes' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['recipes']), + self::DATA => function () use ($resource) { + return $resource->recipes; + }, + ] + ]; + } } diff --git a/app/JsonApi/Schemas/RecipeSchema.php b/app/JsonApi/Schemas/RecipeSchema.php index a189189..83626da 100644 --- a/app/JsonApi/Schemas/RecipeSchema.php +++ b/app/JsonApi/Schemas/RecipeSchema.php @@ -2,6 +2,7 @@ namespace App\JsonApi\Schemas; +use CloudCreativity\LaravelJsonApi\Eloquent\HasMany; use Neomerx\JsonApi\Schema\SchemaProvider; class RecipeSchema extends SchemaProvider @@ -50,4 +51,29 @@ class RecipeSchema extends SchemaProvider 'updatedAt' => $resource->updated_at, ]; } + + /** + * @inheritdoc + */ + public function getRelationships($resource, $isPrimary, array $includeRelationships): array + { + return [ + 'steps' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['steps']), + self::DATA => function () use ($resource) { + return $resource->steps; + }, + ], + 'ingredient-amounts' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['ingredient-amounts']), + self::DATA => function () use ($resource) { + return $resource->ingredientAmounts; + }, + ] + ]; + } } diff --git a/app/JsonApi/Schemas/RecipeStepSchema.php b/app/JsonApi/Schemas/RecipeStepSchema.php index a111f2f..d00a37f 100644 --- a/app/JsonApi/Schemas/RecipeStepSchema.php +++ b/app/JsonApi/Schemas/RecipeStepSchema.php @@ -36,4 +36,17 @@ class RecipeStepSchema extends SchemaProvider 'updatedAt' => $resource->updated_at, ]; } + + /** + * @inheritdoc + */ + public function getRelationships($resource, $isPrimary, array $includeRelationships): array + { + return [ + 'recipe' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + ] + ]; + } } diff --git a/routes/api.php b/routes/api.php index 5371ff9..c62f4a7 100644 --- a/routes/api.php +++ b/routes/api.php @@ -14,15 +14,17 @@ JsonApi::register('v1')->routes(function ($api) { $api->resource('foods')->readOnly(); $api->resource('ingredient-amounts')->relationships(function ($relations) { - $relations->hasOne('ingredient', 'parent')->readOnly(); + $relations->hasOne('ingredient')->readOnly(); + $relations->hasOne('ingredparentient')->readOnly(); })->readOnly(); $api->resource('journal-entries')->relationships(function ($relations) { - $relations->hasMany('foods', 'recipes')->readOnly(); + $relations->hasMany('foods')->readOnly(); + $relations->hasMany('recipes')->readOnly(); $relations->hasOne('user')->readOnly(); })->readOnly(); $api->resource('recipes')->relationships(function ($relations) { - $relations->hasMany('recipe-steps')->uri('steps')->readOnly(); - $relations->hasMany('ingredient-amounts')->uri('ingredients')->readOnly(); + $relations->hasMany('steps')->readOnly(); + $relations->hasMany('ingredient-amounts')->readOnly(); })->readOnly(); $api->resource('recipe-steps')->relationships(function ($relations) { $relations->hasOne('recipe')->readOnly();