diff --git a/app/JsonApi/Adapters/MediumAdapter.php b/app/JsonApi/Adapters/MediumAdapter.php new file mode 100644 index 0000000..cc14c04 --- /dev/null +++ b/app/JsonApi/Adapters/MediumAdapter.php @@ -0,0 +1,61 @@ +filterWithScopes($query, $filters); + } + + /** + * Parent model (Recipe or Food). + */ + protected function owner(): BelongsTo + { + return $this->belongsTo('model'); + } + +} diff --git a/app/JsonApi/Adapters/RecipeAdapter.php b/app/JsonApi/Adapters/RecipeAdapter.php index b6d08ad..7d14300 100644 --- a/app/JsonApi/Adapters/RecipeAdapter.php +++ b/app/JsonApi/Adapters/RecipeAdapter.php @@ -62,6 +62,14 @@ class RecipeAdapter extends AbstractAdapter return $this->morphMany($this->hasMany('ingredientAmounts')); } + /** + * Media relationships. + */ + protected function media(): MorphHasMany + { + return $this->morphMany($this->hasMany('media')); + } + /** * Step relationships. */ diff --git a/app/JsonApi/Schemas/MediumSchema.php b/app/JsonApi/Schemas/MediumSchema.php new file mode 100644 index 0000000..3c7ce87 --- /dev/null +++ b/app/JsonApi/Schemas/MediumSchema.php @@ -0,0 +1,81 @@ +getRouteKey(); + } + + /** + * {@inheritdoc} + */ + public function getAttributes($resource): array + { + /** @var \Spatie\MediaLibrary\MediaCollections\Models\Media $resource */ + $attributes = [ + 'uuid' => $resource->uuid, + 'collectionName' => $resource->collection_name, + 'name' => $resource->name, + 'fileName' => $resource->file_name, + 'url' => $resource->getUrl(), + 'mimeType' => $resource->mime_type, + 'size' => $resource->size, + 'sizeFormatted' => $resource->getHumanReadableSizeAttribute(), + 'manipulations' => $resource->manipulations, + 'customProperties' => $resource->custom_properties, + 'conversions' => [], + 'responsiveImages' => $resource->responsive_images, + 'orderColumn' => $resource->order_column, + 'createdAt' => $resource->created_at, + 'updatedAt' => $resource->updated_at, + ]; + + // Add all conversion URLs. + foreach ($resource->getGeneratedConversions() as $conversion_name => $generated) { + if ($generated) { + $attributes['conversions'][$conversion_name] = $resource->getUrl($conversion_name); + } + } + + return $attributes; + } + + /** + * @inheritdoc + */ + public function getRelationships($resource, $isPrimary, array $includeRelationships): array + { + return [ + 'owner' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['model']), + self::DATA => function () use ($resource) { + return $resource->model; + }, + ] + ]; + } +} diff --git a/app/JsonApi/Schemas/RecipeSchema.php b/app/JsonApi/Schemas/RecipeSchema.php index 6ba24a9..8f508d2 100644 --- a/app/JsonApi/Schemas/RecipeSchema.php +++ b/app/JsonApi/Schemas/RecipeSchema.php @@ -69,6 +69,14 @@ class RecipeSchema extends SchemaProvider return $resource->ingredientAmounts; }, ], + 'media' => [ + self::SHOW_SELF => true, + self::SHOW_RELATED => true, + self::SHOW_DATA => isset($includeRelationships['media']), + self::DATA => function () use ($resource) { + return $resource->media; + }, + ], 'steps' => [ self::SHOW_SELF => true, self::SHOW_RELATED => true, diff --git a/config/json-api-v1.php b/config/json-api-v1.php index 1043ce4..518a613 100644 --- a/config/json-api-v1.php +++ b/config/json-api-v1.php @@ -68,6 +68,7 @@ return [ 'resources' => [ 'foods' => \App\Models\Food::class, 'ingredient-amounts' => \App\Models\IngredientAmount::class, + 'media' => \Spatie\MediaLibrary\MediaCollections\Models\Media::class, 'journal-entries' => \App\Models\JournalEntry::class, 'recipes' => \App\Models\Recipe::class, 'recipe-steps' => \App\Models\RecipeStep::class, diff --git a/routes/api.php b/routes/api.php index beec9ea..43e060f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,6 +19,9 @@ JsonApi::register('v1')->routes(function ($api) { $relations->hasOne('ingredient')->readOnly(); $relations->hasOne('parent')->readOnly(); })->readOnly(); + $api->resource('media')->relationships(function ($relations) { + $relations->hasOne('owner')->readOnly(); + })->readOnly(); $api->resource('journal-entries')->relationships(function ($relations) { $relations->hasMany('foods')->readOnly(); $relations->hasMany('recipes')->readOnly(); @@ -26,6 +29,7 @@ JsonApi::register('v1')->routes(function ($api) { })->readOnly(); $api->resource('recipes')->relationships(function ($relations) { $relations->hasMany('ingredient-amounts')->readOnly(); + $relations->hasMany('media')->readOnly(); $relations->hasMany('steps')->readOnly(); $relations->hasMany('tags')->readOnly(); })->readOnly();