From 94f50b8d7d0d6a933385d7bb98028aedfcf5895a Mon Sep 17 00:00:00 2001 From: Eduard Lupacescu Date: Tue, 12 May 2020 09:55:30 +0300 Subject: [PATCH 1/5] Via relationship repositories --- composer.json | 3 +- .../Requests/InteractWithRepositories.php | 37 +++--- src/Http/Requests/RestifyRequest.php | 5 + src/Repositories/Repository.php | 62 +++++---- .../Search/RepositorySearchService.php | 10 +- .../RelatedIndexControllerTest.php | 125 ++++++++++++++++++ 6 files changed, 193 insertions(+), 49 deletions(-) create mode 100644 tests/Controllers/RelatedIndexControllerTest.php diff --git a/composer.json b/composer.json index 9134d597d..87bb1c077 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,8 @@ "ext-json": "*", "doctrine/dbal": "^2.10", "illuminate/support": "^6.0|^7.0", - "laravel/ui": "^2.0" + "laravel/ui": "^2.0", + "spatie/once": "^2.2" }, "require-dev": { "mockery/mockery": "^1.3", diff --git a/src/Http/Requests/InteractWithRepositories.php b/src/Http/Requests/InteractWithRepositories.php index 8513ae7b5..02af2e5d2 100644 --- a/src/Http/Requests/InteractWithRepositories.php +++ b/src/Http/Requests/InteractWithRepositories.php @@ -44,7 +44,7 @@ public function repository($key = null): ?Repository ]), 404); } - if (! $repository::authorizedToUseRepository($this)) { + if (!$repository::authorizedToUseRepository($this)) { throw new UnauthorizedException(__('Unauthorized to view repository :name. See "allowRestify" policy.', [ 'name' => $repository, ]), 403); @@ -89,23 +89,6 @@ public function newRepository() return $repository::resolveWith($repository::newModel()); } - /** - * Check if the route is resolved by the Repository class, or it uses the classical Models. - * @return bool - */ - public function isResolvedByRestify() - { - try { - $this->repository(); - - return true; - } catch (EntityNotFoundException $e) { - return false; - } catch (UnauthorizedException $e) { - return true; - } - } - /** * Get a new instance of the repository being requested. * As a model it could accept either a model instance, a collection or even paginated collection. @@ -131,7 +114,11 @@ public function newRepositoryWith($model, $uriKey = null) */ public function newQueryWithoutScopes($uriKey = null) { - return $this->model($uriKey)->newQueryWithoutScopes(); + if (!$this->isViaRepository()) { + return $this->model($uriKey)->newQueryWithoutScopes(); + } + + return $this->viaQuery(); } /** @@ -164,4 +151,16 @@ public function findModelQuery($repositoryId = null, $uriKey = null) $repositoryId ?? request('repositoryId') ); } + + public function viaParentModel() + { + $parent = $this->repository($this->viaRepository); + + return $parent::newModel()->newQueryWithoutScopes()->whereKey($this->viaRepositoryId)->firstOrFail(); + } + + public function viaQuery() + { + return $this->viaParentModel()->{$this->viaRelationship}(); + } } diff --git a/src/Http/Requests/RestifyRequest.php b/src/Http/Requests/RestifyRequest.php index 5cc6cff1d..86d22e25b 100644 --- a/src/Http/Requests/RestifyRequest.php +++ b/src/Http/Requests/RestifyRequest.php @@ -57,4 +57,9 @@ public function isStoreRequest() { return $this instanceof RepositoryStoreRequest; } + + public function isViaRepository() + { + return $this->viaRepository && $this->viaRepositoryId && $this->viaRelationship; + } } diff --git a/src/Repositories/Repository.php b/src/Repositories/Repository.php index e0ede5084..bd47c20a6 100644 --- a/src/Repositories/Repository.php +++ b/src/Repositories/Repository.php @@ -179,9 +179,13 @@ public static function newModel(): Model return new $model; } - public static function query(): Builder + public static function query(RestifyRequest $request) { - return static::newModel()->query(); + if (!$request->isViaRepository()) { + return static::newModel()->query(); + } + + return $request->viaQuery(); } /** @@ -223,8 +227,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); } @@ -235,14 +239,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(); } @@ -342,10 +346,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) { @@ -363,7 +367,7 @@ public function resolveShowAttributes(RestifyRequest $request) return false; } - if (! $field->authorize($request)) { + if (!$field->authorize($request)) { return false; } @@ -384,10 +388,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) { @@ -405,7 +409,7 @@ public function resolveIndexAttributes($request) return false; } - if (! $field->authorize($request)) { + if (!$field->authorize($request)) { return false; } @@ -451,7 +455,7 @@ public function resolveRelationships($request): array /** * @var AbstractPaginator $paginator */ $paginator = $this->resource->{$relation}()->paginate($request->get('relatablePerPage') ?? (static::$defaultRelatablePerPage ?? RestifySearchable::DEFAULT_RELATABLE_PER_PAGE)); - $withs[$relation] = $paginator->getCollection()->map(fn (Model $item) => [ + $withs[$relation] = $paginator->getCollection()->map(fn(Model $item) => [ 'attributes' => $item->toArray(), ]); } @@ -493,13 +497,17 @@ public function index(RestifyRequest $request) * @var AbstractPaginator $paginator */ $paginator = RepositorySearchService::instance()->search($request, $this) - ->paginate($request->perPage ?? (static::$defaultPerPage ?? RestifySearchable::DEFAULT_PER_PAGE)); + ->paginate( + $request->isViaRepository() + ? static::$defaultRelatablePerPage + : ($request->perPage ?? static::$defaultPerPage) + ); $items = $paginator->getCollection()->map(function ($value) { return static::resolveWith($value); })->filter(function (self $repository) use ($request) { return $repository->authorizedToShow($request); - })->values()->map(fn (self $repository) => $repository->serializeForIndex($request)); + })->values()->map(fn(self $repository) => $repository->serializeForIndex($request)); return $this->response([ 'meta' => RepositoryCollection::meta($paginator->toArray()), @@ -520,9 +528,15 @@ public function store(RestifyRequest $request) $request, $this->resource, $this->storeFields($request) ); - $this->resource->save(); + if ($request->isViaRepository()) { + $this->resource = $request->viaQuery() + ->save($this->resource); + } else { + $this->resource->save(); + } + - $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); @@ -620,7 +634,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), @@ -633,7 +647,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), ]); @@ -676,6 +690,6 @@ protected static function fillFields(RestifyRequest $request, Model $model, Coll public static function uriTo(Model $model) { - return Restify::path().'/'.static::uriKey().'/'.$model->getKey(); + return Restify::path() . '/' . static::uriKey() . '/' . $model->getKey(); } } diff --git a/src/Services/Search/RepositorySearchService.php b/src/Services/Search/RepositorySearchService.php index 1cbf6dbf1..e58a03517 100644 --- a/src/Services/Search/RepositorySearchService.php +++ b/src/Services/Search/RepositorySearchService.php @@ -15,7 +15,7 @@ public function search(RestifyRequest $request, Repository $repository) { $this->repository = $repository; - $query = $this->prepareMatchFields($request, $this->prepareSearchFields($request, $repository::query(), $this->fixedInput), $this->fixedInput); + $query = $this->prepareMatchFields($request, $this->prepareSearchFields($request, $repository::query($request), $this->fixedInput), $this->fixedInput); return tap($this->prepareRelations($request, $this->prepareOrders($request, $query), $this->fixedInput), $this->applyIndexQuery($request, $repository)); } @@ -66,7 +66,7 @@ public function prepareMatchFields(RestifyRequest $request, $query, $extra = []) return $query; } - public function prepareOrders(RestifyRequest $request, $query, $extra = []): Builder + public function prepareOrders(RestifyRequest $request, $query, $extra = []) { $sort = $request->get('sort', ''); @@ -89,7 +89,7 @@ public function prepareOrders(RestifyRequest $request, $query, $extra = []): Bui return $query; } - public function prepareRelations(RestifyRequest $request, $query, $extra = []): Builder + public function prepareRelations(RestifyRequest $request, $query, $extra = []) { $relations = array_merge($extra, explode(',', $request->get('with'))); @@ -102,12 +102,12 @@ public function prepareRelations(RestifyRequest $request, $query, $extra = []): return $query; } - public function prepareSearchFields(RestifyRequest $request, $query, $extra = []): Builder + public function prepareSearchFields(RestifyRequest $request, $query, $extra = []) { $search = $request->get('search', data_get($extra, 'search', '')); $model = $query->getModel(); - $query->where(function (Builder $query) use ($search, $model) { + $query->where(function ($query) use ($search, $model) { $connectionType = $model->getConnection()->getDriverName(); $canSearchPrimaryKey = is_numeric($search) && diff --git a/tests/Controllers/RelatedIndexControllerTest.php b/tests/Controllers/RelatedIndexControllerTest.php new file mode 100644 index 000000000..a1431e7dc --- /dev/null +++ b/tests/Controllers/RelatedIndexControllerTest.php @@ -0,0 +1,125 @@ +mockUsers(); + $this->mockPosts(1, 10); + + $this->mockPosts( + factory(User::class)->create()->id + ); + + $response = $this->getJson('restify-api/posts?viaRepository=users&viaRepositoryId=1&viaRelationship=posts') + ->assertStatus(200); + + $this->assertCount(10, $response->json('data')); + } + + public function test_can_show_post_belongs_to_a_user() + { + factory(User::class)->create(); + factory(User::class)->create(); + + factory(Post::class)->create([ + 'user_id' => 2, + 'title' => 'First Post', + ]); + + factory(Post::class)->create([ + 'user_id' => 1, + 'title' => 'Second Post', + ]); + + $this->getJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts') + ->assertStatus(404); + + $count = $this->getJson('restify-api/posts/2?viaRepository=users&viaRepositoryId=1&viaRelationship=posts') + ->assertStatus(200); + + $this->assertCount(1, $count->json()); + } + + public function test_can_store_post_belongs_to_a_user() + { + factory(User::class)->create(); + + factory(User::class)->create(); + + $this->postJson('restify-api/posts?viaRepository=users&viaRepositoryId=1&viaRelationship=posts', [ + 'title' => 'Created for the user 1', + ]) + ->assertStatus(201); + + $belongsFirst = $this->getJson('restify-api/posts?viaRepository=users&viaRepositoryId=1&viaRelationship=posts') + ->assertStatus(200); + + $belongsSecond = $this->getJson('restify-api/posts?viaRepository=users&viaRepositoryId=2&viaRelationship=posts') + ->assertStatus(200); + + $this->assertCount(1, $belongsFirst->json('data')); + $this->assertCount(0, $belongsSecond->json('data')); + } + + public function test_can_update_post_belongs_to_a_user() + { + factory(User::class)->create(); + factory(User::class)->create(); + + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1,]); + + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2,]); + + $response = $this->putJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts', [ + 'title' => 'Post updated title', + ])->assertStatus(200); + + $this->putJson('restify-api/posts/2?viaRepository=users&viaRepositoryId=1&viaRelationship=posts', [ + 'title' => 'Post updated title', + ])->assertStatus(404); + + $this->assertEquals('Post updated title', $response->json('data.attributes.title')); + } + + public function test_can_destroy_post_belongs_to_a_user() + { + factory(User::class)->create(); + factory(User::class)->create(); + + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1,]); + + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2,]); + + $this->deleteJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts')->assertStatus(204); + + $this->deleteJson('restify-api/posts/2?viaRepository=users&viaRepositoryId=1&viaRelationship=posts')->assertStatus(404); + } + + public function test_policy_check_before_destroy_post_belongs_to_a_user() + { + $_SERVER['restify.post.deletable'] = false; + + Gate::policy(Post::class, PostPolicy::class); + + factory(User::class)->create(); + + factory(User::class)->create(); + + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1,]); + + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2,]); + + $this->deleteJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts')->assertStatus(403); + + $this->deleteJson('restify-api/posts/2?viaRepository=users&viaRepositoryId=1&viaRelationship=posts')->assertStatus(404); + } +} From fe2d2522e1dd1010f377b4abd65f3fad21c85326 Mon Sep 17 00:00:00 2001 From: Lupacescu Eduard Date: Tue, 12 May 2020 10:56:52 +0300 Subject: [PATCH 2/5] Apply fixes from StyleCI (#178) --- .../Requests/InteractWithRepositories.php | 4 +- src/Repositories/Repository.php | 44 +++++++++---------- .../Search/RepositorySearchService.php | 1 - .../RelatedIndexControllerTest.php | 12 ++--- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/Http/Requests/InteractWithRepositories.php b/src/Http/Requests/InteractWithRepositories.php index 02af2e5d2..e88b9c0a8 100644 --- a/src/Http/Requests/InteractWithRepositories.php +++ b/src/Http/Requests/InteractWithRepositories.php @@ -44,7 +44,7 @@ public function repository($key = null): ?Repository ]), 404); } - if (!$repository::authorizedToUseRepository($this)) { + if (! $repository::authorizedToUseRepository($this)) { throw new UnauthorizedException(__('Unauthorized to view repository :name. See "allowRestify" policy.', [ 'name' => $repository, ]), 403); @@ -114,7 +114,7 @@ public function newRepositoryWith($model, $uriKey = null) */ public function newQueryWithoutScopes($uriKey = null) { - if (!$this->isViaRepository()) { + if (! $this->isViaRepository()) { return $this->model($uriKey)->newQueryWithoutScopes(); } diff --git a/src/Repositories/Repository.php b/src/Repositories/Repository.php index bd47c20a6..b4b4f1c82 100644 --- a/src/Repositories/Repository.php +++ b/src/Repositories/Repository.php @@ -13,7 +13,6 @@ use Binaryk\LaravelRestify\Traits\InteractWithSearch; use Binaryk\LaravelRestify\Traits\PerformsQueries; use Illuminate\Contracts\Pagination\LengthAwarePaginator; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Http\Resources\ConditionallyLoadsAttributes; @@ -181,7 +180,7 @@ public static function newModel(): Model public static function query(RestifyRequest $request) { - if (!$request->isViaRepository()) { + if (! $request->isViaRepository()) { return static::newModel()->query(); } @@ -227,8 +226,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); } @@ -239,14 +238,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(); } @@ -346,10 +345,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) { @@ -367,7 +366,7 @@ public function resolveShowAttributes(RestifyRequest $request) return false; } - if (!$field->authorize($request)) { + if (! $field->authorize($request)) { return false; } @@ -388,10 +387,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) { @@ -409,7 +408,7 @@ public function resolveIndexAttributes($request) return false; } - if (!$field->authorize($request)) { + if (! $field->authorize($request)) { return false; } @@ -455,7 +454,7 @@ public function resolveRelationships($request): array /** * @var AbstractPaginator $paginator */ $paginator = $this->resource->{$relation}()->paginate($request->get('relatablePerPage') ?? (static::$defaultRelatablePerPage ?? RestifySearchable::DEFAULT_RELATABLE_PER_PAGE)); - $withs[$relation] = $paginator->getCollection()->map(fn(Model $item) => [ + $withs[$relation] = $paginator->getCollection()->map(fn (Model $item) => [ 'attributes' => $item->toArray(), ]); } @@ -507,7 +506,7 @@ public function index(RestifyRequest $request) return static::resolveWith($value); })->filter(function (self $repository) use ($request) { return $repository->authorizedToShow($request); - })->values()->map(fn(self $repository) => $repository->serializeForIndex($request)); + })->values()->map(fn (self $repository) => $repository->serializeForIndex($request)); return $this->response([ 'meta' => RepositoryCollection::meta($paginator->toArray()), @@ -535,8 +534,7 @@ public function store(RestifyRequest $request) $this->resource->save(); } - - $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); @@ -634,7 +632,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), @@ -647,7 +645,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), ]); @@ -690,6 +688,6 @@ protected static function fillFields(RestifyRequest $request, Model $model, Coll public static function uriTo(Model $model) { - return Restify::path() . '/' . static::uriKey() . '/' . $model->getKey(); + return Restify::path().'/'.static::uriKey().'/'.$model->getKey(); } } diff --git a/src/Services/Search/RepositorySearchService.php b/src/Services/Search/RepositorySearchService.php index e58a03517..cdb304d96 100644 --- a/src/Services/Search/RepositorySearchService.php +++ b/src/Services/Search/RepositorySearchService.php @@ -5,7 +5,6 @@ use Binaryk\LaravelRestify\Contracts\RestifySearchable; use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; use Binaryk\LaravelRestify\Repositories\Repository; -use Illuminate\Database\Eloquent\Builder; class RepositorySearchService extends Searchable { diff --git a/tests/Controllers/RelatedIndexControllerTest.php b/tests/Controllers/RelatedIndexControllerTest.php index a1431e7dc..41cffc2d0 100644 --- a/tests/Controllers/RelatedIndexControllerTest.php +++ b/tests/Controllers/RelatedIndexControllerTest.php @@ -75,9 +75,9 @@ public function test_can_update_post_belongs_to_a_user() factory(User::class)->create(); factory(User::class)->create(); - factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1,]); + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1]); - factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2,]); + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2]); $response = $this->putJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts', [ 'title' => 'Post updated title', @@ -95,9 +95,9 @@ public function test_can_destroy_post_belongs_to_a_user() factory(User::class)->create(); factory(User::class)->create(); - factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1,]); + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1]); - factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2,]); + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2]); $this->deleteJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts')->assertStatus(204); @@ -114,9 +114,9 @@ public function test_policy_check_before_destroy_post_belongs_to_a_user() factory(User::class)->create(); - factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1,]); + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 1]); - factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2,]); + factory(Post::class)->create(['title' => 'Post title', 'user_id' => 2]); $this->deleteJson('restify-api/posts/1?viaRepository=users&viaRepositoryId=1&viaRelationship=posts')->assertStatus(403); From dc035876f20afe5f641a61931916b5d4e83da4ba Mon Sep 17 00:00:00 2001 From: Eduard Lupacescu Date: Tue, 12 May 2020 10:58:07 +0300 Subject: [PATCH 3/5] Cache related model --- src/Http/Requests/InteractWithRepositories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Requests/InteractWithRepositories.php b/src/Http/Requests/InteractWithRepositories.php index 02af2e5d2..d76b0e318 100644 --- a/src/Http/Requests/InteractWithRepositories.php +++ b/src/Http/Requests/InteractWithRepositories.php @@ -156,7 +156,7 @@ public function viaParentModel() { $parent = $this->repository($this->viaRepository); - return $parent::newModel()->newQueryWithoutScopes()->whereKey($this->viaRepositoryId)->firstOrFail(); + return once(fn() => $parent::newModel()->newQueryWithoutScopes()->whereKey($this->viaRepositoryId)->firstOrFail()); } public function viaQuery() From 39fc94491306ffea12d4f54f1f6fa33cc841340c Mon Sep 17 00:00:00 2001 From: Lupacescu Eduard Date: Tue, 12 May 2020 10:58:44 +0300 Subject: [PATCH 4/5] Apply fixes from StyleCI (#180) --- src/Http/Requests/InteractWithRepositories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Requests/InteractWithRepositories.php b/src/Http/Requests/InteractWithRepositories.php index 4b3f77c2a..991f2cee9 100644 --- a/src/Http/Requests/InteractWithRepositories.php +++ b/src/Http/Requests/InteractWithRepositories.php @@ -156,7 +156,7 @@ public function viaParentModel() { $parent = $this->repository($this->viaRepository); - return once(fn() => $parent::newModel()->newQueryWithoutScopes()->whereKey($this->viaRepositoryId)->firstOrFail()); + return once(fn () => $parent::newModel()->newQueryWithoutScopes()->whereKey($this->viaRepositoryId)->firstOrFail()); } public function viaQuery() From d58b9a4bf387faf478d7354d1426d4a8edac1443 Mon Sep 17 00:00:00 2001 From: Eduard Lupacescu Date: Tue, 12 May 2020 13:18:18 +0300 Subject: [PATCH 5/5] Remove support for Laravel 6 --- .github/workflows/tests.yml | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b0a7db785..f0196afa5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: fail-fast: true matrix: php: [7.4] - laravel: [^6.0, ^7.0] + laravel: [^7.0] name: P${{ matrix.php }} - L${{ matrix.laravel }} diff --git a/composer.json b/composer.json index 87bb1c077..e228d59c4 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "php": "^7.4", "ext-json": "*", "doctrine/dbal": "^2.10", - "illuminate/support": "^6.0|^7.0", + "illuminate/support": "^7.0", "laravel/ui": "^2.0", "spatie/once": "^2.2" },