Skip to content

Commit 4ecc403

Browse files
committed
✨ controller hooks ready
1 parent 8231a8e commit 4ecc403

File tree

8 files changed

+95
-13
lines changed

8 files changed

+95
-13
lines changed

src/Concerns/Resource/HasModelHooks.php renamed to src/Concerns/Resource/HasResourceHooks.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Illuminate\Database\Eloquent\Model;
66
use Lomkit\Rest\Http\Requests\MutateRequest;
77

8-
trait HasModelHooks
8+
trait HasResourceHooks
99
{
1010
public function beforeMutating(MutateRequest $request, array $requestBody, Model $model): void
1111
{

src/Http/Resource.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use Lomkit\Rest\Concerns\PerformsModelOperations;
1010
use Lomkit\Rest\Concerns\PerformsQueries;
1111
use Lomkit\Rest\Concerns\Resource\ConfiguresRestParameters;
12-
use Lomkit\Rest\Concerns\Resource\HasModelHooks;
12+
use Lomkit\Rest\Concerns\Resource\HasResourceHooks;
1313
use Lomkit\Rest\Concerns\Resource\Paginable;
1414
use Lomkit\Rest\Concerns\Resource\Relationable;
1515
use Lomkit\Rest\Concerns\Resource\Rulable;
@@ -27,7 +27,7 @@ class Resource implements \JsonSerializable
2727
use Authorizable;
2828
use Actionable;
2929
use Instructionable;
30-
use HasModelHooks;
30+
use HasResourceHooks;
3131

3232
/**
3333
* The model the entry corresponds to.

tests/Feature/Controllers/HooksTest.php

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
use Illuminate\Support\Facades\Gate;
77
use Lomkit\Rest\Tests\Feature\TestCase;
88
use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory;
9+
use Lomkit\Rest\Tests\Support\Database\Factories\SoftDeletedModelFactory;
910
use Lomkit\Rest\Tests\Support\Models\BelongsToManyRelation;
1011
use Lomkit\Rest\Tests\Support\Models\Model;
12+
use Lomkit\Rest\Tests\Support\Models\SoftDeletedModel;
1113
use Lomkit\Rest\Tests\Support\Policies\GreenPolicy;
14+
use Lomkit\Rest\Tests\Support\Rest\Resources\ModelResource;
15+
use Lomkit\Rest\Tests\Support\Rest\Resources\SoftDeletedModelResource;
1216

1317
class HooksTest extends TestCase
1418
{
@@ -75,11 +79,6 @@ public function test_mutate_hook(): void
7579
['Accept' => 'application/json']
7680
);
7781

78-
$this->assertMutatedResponse(
79-
$response,
80-
[$modelToCreate],
81-
);
82-
8382
$this->assertEquals(
8483
true,
8584
Cache::get('before-mutate')
@@ -113,4 +112,79 @@ public function test_operate_hook(): void
113112
Cache::get('after-operate')
114113
);
115114
}
115+
116+
public function test_destroy_hook(): void
117+
{
118+
$model = ModelFactory::new()->count(1)->createOne();
119+
120+
Gate::policy(Model::class, GreenPolicy::class);
121+
122+
$this->delete(
123+
'/api/model-hooks',
124+
[
125+
'resources' => [$model->getKey()],
126+
],
127+
['Accept' => 'application/json']
128+
);
129+
130+
$this->assertEquals(
131+
true,
132+
Cache::get('before-destroy')
133+
);
134+
135+
$this->assertEquals(
136+
true,
137+
Cache::get('after-destroy')
138+
);
139+
}
140+
141+
public function test_restore_hook(): void
142+
{
143+
$softDeletedModel = SoftDeletedModelFactory::new()->count(1)->trashed()->createOne();
144+
145+
Gate::policy(SoftDeletedModel::class, GreenPolicy::class);
146+
147+
$this->post(
148+
'/api/model-hooks/restore',
149+
[
150+
'resources' => [$softDeletedModel->getKey()],
151+
],
152+
['Accept' => 'application/json']
153+
);
154+
155+
$this->assertEquals(
156+
true,
157+
Cache::get('before-restore')
158+
);
159+
160+
$this->assertEquals(
161+
true,
162+
Cache::get('after-restore')
163+
);
164+
}
165+
166+
public function test_force_destroy_hook(): void
167+
{
168+
$softDeletedModel = SoftDeletedModelFactory::new()->count(1)->trashed()->createOne();
169+
170+
Gate::policy(SoftDeletedModel::class, GreenPolicy::class);
171+
172+
$this->delete(
173+
'/api/model-hooks/force',
174+
[
175+
'resources' => [$softDeletedModel->getKey()],
176+
],
177+
['Accept' => 'application/json']
178+
);
179+
180+
$this->assertEquals(
181+
true,
182+
Cache::get('before-force-destroy')
183+
);
184+
185+
$this->assertEquals(
186+
true,
187+
Cache::get('after-force-destroy')
188+
);
189+
}
116190
}

tests/Support/Database/Factories/SoftDeletedModelFactory.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ class SoftDeletedModelFactory extends Factory
2222
*/
2323
public function definition()
2424
{
25-
return [];
25+
return [
26+
'name' => fake()->name(),
27+
'number' => fake()->numberBetween(-9999999, 9999999),
28+
];
2629
}
2730
}

tests/Support/Database/migrations/2023_01_00_000000_create_soft_deleted_models_table.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public function up()
1414
{
1515
Schema::create('soft_deleted_models', function (Blueprint $table) {
1616
$table->id();
17+
$table->string('name');
18+
$table->bigInteger('number');
19+
$table->string('string')->nullable();
20+
$table->foreignIdFor(\Lomkit\Rest\Tests\Support\Models\BelongsToRelation::class)->nullable()->constrained();
21+
$table->nullableMorphs('morph_to_relation', 'morph_to_relation_index');
1722
$table->timestamps();
1823
$table->softDeletes();
1924
});

tests/Support/Models/SoftDeletedModel.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
namespace Lomkit\Rest\Tests\Support\Models;
44

55
use Illuminate\Database\Eloquent\Factories\HasFactory;
6-
use Illuminate\Database\Eloquent\Model as BaseModel;
76
use Illuminate\Database\Eloquent\SoftDeletes;
87
use Lomkit\Rest\Tests\Support\Database\Factories\SoftDeletedModelFactory;
98

10-
class SoftDeletedModel extends BaseModel
9+
class SoftDeletedModel extends Model
1110
{
1211
use SoftDeletes;
1312
use HasFactory;

tests/Support/Rest/Resources/ModelWithHooksResource.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@
1919
use Lomkit\Rest\Relations\MorphTo;
2020
use Lomkit\Rest\Relations\MorphToMany;
2121
use Lomkit\Rest\Tests\Support\Models\Model;
22+
use Lomkit\Rest\Tests\Support\Models\SoftDeletedModel;
2223
use Lomkit\Rest\Tests\Support\Rest\Actions\ModifyNumberAction;
2324

2425
class ModelWithHooksResource extends Resource
2526
{
2627
use DisableAutomaticGates;
2728

28-
public static $model = Model::class;
29+
public static $model = SoftDeletedModel::class;
2930

3031
public function relations(RestRequest $request): array
3132
{

tests/Support/Routes/api.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Route::group(['as' => 'api.', 'prefix' => 'api'], function () {
66
\Lomkit\Rest\Facades\Rest::resource('models', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelController::class);
7-
\Lomkit\Rest\Facades\Rest::resource('model-hooks', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelHooksController::class);
7+
\Lomkit\Rest\Facades\Rest::resource('model-hooks', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelHooksController::class)->withSoftDeletes();
88
\Lomkit\Rest\Facades\Rest::resource('model-withs', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelWithController::class);
99

1010
\Lomkit\Rest\Facades\Rest::resource('no-exposed-fields', \Lomkit\Rest\Tests\Support\Http\Controllers\NoExposedFieldsController::class);

0 commit comments

Comments
 (0)