Skip to content

Commit

Permalink
fix: [6.x] Bulk update and deletion callbacks.
Browse files Browse the repository at this point in the history
  • Loading branch information
binaryk committed Jul 24, 2022
2 parents a775094 + 98d7e9e commit f8b3bc6
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 9 deletions.
10 changes: 8 additions & 2 deletions src/Http/Controllers/RepositoryDestroyBulkController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@ class RepositoryDestroyBulkController
{
public function __invoke(RepositoryDestroyBulkRequest $request)
{
$collection = DB::transaction(function () use ($request) {
$repositories = collect();

DB::transaction(function () use ($request, $repositories) {
return $request->collect()
->each(function (int|string $key, int $row) use ($request) {
->each(function (int|string $key, int $row) use ($request, $repositories) {
$model = $request->modelQuery($key)->lockForUpdate()->firstOrFail();

$repositories->push($model->attributesToArray());

/**
* @var Repository $repository
*/
Expand All @@ -30,6 +34,8 @@ public function __invoke(RepositoryDestroyBulkRequest $request)
});
});

$request->repository()::deletedBulk($repositories, $request);

return ok();
}
}
3 changes: 3 additions & 0 deletions src/Http/Controllers/RepositoryUpdateBulkController.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ public function __invoke(RepositoryUpdateBulkRequest $request)
});
});

$request->repository()::savedBulk($collection, $request);
$request->repository()::updatedBulk($collection, $request);

return $this->response()
->success();
}
Expand Down
25 changes: 18 additions & 7 deletions src/Repositories/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,10 @@ public function resolveIndexPivots(RestifyRequest $request): array
*/
public function resolveRelationships($request): array
{
if (! $request->related()->hasRelated()) {
return [];
}

return static::collectRelated()
->forRequest($request, $this)
->mapIntoRelated($request, $this)
Expand Down Expand Up @@ -726,6 +730,7 @@ public function storeBulk(RepositoryStoreBulkRequest $request)
});
});

static::savedBulk($entities, $request);
static::storedBulk($entities, $request);

return data($entities);
Expand Down Expand Up @@ -808,14 +813,12 @@ public function updateBulk(RestifyRequest $request, $repositoryId, int $row)
->authorizedUpdateBulk($request)
->each(fn (Field $field) => $field->actionHandler->handle($request, $this->resource, $row));

static::updatedBulk($this->resource, $request);

return ok();
return response()->json();
}

public function deleteBulk(RestifyRequest $request, $repositoryId, int $row)
{
$status = DB::transaction(function () use ($request) {
DB::transaction(function () use ($request) {
if (in_array(HasActionLogs::class, class_uses_recursive($this->resource))) {
Restify::actionLog()
->forRepositoryDestroy($this->resource, $request->user())
Expand All @@ -825,8 +828,6 @@ public function deleteBulk(RestifyRequest $request, $repositoryId, int $row)
return $this->resource->delete();
});

static::deleted($status, $request);

return ok(code: 204);
}

Expand Down Expand Up @@ -986,7 +987,17 @@ public static function storedBulk(Collection $repositories, $request)
//
}

public static function updatedBulk($model, $request)
public static function updatedBulk(Collection $repositories, $request)
{
//
}

public static function savedBulk(Collection $repositories, $request)
{
//
}

public static function deletedBulk(Collection $repositories, $request)
{
//
}
Expand Down
10 changes: 10 additions & 0 deletions tests/Fixtures/User/UserPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,16 @@ public function storeBulk($user)
return $_SERVER['restify.users.storeBulk'] ?? true;
}

public function updateBulk($user)
{
return $_SERVER['restify.users.updateBulk'] ?? true;
}

public function deleteBulk($user)
{
return $_SERVER['restify.users.deleteBulk'] ?? true;
}

public function update($user, $model)
{
return $_SERVER['restify.users.update'] ?? true;
Expand Down
135 changes: 135 additions & 0 deletions tests/Unit/RepositoryAfterBulkTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?php

namespace Binaryk\LaravelRestify\Tests\Unit;

use Binaryk\LaravelRestify\Restify;
use Binaryk\LaravelRestify\Tests\Fixtures\User\User;
use Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository;
use Binaryk\LaravelRestify\Tests\IntegrationTest;
use Illuminate\Support\Collection;

class RepositoryAfterBulkTest extends IntegrationTest
{
protected function setUp(): void
{
parent::setUp();

Restify::repositories([
WithAfterBulkOverrides::class,
]);
}

public function test_it_calls_the_overriden_stored_bulk_method(): void
{
$user = User::factory()->make();

$this->postJson(WithAfterBulkOverrides::route().'/bulk', [
[
'name' => $user->name,
'email' => '[email protected]',
'password' => $user->password,
],
])->assertSuccessful();

$this->assertEquals('[email protected]', $user->first()->email);
}

public function test_it_calls_the_overriden_updated_bulk_method(): void
{
$user = User::factory()->create();

$this->postJson(WithAfterBulkOverrides::route().'/bulk/update', [
[
'id' => $user->id,
'email' => '[email protected]',
],
])->assertSuccessful();

$this->assertEquals('[email protected]', $user->fresh()->email);
}

public function test_it_calls_the_overriden_saved_bulk_method_for_create(): void
{
$user = User::factory()->make();

$this->postJson(WithAfterBulkOverrides::route().'/bulk', [
[
'name' => $user->name,
'email' => '[email protected]',
'password' => $user->password,
],
])->assertSuccessful();

$this->assertEquals('John Saved', $user->first()->name);
}

public function test_it_calls_the_overriden_saved_bulk_method_for_update(): void
{
$user = User::factory()->create();

$this->postJson(WithAfterBulkOverrides::route().'/bulk/update', [
[
'id' => $user->id,
'email' => '[email protected]',
],
])->assertSuccessful();

$this->assertEquals('John Saved', $user->fresh()->name);
}

public function test_it_calls_the_overriden_deleted_bulk_method(): void
{
$user = User::factory()->create();

$this->deleteJson(WithAfterBulkOverrides::route().'/bulk/delete', [
$user->id,
])->assertSuccessful();

$this->assertDatabaseMissing(User::class, ['id' => $user->id]);

$this->assertDatabaseHas(User::class, [
'email' => $user->email,
'name' => $user->name,
]);
}
}

class WithAfterBulkOverrides extends UserRepository
{
public static function storedBulk(Collection $repositories, $request)
{
$user = User::find($repositories->first()['id']);

$user->update([
'email' => '[email protected]',
]);
}

public static function updatedBulk(Collection $repositories, $request)
{
$user = User::find($repositories->first()['id']);

$user->update([
'email' => '[email protected]',
]);
}

public static function savedBulk(Collection $repositories, $request)
{
$user = User::find($repositories->first()['id']);

$user->update([
'name' => 'John Saved',
]);
}

public static function deletedBulk(Collection $repositories, $request)
{
$first = $repositories->first();

User::factory()->create([
'email' => $first['email'],
'name' => $first['name'],
]);
}
}

0 comments on commit f8b3bc6

Please sign in to comment.