diff --git a/src/Actions/Action.php b/src/Actions/Action.php index c6abdc3e7..d3c30f554 100644 --- a/src/Actions/Action.php +++ b/src/Actions/Action.php @@ -44,7 +44,7 @@ abstract class Action extends RestController implements JsonSerializable public static function indexQuery(RestifyRequest $request, $query) { - return $query; + // } /** diff --git a/src/Http/Requests/ActionRequest.php b/src/Http/Requests/ActionRequest.php index 6148eeb0e..15b9406c7 100644 --- a/src/Http/Requests/ActionRequest.php +++ b/src/Http/Requests/ActionRequest.php @@ -5,6 +5,7 @@ use Binaryk\LaravelRestify\Actions\Action; use Binaryk\LaravelRestify\Services\Search\RepositorySearchService; use Closure; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; class ActionRequest extends RestifyRequest @@ -32,17 +33,26 @@ protected function actionExists() }); } + public function builder(Action $action, int $size): Builder + { + return tap(RepositorySearchService::instance()->search($this, $this->repository()), function ($query) use ($action) { + $action::indexQuery($this, $query); + }) + ->when($this->input('repositories') !== 'all', function ($query) { + $query->whereKey($this->input('repositories', [])); + }) + ->latest($this->model()->getKeyName()); + } + public function collectRepositories(Action $action, $count, Closure $callback) { $output = []; - tap(RepositorySearchService::instance()->search($this, $this->repository()), function ($query) use ($action) { - $action::indexQuery($this, $query); - }) - ->when($this->input('repositories') !== 'all', function ($query) { - $query->whereKey($this->input('repositories', [])); - })->latest($this->model()->getKeyName()) - ->chunk($count, function ($chunk) use ($callback, &$output) { + if (($query = $this->builder($action, $count))->count() === 0) { + $output[] = $callback(Collection::make([])); + } + + $query->chunk($count, function ($chunk) use ($callback, &$output) { $output[] = $callback(Collection::make($chunk)); }); diff --git a/tests/Actions/PerformActionsControllerTest.php b/tests/Actions/PerformActionsControllerTest.php index 119238748..13080461e 100644 --- a/tests/Actions/PerformActionsControllerTest.php +++ b/tests/Actions/PerformActionsControllerTest.php @@ -2,10 +2,14 @@ namespace Binaryk\LaravelRestify\Tests\Actions; +use Binaryk\LaravelRestify\Actions\Action; +use Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository; use Binaryk\LaravelRestify\Tests\Fixtures\Post\PublishPostAction; use Binaryk\LaravelRestify\Tests\Fixtures\User\ActivateAction; use Binaryk\LaravelRestify\Tests\Fixtures\User\DisableProfileAction; use Binaryk\LaravelRestify\Tests\IntegrationTest; +use Illuminate\Http\Request; +use Illuminate\Support\Collection; class PerformActionsControllerTest extends IntegrationTest { @@ -35,6 +39,32 @@ public function test_could_perform_action_for_multiple_repositories() $this->assertEquals(1, PublishPostAction::$applied[0][1]->id); } + public function test_could_perform_action_using_all() + { + $this->assertDatabaseCount('posts', 0); + + PostRepository::partialMock() + ->shouldReceive('actions') + ->andReturn([ + new class extends Action { + public static $uriKey = 'publish'; + + public function handle(Request $request, Collection $collection) + { + return response()->json([ + 'fromHandle' => $collection->count(), + ]); + } + }, + ]); + + $this->post('posts/action?action=publish', [ + 'repositories' => 'all', + ])->assertOk()->assertJsonFragment([ + 'fromHandle' => 0, + ]); + } + public function test_cannot_apply_a_show_action_to_index() { $post = $this->mockPosts(1, 2);