From fe4648a1693c12a4a628f5a67f4f21bbc209eae9 Mon Sep 17 00:00:00 2001 From: Eduard Lupacescu Date: Sun, 13 Sep 2020 20:40:02 +0300 Subject: [PATCH 1/2] wip --- src/Fields/BelongsTo.php | 24 +++++++- src/Fields/BelongsToMany.php | 13 ++++ src/Fields/EagerField.php | 16 +++++ src/Fields/HasOne.php | 72 +++++++++++++++++++++++ src/Repositories/Repository.php | 78 ++++++++++++++---------- tests/Fixtures/User/User.php | 5 ++ tests/Unit/BelongsToFieldTest.php | 79 +++++++++++++++++++++++++ tests/Unit/HasOneFieldTest.php | 98 +++++++++++++++++++++++++++++++ 8 files changed, 352 insertions(+), 33 deletions(-) create mode 100644 src/Fields/BelongsToMany.php create mode 100644 src/Fields/EagerField.php create mode 100644 src/Fields/HasOne.php create mode 100644 tests/Unit/BelongsToFieldTest.php create mode 100644 tests/Unit/HasOneFieldTest.php diff --git a/src/Fields/BelongsTo.php b/src/Fields/BelongsTo.php index 88983ebb3..44c6e1522 100644 --- a/src/Fields/BelongsTo.php +++ b/src/Fields/BelongsTo.php @@ -3,6 +3,7 @@ namespace Binaryk\LaravelRestify\Fields; use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; +use Binaryk\LaravelRestify\Repositories\Repository; use Closure; use Illuminate\Database\Eloquent\Model; @@ -10,6 +11,18 @@ class BelongsTo extends EagerField { public ?Closure $storeParentCallback; + public function __construct($attribute, $relation, $parentRepository) + { + if (!is_a(app($parentRepository), Repository::class)) { + abort(500, "Invalid parent repository [{$parentRepository}]. Expended instance of " . Repository::class); + } + + parent::__construct($attribute); + + $this->relation = $relation; + $this->parentRepository = $parentRepository; + } + public function storeParent(RestifyRequest $request, Model $child): self { if (is_callable($this->storeParentCallback)) { @@ -23,7 +36,7 @@ public function storeParent(RestifyRequest $request, Model $child): self $child->{$this->attribute} = null; - $child->{$this->attribute} = $child->{$this->relationship}()->create( + $child->{$this->attribute} = $child->{$this->relation}()->create( $request->input($this->attribute) ); @@ -36,4 +49,13 @@ public function storeParentCallback(callable $callback) return $this; } + + public function resolve($repository, $attribute = null) + { + $model = $repository->resource; + + $this->value = $this->parentRepository::resolveWith( + $model->{$this->relation}()->first() + ); + } } diff --git a/src/Fields/BelongsToMany.php b/src/Fields/BelongsToMany.php new file mode 100644 index 000000000..09b28f729 --- /dev/null +++ b/src/Fields/BelongsToMany.php @@ -0,0 +1,13 @@ +relation = $relation; + $this->parentRepository = $parentRepository; + } + + public function storeChild(RestifyRequest $request, Model $parent): self + { + if (is_callable($this->storeParentCallback)) { + call_user_func_array($this->storeParentCallback, [ + $request, + $parent, + ]); + + return $this; + } + + $parent->{$this->attribute} = null; + + $repository = $this->parentRepository::resolveWith( + $model = $parent->{$this->relation}()->getModel() + )->allowToStore($request, $request->input($this->attribute)); + + $model = new $model; + + if ($model instanceof CreationAware) { + $model::createWithAttributes($request->input($this->attribute)); + return $this; + } + + $parent->{$this->attribute} = $repository::resolveWith( + $model->create($request->input($this->attribute)) + ); + + return $this; + } + + public function storeParentCallback(callable $callback) + { + $this->storeParentCallback = $callback; + + return $this; + } + + public function resolve($repository, $attribute = null) + { + $model = $repository->resource; + + $this->value = $this->parentRepository::resolveWith( + $model->{$this->relation}()->first() + ); + } +} diff --git a/src/Repositories/Repository.php b/src/Repositories/Repository.php index 2a3ae52c5..4dfe4525e 100644 --- a/src/Repositories/Repository.php +++ b/src/Repositories/Repository.php @@ -5,8 +5,10 @@ use Binaryk\LaravelRestify\Contracts\RestifySearchable; use Binaryk\LaravelRestify\Controllers\RestResponse; use Binaryk\LaravelRestify\Exceptions\InstanceOfException; +use Binaryk\LaravelRestify\Fields\EagerField; use Binaryk\LaravelRestify\Fields\Field; use Binaryk\LaravelRestify\Fields\FieldCollection; +use Binaryk\LaravelRestify\Fields\HasOne; use Binaryk\LaravelRestify\Filter; use Binaryk\LaravelRestify\Http\Requests\RepositoryStoreBulkRequest; use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; @@ -214,7 +216,7 @@ public static function newModel(): Model public static function query(RestifyRequest $request) { - if (! $request->isViaRepository()) { + if (!$request->isViaRepository()) { return static::newModel()->query(); } @@ -279,8 +281,8 @@ public function collectFields(RestifyRequest $request) if ($this instanceof Mergeable) { $fillable = collect($this->resource->getFillable()) - ->filter(fn ($attribute) => $fields->contains('attribute', $attribute) === false) - ->map(fn ($attribute) => Field::new($attribute)); + ->filter(fn($attribute) => $fields->contains('attribute', $attribute) === false) + ->map(fn($attribute) => Field::new($attribute)); $fields = $fields->merge($fillable); } @@ -291,14 +293,14 @@ public function collectFields(RestifyRequest $request) private function indexFields(RestifyRequest $request): Collection { return $this->collectFields($request) - ->filter(fn (Field $field) => ! $field->isHiddenOnIndex($request, $this)) + ->filter(fn(Field $field) => !$field->isHiddenOnIndex($request, $this)) ->values(); } private function showFields(RestifyRequest $request): Collection { return $this->collectFields($request) - ->filter(fn (Field $field) => ! $field->isHiddenOnShow($request, $this)) + ->filter(fn(Field $field) => !$field->isHiddenOnShow($request, $this)) ->values(); } @@ -319,10 +321,19 @@ private function updateBulkFields(RestifyRequest $request) private function storeFields(RestifyRequest $request) { return $this->collectFields($request) + ->filter(fn(Field $field) => !$field instanceof EagerField) ->forStore($request, $this) ->authorizedStore($request); } + private function hasOneFields(RestifyRequest $request) + { + return $this->collectFields($request) + ->forStore($request, $this) + ->filter(fn(Field $field) => $field instanceof HasOne) + ->authorizedStore($request); + } + private function storeBulkFields(RestifyRequest $request) { return $this->collectFields($request) @@ -412,10 +423,10 @@ public static function routes(Router $router, $attributes, $wrap = false) public function resolveShowAttributes(RestifyRequest $request) { $fields = $this->showFields($request) - ->filter(fn (Field $field) => $field->authorize($request)) - ->each(fn (Field $field) => $field->resolveForShow($this)) - ->map(fn (Field $field) => $field->serializeToValue($request)) - ->mapWithKeys(fn ($value) => $value) + ->filter(fn(Field $field) => $field->authorize($request)) + ->each(fn(Field $field) => $field->resolveForShow($this)) + ->map(fn(Field $field) => $field->serializeToValue($request)) + ->mapWithKeys(fn($value) => $value) ->all(); if ($this instanceof Mergeable) { @@ -433,7 +444,7 @@ public function resolveShowAttributes(RestifyRequest $request) return false; } - if (! $field->authorize($request)) { + if (!$field->authorize($request)) { return false; } @@ -454,10 +465,10 @@ public function resolveIndexAttributes($request) { // Resolve the show method, and attach the value to the array $fields = $this->indexFields($request) - ->filter(fn (Field $field) => $field->authorize($request)) - ->each(fn (Field $field) => $field->resolveForIndex($this)) - ->map(fn (Field $field) => $field->serializeToValue($request)) - ->mapWithKeys(fn ($value) => $value) + ->filter(fn(Field $field) => $field->authorize($request)) + ->each(fn(Field $field) => $field->resolveForIndex($this)) + ->map(fn(Field $field) => $field->serializeToValue($request)) + ->mapWithKeys(fn($value) => $value) ->all(); if ($this instanceof Mergeable) { @@ -475,7 +486,7 @@ public function resolveIndexAttributes($request) return false; } - if (! $field->authorize($request)) { + if (!$field->authorize($request)) { return false; } @@ -542,7 +553,7 @@ public function resolveRelationships($request): array } $withs[$relation] = $paginator instanceof Collection - ? $paginator->map(fn (Model $item) => [ + ? $paginator->map(fn(Model $item) => [ 'attributes' => $item->toArray(), ]) : $paginator; @@ -599,10 +610,10 @@ public function index(RestifyRequest $request) return $this->response([ 'meta' => $this->resolveIndexMainMeta( - $request, $items->map(fn (self $repository) => $repository->resource), RepositoryCollection::meta($paginator->toArray()) + $request, $items->map(fn(self $repository) => $repository->resource), RepositoryCollection::meta($paginator->toArray()) ) ?? RepositoryCollection::meta($paginator->toArray()), 'links' => RepositoryCollection::paginationLinks($paginator->toArray()), - 'data' => $items->map(fn (self $repository) => $repository->serializeForIndex($request)), + 'data' => $items->map(fn(self $repository) => $repository->serializeForIndex($request)), ]); } @@ -641,7 +652,10 @@ public function store(RestifyRequest $request) } } - $this->storeFields($request)->each(fn (Field $field) => $field->invokeAfter($request, $this->resource)); + $this->hasOneFields($request) + ->each(fn(HasOne $field) => $field->storeChild($request, $this->resource)); + + $this->storeFields($request)->each(fn(Field $field) => $field->invokeAfter($request, $this->resource)); }); static::stored($this->resource, $request); @@ -665,7 +679,7 @@ public function storeBulk(RepositoryStoreBulkRequest $request) $this->resource->save(); - $this->storeBulkFields($request)->each(fn (Field $field) => $field->invokeAfter($request, $this->resource)); + $this->storeBulkFields($request)->each(fn(Field $field) => $field->invokeAfter($request, $this->resource)); return $this->resource; }); @@ -690,7 +704,7 @@ public function update(RestifyRequest $request, $repositoryId) return $this->resource; }); - $this->updateFields($request)->each(fn (Field $field) => $field->invokeAfter($request, $this->resource)); + $this->updateFields($request)->each(fn(Field $field) => $field->invokeAfter($request, $this->resource)); return $this->response() ->data($this->serializeForShow($request)) @@ -714,8 +728,8 @@ public function updateBulk(RestifyRequest $request, $repositoryId, int $row) public function attach(RestifyRequest $request, $repositoryId, Collection $pivots) { DB::transaction(function () use ($request, $pivots) { - return $pivots->map(fn ($pivot) => $pivot->forceFill($request->except($request->relatedRepository))) - ->map(fn ($pivot) => $pivot->save()); + return $pivots->map(fn($pivot) => $pivot->forceFill($request->except($request->relatedRepository))) + ->map(fn($pivot) => $pivot->save()); }); return $this->response() @@ -726,7 +740,7 @@ public function attach(RestifyRequest $request, $repositoryId, Collection $pivot public function detach(RestifyRequest $request, $repositoryId, Collection $pivots) { $deleted = DB::transaction(function () use ($pivots) { - return $pivots->map(fn ($pivot) => $pivot->delete()); + return $pivots->map(fn($pivot) => $pivot->delete()); }); return $this->response() @@ -758,18 +772,18 @@ public function allowToUpdate(RestifyRequest $request, $payload = null): self public function allowToAttach(RestifyRequest $request, Collection $attachers): self { - $methodGuesser = 'attach'.Str::studly($request->relatedRepository); + $methodGuesser = 'attach' . Str::studly($request->relatedRepository); - $attachers->each(fn ($model) => $this->authorizeToAttach($request, $methodGuesser, $model)); + $attachers->each(fn($model) => $this->authorizeToAttach($request, $methodGuesser, $model)); return $this; } public function allowToDetach(RestifyRequest $request, Collection $attachers): self { - $methodGuesser = 'detach'.Str::studly($request->relatedRepository); + $methodGuesser = 'detach' . Str::studly($request->relatedRepository); - $attachers->each(fn ($model) => $this->authorizeToDetach($request, $methodGuesser, $model)); + $attachers->each(fn($model) => $this->authorizeToDetach($request, $methodGuesser, $model)); return $this; } @@ -854,7 +868,7 @@ public function response($content = '', $status = 200, array $headers = []): Res public function serializeForShow(RestifyRequest $request): array { return $this->filter([ - 'id' => $this->when($this->resource->id, fn () => $this->getShowId($request)), + 'id' => $this->when($this->resource->id, fn() => $this->getShowId($request)), 'type' => $this->when($type = $this->getType($request), $type), 'attributes' => $request->isShowRequest() ? $this->resolveShowAttributes($request) : $this->resolveIndexAttributes($request), 'relationships' => $this->when(value($related = $this->resolveRelationships($request)), $related), @@ -867,7 +881,7 @@ public function serializeForIndex(RestifyRequest $request): array return $this->filter([ 'id' => $this->when($id = $this->getShowId($request), $id), 'type' => $this->when($type = $this->getType($request), $type), - 'attributes' => $this->when((bool) $attrs = $this->resolveIndexAttributes($request), $attrs), + 'attributes' => $this->when((bool)$attrs = $this->resolveIndexAttributes($request), $attrs), 'relationships' => $this->when(value($related = $this->resolveRelationships($request)), $related), 'meta' => $this->when(value($meta = $this->resolveIndexMeta($request)), $meta), ]); @@ -917,12 +931,12 @@ protected static function fillBulkFields(RestifyRequest $request, Model $model, public static function uriTo(Model $model) { - return Restify::path().'/'.static::uriKey().'/'.$model->getKey(); + return Restify::path() . '/' . static::uriKey() . '/' . $model->getKey(); } public function availableFilters(RestifyRequest $request) { - return collect($this->filter($this->filters($request)))->each(fn (Filter $filter) => $filter->authorizedToSee($request)) + return collect($this->filter($this->filters($request)))->each(fn(Filter $filter) => $filter->authorizedToSee($request)) ->values(); } diff --git a/tests/Fixtures/User/User.php b/tests/Fixtures/User/User.php index acb2e642b..eef8d485f 100644 --- a/tests/Fixtures/User/User.php +++ b/tests/Fixtures/User/User.php @@ -82,6 +82,11 @@ public function posts() return $this->hasMany(Post::class); } + public function post() + { + return $this->hasOne(Post::class); + } + public function companies() { return $this->belongsToMany(Company::class, 'company_user', 'user_id', 'company_id')->withPivot([ diff --git a/tests/Unit/BelongsToFieldTest.php b/tests/Unit/BelongsToFieldTest.php new file mode 100644 index 000000000..d5fac7d33 --- /dev/null +++ b/tests/Unit/BelongsToFieldTest.php @@ -0,0 +1,79 @@ +create([ + 'user_id' => factory(User::class), + ]); + + $this->getJson('/restify-api/' . PostWithUserRepository::uriKey()) + ->assertJsonStructure([ + 'data' => [ + [ + 'attributes' => [ + 'user' => [ + 'attributes', + ], + ], + ] + ] + ]); + } + + public function test_belongs_to_field_is_ignored_when_storing() + { + factory(Post::class)->create([ + 'user_id' => factory(User::class), + ]); + + $this->postJson('/restify-api/' . PostWithUserRepository::uriKey(), [ + 'title' => 'New Post with user', + 'user' => [ + 'name' => 'Eduard Lupacescu', + 'email' => 'eduard.lupacescu@binarcode.com', + ], + ]) + ->assertCreated(); + } +} + +class PostWithUserRepository extends Repository +{ + public static $model = Post::class; + + public function fields(RestifyRequest $request) + { + return [ + Field::make('title'), + + BelongsTo::make('user', 'user', UserRepository::class), + ]; + } + + public static function uriKey() + { + return 'posts-with-user-repository'; + } +} diff --git a/tests/Unit/HasOneFieldTest.php b/tests/Unit/HasOneFieldTest.php new file mode 100644 index 000000000..69b8dd144 --- /dev/null +++ b/tests/Unit/HasOneFieldTest.php @@ -0,0 +1,98 @@ +create(); + factory(Post::class)->create([ + 'user_id' => $user->id, + ]); + + $this->getJson('/restify-api/' . UserWithPostRepository::uriKey()) + ->assertJsonStructure([ + 'data' => [ + [ + 'attributes' => [ + 'name', + 'post' + ] + ] + ], + ]); + } + + public function test_has_one_field_is_saved_when_storing() + { + factory(Post::class)->create([ + 'user_id' => factory(User::class), + ]); + + $this->postJson('/restify-api/' . UserWithPostRepository::uriKey(), [ + 'name' => 'Eduard Lupacescu', + 'email' => 'eduard.lupacescu@binarcode.com', + 'password' => 'secret!', + 'post' => [ + 'title' => 'New Post with user', + 'description' => 'New Post description', + ], + ]) + ->dump() + ->assertCreated(); + } +} + +class UserWithPostRepository extends Repository +{ + public static $model = User::class; + + public function fields(RestifyRequest $request) + { + return [ + Field::new('name'), + Field::new('email'), + Field::new('password'), + + HasOne::make('post', 'post', PostRepository::class), + ]; + } + + public static function uriKey() + { + return 'user-with-post-repository'; + } +} + +class PostRepository extends Repository { + public static $model = Post::class; + + public function fields(RestifyRequest $request) + { + return [ + Field::new('title')->storingRules('required')->messages([ + 'required' => 'This field is required', + ]), + + Field::new('description')->storingRules('required'), + ]; + } +} From 9f1e3078538af0834a321cd4707a5c64407afbd8 Mon Sep 17 00:00:00 2001 From: Lupacescu Eduard Date: Mon, 14 Sep 2020 14:23:43 +0300 Subject: [PATCH 2/2] Apply fixes from StyleCI (#262) --- src/Fields/BelongsTo.php | 4 +- src/Fields/BelongsToMany.php | 2 - src/Fields/HasOne.php | 5 ++- src/Repositories/Repository.php | 70 +++++++++++++++---------------- tests/Unit/BelongsToFieldTest.php | 8 ++-- tests/Unit/HasOneFieldTest.php | 13 +++--- 6 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/Fields/BelongsTo.php b/src/Fields/BelongsTo.php index 44c6e1522..c9952db31 100644 --- a/src/Fields/BelongsTo.php +++ b/src/Fields/BelongsTo.php @@ -13,8 +13,8 @@ class BelongsTo extends EagerField public function __construct($attribute, $relation, $parentRepository) { - if (!is_a(app($parentRepository), Repository::class)) { - abort(500, "Invalid parent repository [{$parentRepository}]. Expended instance of " . Repository::class); + if (! is_a(app($parentRepository), Repository::class)) { + abort(500, "Invalid parent repository [{$parentRepository}]. Expended instance of ".Repository::class); } parent::__construct($attribute); diff --git a/src/Fields/BelongsToMany.php b/src/Fields/BelongsToMany.php index 09b28f729..f25d78118 100644 --- a/src/Fields/BelongsToMany.php +++ b/src/Fields/BelongsToMany.php @@ -7,7 +7,5 @@ class BelongsToMany extends Field public function __construct($attribute, callable $resolveCallback = null, $repository = null) { parent::__construct($attribute, $resolveCallback); - - } } diff --git a/src/Fields/HasOne.php b/src/Fields/HasOne.php index 45663c674..504cd3926 100644 --- a/src/Fields/HasOne.php +++ b/src/Fields/HasOne.php @@ -13,8 +13,8 @@ class HasOne extends EagerField public function __construct($attribute, $relation, $parentRepository) { - if (!is_a(app($parentRepository), Repository::class)) { - abort(500, "Invalid HasOne repository [{$parentRepository}]. Expended instance of " . Repository::class); + if (! is_a(app($parentRepository), Repository::class)) { + abort(500, "Invalid HasOne repository [{$parentRepository}]. Expended instance of ".Repository::class); } parent::__construct($attribute); @@ -44,6 +44,7 @@ public function storeChild(RestifyRequest $request, Model $parent): self if ($model instanceof CreationAware) { $model::createWithAttributes($request->input($this->attribute)); + return $this; } diff --git a/src/Repositories/Repository.php b/src/Repositories/Repository.php index 4dfe4525e..6664b2ef2 100644 --- a/src/Repositories/Repository.php +++ b/src/Repositories/Repository.php @@ -216,7 +216,7 @@ public static function newModel(): Model public static function query(RestifyRequest $request) { - if (!$request->isViaRepository()) { + if (! $request->isViaRepository()) { return static::newModel()->query(); } @@ -281,8 +281,8 @@ public function collectFields(RestifyRequest $request) if ($this instanceof Mergeable) { $fillable = collect($this->resource->getFillable()) - ->filter(fn($attribute) => $fields->contains('attribute', $attribute) === false) - ->map(fn($attribute) => Field::new($attribute)); + ->filter(fn ($attribute) => $fields->contains('attribute', $attribute) === false) + ->map(fn ($attribute) => Field::new($attribute)); $fields = $fields->merge($fillable); } @@ -293,14 +293,14 @@ public function collectFields(RestifyRequest $request) private function indexFields(RestifyRequest $request): Collection { return $this->collectFields($request) - ->filter(fn(Field $field) => !$field->isHiddenOnIndex($request, $this)) + ->filter(fn (Field $field) => ! $field->isHiddenOnIndex($request, $this)) ->values(); } private function showFields(RestifyRequest $request): Collection { return $this->collectFields($request) - ->filter(fn(Field $field) => !$field->isHiddenOnShow($request, $this)) + ->filter(fn (Field $field) => ! $field->isHiddenOnShow($request, $this)) ->values(); } @@ -321,7 +321,7 @@ private function updateBulkFields(RestifyRequest $request) private function storeFields(RestifyRequest $request) { return $this->collectFields($request) - ->filter(fn(Field $field) => !$field instanceof EagerField) + ->filter(fn (Field $field) => ! $field instanceof EagerField) ->forStore($request, $this) ->authorizedStore($request); } @@ -330,7 +330,7 @@ private function hasOneFields(RestifyRequest $request) { return $this->collectFields($request) ->forStore($request, $this) - ->filter(fn(Field $field) => $field instanceof HasOne) + ->filter(fn (Field $field) => $field instanceof HasOne) ->authorizedStore($request); } @@ -423,10 +423,10 @@ public static function routes(Router $router, $attributes, $wrap = false) public function resolveShowAttributes(RestifyRequest $request) { $fields = $this->showFields($request) - ->filter(fn(Field $field) => $field->authorize($request)) - ->each(fn(Field $field) => $field->resolveForShow($this)) - ->map(fn(Field $field) => $field->serializeToValue($request)) - ->mapWithKeys(fn($value) => $value) + ->filter(fn (Field $field) => $field->authorize($request)) + ->each(fn (Field $field) => $field->resolveForShow($this)) + ->map(fn (Field $field) => $field->serializeToValue($request)) + ->mapWithKeys(fn ($value) => $value) ->all(); if ($this instanceof Mergeable) { @@ -444,7 +444,7 @@ public function resolveShowAttributes(RestifyRequest $request) return false; } - if (!$field->authorize($request)) { + if (! $field->authorize($request)) { return false; } @@ -465,10 +465,10 @@ public function resolveIndexAttributes($request) { // Resolve the show method, and attach the value to the array $fields = $this->indexFields($request) - ->filter(fn(Field $field) => $field->authorize($request)) - ->each(fn(Field $field) => $field->resolveForIndex($this)) - ->map(fn(Field $field) => $field->serializeToValue($request)) - ->mapWithKeys(fn($value) => $value) + ->filter(fn (Field $field) => $field->authorize($request)) + ->each(fn (Field $field) => $field->resolveForIndex($this)) + ->map(fn (Field $field) => $field->serializeToValue($request)) + ->mapWithKeys(fn ($value) => $value) ->all(); if ($this instanceof Mergeable) { @@ -486,7 +486,7 @@ public function resolveIndexAttributes($request) return false; } - if (!$field->authorize($request)) { + if (! $field->authorize($request)) { return false; } @@ -553,7 +553,7 @@ public function resolveRelationships($request): array } $withs[$relation] = $paginator instanceof Collection - ? $paginator->map(fn(Model $item) => [ + ? $paginator->map(fn (Model $item) => [ 'attributes' => $item->toArray(), ]) : $paginator; @@ -610,10 +610,10 @@ public function index(RestifyRequest $request) return $this->response([ 'meta' => $this->resolveIndexMainMeta( - $request, $items->map(fn(self $repository) => $repository->resource), RepositoryCollection::meta($paginator->toArray()) + $request, $items->map(fn (self $repository) => $repository->resource), RepositoryCollection::meta($paginator->toArray()) ) ?? RepositoryCollection::meta($paginator->toArray()), 'links' => RepositoryCollection::paginationLinks($paginator->toArray()), - 'data' => $items->map(fn(self $repository) => $repository->serializeForIndex($request)), + 'data' => $items->map(fn (self $repository) => $repository->serializeForIndex($request)), ]); } @@ -653,9 +653,9 @@ public function store(RestifyRequest $request) } $this->hasOneFields($request) - ->each(fn(HasOne $field) => $field->storeChild($request, $this->resource)); + ->each(fn (HasOne $field) => $field->storeChild($request, $this->resource)); - $this->storeFields($request)->each(fn(Field $field) => $field->invokeAfter($request, $this->resource)); + $this->storeFields($request)->each(fn (Field $field) => $field->invokeAfter($request, $this->resource)); }); static::stored($this->resource, $request); @@ -679,7 +679,7 @@ public function storeBulk(RepositoryStoreBulkRequest $request) $this->resource->save(); - $this->storeBulkFields($request)->each(fn(Field $field) => $field->invokeAfter($request, $this->resource)); + $this->storeBulkFields($request)->each(fn (Field $field) => $field->invokeAfter($request, $this->resource)); return $this->resource; }); @@ -704,7 +704,7 @@ public function update(RestifyRequest $request, $repositoryId) return $this->resource; }); - $this->updateFields($request)->each(fn(Field $field) => $field->invokeAfter($request, $this->resource)); + $this->updateFields($request)->each(fn (Field $field) => $field->invokeAfter($request, $this->resource)); return $this->response() ->data($this->serializeForShow($request)) @@ -728,8 +728,8 @@ public function updateBulk(RestifyRequest $request, $repositoryId, int $row) public function attach(RestifyRequest $request, $repositoryId, Collection $pivots) { DB::transaction(function () use ($request, $pivots) { - return $pivots->map(fn($pivot) => $pivot->forceFill($request->except($request->relatedRepository))) - ->map(fn($pivot) => $pivot->save()); + return $pivots->map(fn ($pivot) => $pivot->forceFill($request->except($request->relatedRepository))) + ->map(fn ($pivot) => $pivot->save()); }); return $this->response() @@ -740,7 +740,7 @@ public function attach(RestifyRequest $request, $repositoryId, Collection $pivot public function detach(RestifyRequest $request, $repositoryId, Collection $pivots) { $deleted = DB::transaction(function () use ($pivots) { - return $pivots->map(fn($pivot) => $pivot->delete()); + return $pivots->map(fn ($pivot) => $pivot->delete()); }); return $this->response() @@ -772,18 +772,18 @@ public function allowToUpdate(RestifyRequest $request, $payload = null): self public function allowToAttach(RestifyRequest $request, Collection $attachers): self { - $methodGuesser = 'attach' . Str::studly($request->relatedRepository); + $methodGuesser = 'attach'.Str::studly($request->relatedRepository); - $attachers->each(fn($model) => $this->authorizeToAttach($request, $methodGuesser, $model)); + $attachers->each(fn ($model) => $this->authorizeToAttach($request, $methodGuesser, $model)); return $this; } public function allowToDetach(RestifyRequest $request, Collection $attachers): self { - $methodGuesser = 'detach' . Str::studly($request->relatedRepository); + $methodGuesser = 'detach'.Str::studly($request->relatedRepository); - $attachers->each(fn($model) => $this->authorizeToDetach($request, $methodGuesser, $model)); + $attachers->each(fn ($model) => $this->authorizeToDetach($request, $methodGuesser, $model)); return $this; } @@ -868,7 +868,7 @@ public function response($content = '', $status = 200, array $headers = []): Res public function serializeForShow(RestifyRequest $request): array { return $this->filter([ - 'id' => $this->when($this->resource->id, fn() => $this->getShowId($request)), + 'id' => $this->when($this->resource->id, fn () => $this->getShowId($request)), 'type' => $this->when($type = $this->getType($request), $type), 'attributes' => $request->isShowRequest() ? $this->resolveShowAttributes($request) : $this->resolveIndexAttributes($request), 'relationships' => $this->when(value($related = $this->resolveRelationships($request)), $related), @@ -881,7 +881,7 @@ public function serializeForIndex(RestifyRequest $request): array return $this->filter([ 'id' => $this->when($id = $this->getShowId($request), $id), 'type' => $this->when($type = $this->getType($request), $type), - 'attributes' => $this->when((bool)$attrs = $this->resolveIndexAttributes($request), $attrs), + 'attributes' => $this->when((bool) $attrs = $this->resolveIndexAttributes($request), $attrs), 'relationships' => $this->when(value($related = $this->resolveRelationships($request)), $related), 'meta' => $this->when(value($meta = $this->resolveIndexMeta($request)), $meta), ]); @@ -931,12 +931,12 @@ protected static function fillBulkFields(RestifyRequest $request, Model $model, public static function uriTo(Model $model) { - return Restify::path() . '/' . static::uriKey() . '/' . $model->getKey(); + return Restify::path().'/'.static::uriKey().'/'.$model->getKey(); } public function availableFilters(RestifyRequest $request) { - return collect($this->filter($this->filters($request)))->each(fn(Filter $filter) => $filter->authorizedToSee($request)) + return collect($this->filter($this->filters($request)))->each(fn (Filter $filter) => $filter->authorizedToSee($request)) ->values(); } diff --git a/tests/Unit/BelongsToFieldTest.php b/tests/Unit/BelongsToFieldTest.php index d5fac7d33..2dc81d9d8 100644 --- a/tests/Unit/BelongsToFieldTest.php +++ b/tests/Unit/BelongsToFieldTest.php @@ -28,7 +28,7 @@ public function test_field_will_be_returned_in_relations() 'user_id' => factory(User::class), ]); - $this->getJson('/restify-api/' . PostWithUserRepository::uriKey()) + $this->getJson('/restify-api/'.PostWithUserRepository::uriKey()) ->assertJsonStructure([ 'data' => [ [ @@ -37,8 +37,8 @@ public function test_field_will_be_returned_in_relations() 'attributes', ], ], - ] - ] + ], + ], ]); } @@ -48,7 +48,7 @@ public function test_belongs_to_field_is_ignored_when_storing() 'user_id' => factory(User::class), ]); - $this->postJson('/restify-api/' . PostWithUserRepository::uriKey(), [ + $this->postJson('/restify-api/'.PostWithUserRepository::uriKey(), [ 'title' => 'New Post with user', 'user' => [ 'name' => 'Eduard Lupacescu', diff --git a/tests/Unit/HasOneFieldTest.php b/tests/Unit/HasOneFieldTest.php index 69b8dd144..abede4bad 100644 --- a/tests/Unit/HasOneFieldTest.php +++ b/tests/Unit/HasOneFieldTest.php @@ -28,15 +28,15 @@ public function test_has_one_will_be_returned_in_relations() 'user_id' => $user->id, ]); - $this->getJson('/restify-api/' . UserWithPostRepository::uriKey()) + $this->getJson('/restify-api/'.UserWithPostRepository::uriKey()) ->assertJsonStructure([ 'data' => [ [ 'attributes' => [ 'name', - 'post' - ] - ] + 'post', + ], + ], ], ]); } @@ -47,7 +47,7 @@ public function test_has_one_field_is_saved_when_storing() 'user_id' => factory(User::class), ]); - $this->postJson('/restify-api/' . UserWithPostRepository::uriKey(), [ + $this->postJson('/restify-api/'.UserWithPostRepository::uriKey(), [ 'name' => 'Eduard Lupacescu', 'email' => 'eduard.lupacescu@binarcode.com', 'password' => 'secret!', @@ -82,7 +82,8 @@ public static function uriKey() } } -class PostRepository extends Repository { +class PostRepository extends Repository +{ public static $model = Post::class; public function fields(RestifyRequest $request)