From 2e55ea1d98e57769972fdde69de20bd717bf8191 Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sat, 23 Jan 2021 15:07:49 -0800 Subject: [PATCH] Configure basic API paging, sorting, and filtering --- app/JsonApi/Adapters/FoodAdapter.php | 21 +++++------ .../Adapters/IngredientAmountAdapter.php | 31 ++++++++-------- app/JsonApi/Adapters/JournalEntryAdapter.php | 35 +++++++++++-------- app/JsonApi/Adapters/RecipeAdapter.php | 33 +++++++++-------- app/JsonApi/Adapters/RecipeStepAdapter.php | 24 ++++++------- app/JsonApi/Adapters/UserAdapter.php | 22 +++++------- app/Models/JournalEntry.php | 2 +- routes/api.php | 2 +- 8 files changed, 87 insertions(+), 83 deletions(-) diff --git a/app/JsonApi/Adapters/FoodAdapter.php b/app/JsonApi/Adapters/FoodAdapter.php index 52fbee4..b8a7979 100644 --- a/app/JsonApi/Adapters/FoodAdapter.php +++ b/app/JsonApi/Adapters/FoodAdapter.php @@ -11,23 +11,22 @@ class FoodAdapter extends AbstractAdapter { /** - * Mapping of JSON API attribute field names to model keys. - * - * @var array + * {@inheritdoc} */ protected $attributes = []; /** - * Mapping of JSON API filter names to model scopes. - * - * @var array + * {@inheritdoc} */ protected $filterScopes = []; /** - * Adapter constructor. - * - * @param StandardStrategy $paging + * {@inheritdoc} + */ + protected $defaultSort = ['name']; + + /** + * {@inheritdoc} */ public function __construct(StandardStrategy $paging) { @@ -35,9 +34,7 @@ class FoodAdapter extends AbstractAdapter } /** - * @param Builder $query - * @param Collection $filters - * @return void + * {@inheritdoc} */ protected function filter($query, Collection $filters) { diff --git a/app/JsonApi/Adapters/IngredientAmountAdapter.php b/app/JsonApi/Adapters/IngredientAmountAdapter.php index 13f1a34..ab9f2a9 100644 --- a/app/JsonApi/Adapters/IngredientAmountAdapter.php +++ b/app/JsonApi/Adapters/IngredientAmountAdapter.php @@ -2,54 +2,57 @@ namespace App\JsonApi\Adapters; +use App\Models\IngredientAmount; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; use CloudCreativity\LaravelJsonApi\Eloquent\BelongsTo; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; class IngredientAmountAdapter extends AbstractAdapter { /** - * Mapping of JSON API attribute field names to model keys. - * - * @var array + * {@inheritdoc} */ protected $attributes = []; /** - * Mapping of JSON API filter names to model scopes. - * - * @var array + * {@inheritdoc} */ protected $filterScopes = []; /** - * Adapter constructor. - * - * @param StandardStrategy $paging + * {@inheritdoc} + */ + protected $defaultSort = ['weight']; + + /** + * {@inheritdoc} */ public function __construct(StandardStrategy $paging) { - parent::__construct(new \App\Models\IngredientAmount(), $paging); + parent::__construct(new IngredientAmount(), $paging); } /** - * @param Builder $query - * @param Collection $filters - * @return void + * {@inheritdoc} */ protected function filter($query, Collection $filters) { $this->filterWithScopes($query, $filters); } + /** + * Ingredient relationship. + */ protected function ingredient(): BelongsTo { return $this->belongsTo(); } + /** + * Parent (Recipe or JournalEntry). + */ protected function parent(): BelongsTo { return $this->belongsTo(); diff --git a/app/JsonApi/Adapters/JournalEntryAdapter.php b/app/JsonApi/Adapters/JournalEntryAdapter.php index 6cefcfb..8a686a2 100644 --- a/app/JsonApi/Adapters/JournalEntryAdapter.php +++ b/app/JsonApi/Adapters/JournalEntryAdapter.php @@ -6,30 +6,28 @@ 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; class JournalEntryAdapter extends AbstractAdapter { /** - * Mapping of JSON API attribute field names to model keys. - * - * @var array + * @inheritdoc */ protected $attributes = []; /** - * Mapping of JSON API filter names to model scopes. - * - * @var array + * @inheritdoc */ protected $filterScopes = []; /** - * Adapter constructor. - * - * @param StandardStrategy $paging + * {@inheritdoc} + */ + protected $defaultSort = ['-date']; + + /** + * @inheritdoc */ public function __construct(StandardStrategy $paging) { @@ -37,28 +35,35 @@ class JournalEntryAdapter extends AbstractAdapter } /** - * @param Builder $query - * @param Collection $filters - * @return void + * @inheritdoc */ protected function filter($query, Collection $filters) { $this->filterWithScopes($query, $filters); } + /** + * User relationship. + */ protected function user(): BelongsTo { return $this->belongsTo(); } + /** + * Food relationships. + */ protected function foods(): MorphHasMany { - return $this->morphMany(); + return $this->morphMany($this->hasMany('foods')); } + /** + * Recipe relationships. + */ protected function recipes(): MorphHasMany { - return $this->morphMany(); + return $this->morphMany($this->hasMany('recipes')); } } diff --git a/app/JsonApi/Adapters/RecipeAdapter.php b/app/JsonApi/Adapters/RecipeAdapter.php index 6e57caa..256935e 100644 --- a/app/JsonApi/Adapters/RecipeAdapter.php +++ b/app/JsonApi/Adapters/RecipeAdapter.php @@ -4,31 +4,30 @@ namespace App\JsonApi\Adapters; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; use CloudCreativity\LaravelJsonApi\Eloquent\HasMany; +use CloudCreativity\LaravelJsonApi\Eloquent\MorphHasMany; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; class RecipeAdapter extends AbstractAdapter { /** - * Mapping of JSON API attribute field names to model keys. - * - * @var array + * {@inheritdoc} */ protected $attributes = []; /** - * Mapping of JSON API filter names to model scopes. - * - * @var array + * {@inheritdoc} */ protected $filterScopes = []; /** - * Adapter constructor. - * - * @param StandardStrategy $paging + * {@inheritdoc} + */ + protected $defaultSort = ['name']; + + /** + * {@inheritdoc} */ public function __construct(StandardStrategy $paging) { @@ -36,20 +35,24 @@ class RecipeAdapter extends AbstractAdapter } /** - * @param Builder $query - * @param Collection $filters - * @return void + * {@inheritdoc} */ protected function filter($query, Collection $filters) { $this->filterWithScopes($query, $filters); } - protected function ingredientAmounts(): HasMany + /** + * Ingredient amount relationships. + */ + protected function ingredientAmounts(): MorphHasMany { - return $this->hasMany(); + return $this->morphMany($this->hasMany('ingredientAmounts')); } + /** + * Step relationships. + */ protected function steps(): HasMany { return $this->hasMany(); diff --git a/app/JsonApi/Adapters/RecipeStepAdapter.php b/app/JsonApi/Adapters/RecipeStepAdapter.php index 767e705..0271cb5 100644 --- a/app/JsonApi/Adapters/RecipeStepAdapter.php +++ b/app/JsonApi/Adapters/RecipeStepAdapter.php @@ -12,23 +12,22 @@ class RecipeStepAdapter extends AbstractAdapter { /** - * Mapping of JSON API attribute field names to model keys. - * - * @var array + * {@inheritdoc} */ protected $attributes = []; /** - * Mapping of JSON API filter names to model scopes. - * - * @var array + * {@inheritdoc} */ protected $filterScopes = []; /** - * Adapter constructor. - * - * @param StandardStrategy $paging + * {@inheritdoc} + */ + protected $defaultSort = ['number']; + + /** + * {@inheritdoc} */ public function __construct(StandardStrategy $paging) { @@ -36,15 +35,16 @@ class RecipeStepAdapter extends AbstractAdapter } /** - * @param Builder $query - * @param Collection $filters - * @return void + * {@inheritdoc} */ protected function filter($query, Collection $filters) { $this->filterWithScopes($query, $filters); } + /** + * Recipe relationship. + */ protected function recipe(): BelongsTo { return $this->belongsTo(); diff --git a/app/JsonApi/Adapters/UserAdapter.php b/app/JsonApi/Adapters/UserAdapter.php index 77c9488..16d9e90 100644 --- a/app/JsonApi/Adapters/UserAdapter.php +++ b/app/JsonApi/Adapters/UserAdapter.php @@ -4,30 +4,28 @@ namespace App\JsonApi\Adapters; use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter; use CloudCreativity\LaravelJsonApi\Pagination\StandardStrategy; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; class UserAdapter extends AbstractAdapter { /** - * Mapping of JSON API attribute field names to model keys. - * - * @var array + * {@inheritdoc} */ protected $attributes = []; /** - * Mapping of JSON API filter names to model scopes. - * - * @var array + * {@inheritdoc} */ protected $filterScopes = []; /** - * Adapter constructor. - * - * @param StandardStrategy $paging + * {@inheritdoc} + */ + protected $defaultSort = ['name']; + + /** + * {@inheritdoc} */ public function __construct(StandardStrategy $paging) { @@ -35,9 +33,7 @@ class UserAdapter extends AbstractAdapter } /** - * @param Builder $query - * @param Collection $filters - * @return void + * {@inheritdoc} */ protected function filter($query, Collection $filters) { diff --git a/app/Models/JournalEntry.php b/app/Models/JournalEntry.php index a6db642..90c1fba 100644 --- a/app/Models/JournalEntry.php +++ b/app/Models/JournalEntry.php @@ -94,7 +94,7 @@ class JournalEntry extends Model } /** - * Get all recipes related to this entry. + * Get all foods related to this entry. */ public function foods(): MorphToMany { return $this->morphedByMany(Food::class, 'journalable'); diff --git a/routes/api.php b/routes/api.php index c62f4a7..ee5ef9a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -15,7 +15,7 @@ JsonApi::register('v1')->routes(function ($api) { $api->resource('foods')->readOnly(); $api->resource('ingredient-amounts')->relationships(function ($relations) { $relations->hasOne('ingredient')->readOnly(); - $relations->hasOne('ingredparentient')->readOnly(); + $relations->hasOne('parent')->readOnly(); })->readOnly(); $api->resource('journal-entries')->relationships(function ($relations) { $relations->hasMany('foods')->readOnly();