From 1ac7be6d8cb1dcb9c8ed0019dd726ad406e5143c Mon Sep 17 00:00:00 2001 From: Dawid Miklas <58490533+dicani0@users.noreply.github.com> Date: Thu, 27 Apr 2023 13:34:57 +0200 Subject: [PATCH] dispatching event when deleting user submission (#17) * dispatching event when deleting user submission * extra test * extra test --------- Co-authored-by: dawid.miklas --- src/Events/UnassignProduct.php | 32 +++++++++++++++++++ src/Events/UnassignProductable.php | 32 +++++++++++++++++++ src/Services/UserSubmissionService.php | 21 ++++++++++++ tests/Api/UserSubmissionAdminTest.php | 44 ++++++++++++++++++++++++-- 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/Events/UnassignProduct.php create mode 100644 src/Events/UnassignProductable.php diff --git a/src/Events/UnassignProduct.php b/src/Events/UnassignProduct.php new file mode 100644 index 0000000..5469735 --- /dev/null +++ b/src/Events/UnassignProduct.php @@ -0,0 +1,32 @@ +user = $user; + $this->product = $product; + } + + public function getUser(): User + { + return $this->user; + } + + public function getProduct(): Product + { + return $this->product; + } +} diff --git a/src/Events/UnassignProductable.php b/src/Events/UnassignProductable.php new file mode 100644 index 0000000..2ef88f7 --- /dev/null +++ b/src/Events/UnassignProductable.php @@ -0,0 +1,32 @@ +user = $user; + $this->productable = $productable; + } + + public function getUser(): User + { + return $this->user; + } + + public function getProductable(): Productable + { + return $this->productable; + } +} diff --git a/src/Services/UserSubmissionService.php b/src/Services/UserSubmissionService.php index 28fdf25..60b346e 100644 --- a/src/Services/UserSubmissionService.php +++ b/src/Services/UserSubmissionService.php @@ -5,12 +5,17 @@ use EscolaLms\AssignWithoutAccount\Dto\UserSubmissionDto; use EscolaLms\AssignWithoutAccount\Dto\UserSubmissionSearchDto; use EscolaLms\AssignWithoutAccount\Enums\UserSubmissionStatusEnum; +use EscolaLms\AssignWithoutAccount\Events\UnassignProduct; +use EscolaLms\AssignWithoutAccount\Events\UnassignProductable; use EscolaLms\AssignWithoutAccount\Models\UserSubmission; use EscolaLms\AssignWithoutAccount\Repositories\Contracts\UserSubmissionRepositoryContract; use EscolaLms\AssignWithoutAccount\Services\Contracts\UserSubmissionServiceContract; use EscolaLms\AssignWithoutAccount\Strategies\Contracts\AssignStrategy; use EscolaLms\AssignWithoutAccount\Strategies\StrategyContext; +use EscolaLms\Cart\Contracts\Productable; +use EscolaLms\Cart\Models\Product; use EscolaLms\Core\Dtos\PaginationDto; +use EscolaLms\Core\Models\User; use Illuminate\Contracts\Pagination\LengthAwarePaginator; class UserSubmissionService implements UserSubmissionServiceContract @@ -43,6 +48,10 @@ public function update(UserSubmissionDto $dto, int $id): UserSubmission public function delete(int $id): bool { + /** @var UserSubmission $submission */ + $submission = $this->userSubmissionRepository->find($id); + $this->dispatchUnassignEvent($submission); + return $this->userSubmissionRepository->delete($id); } @@ -55,4 +64,16 @@ private function getStrategy(string $morphType): ?AssignStrategy { return (new StrategyContext($morphType))->getAssignStrategy(); } + + private function dispatchUnassignEvent(UserSubmission $userSubmission): void + { + $user = new User(); + $user->email = $userSubmission->email; + + if (is_a($userSubmission->morphable_type, Productable::class, true)) { + UnassignProductable::dispatch($user, $userSubmission->morphable); + } elseif (is_a($userSubmission->morphable_type, Product::class, true)) { + UnassignProduct::dispatch($user, $userSubmission->morphable); + } + } } diff --git a/tests/Api/UserSubmissionAdminTest.php b/tests/Api/UserSubmissionAdminTest.php index 9a9d0d1..4f47293 100644 --- a/tests/Api/UserSubmissionAdminTest.php +++ b/tests/Api/UserSubmissionAdminTest.php @@ -6,6 +6,8 @@ use EscolaLms\AssignWithoutAccount\Enums\UserSubmissionStatusEnum; use EscolaLms\AssignWithoutAccount\Events\AssignToProduct; use EscolaLms\AssignWithoutAccount\Events\AssignToProductable; +use EscolaLms\AssignWithoutAccount\Events\UnassignProduct; +use EscolaLms\AssignWithoutAccount\Events\UnassignProductable; use EscolaLms\AssignWithoutAccount\Models\UserSubmission; use EscolaLms\AssignWithoutAccount\Tests\TestCase; use EscolaLms\Cart\Facades\Shop; @@ -237,7 +239,7 @@ public function updateUserSubmissionDataProvider(): array { return [ [fn() => [Product::class, AssignToProduct::class]], - [function() { + [function () { Shop::registerProductableClass(ExampleProductable::class); return [ExampleProductable::class, AssignToProductable::class]; }], @@ -269,7 +271,7 @@ public function testUpdateUserSubmission($data): void $response->assertJsonFragment([ 'email' => $email, - 'morphable_id' =>$model->getKey(), + 'morphable_id' => $model->getKey(), 'morphable_type' => $class, 'status' => UserSubmissionStatusEnum::REJECTED, ]); @@ -348,6 +350,44 @@ public function testDeleteUserSubmission(): void ->assertOk(); } + public function testDeleteUserSubmissionWithEvent(): void + { + Event::fake(); + $admin = $this->makeAdmin(); + $productable = ExampleProductable::factory()->create(); + $userSubmission = UserSubmission::factory()->create([ + 'email' => 'test@example.com', + 'morphable_id' => $productable->getKey(), + 'morphable_type' => ExampleProductable::class + ]); + + $this->actingAs($admin, 'api') + ->json('DELETE', '/api/admin/user-submissions/' . $userSubmission->getKey()) + ->assertOk(); + + Event::assertDispatched( + UnassignProductable::class, + fn(UnassignProductable $event) => $event->getProductable()->getKey() === $productable->getKey() + && $event->getUser()->email = 'test@example.com' + ); + + $product = Product::factory()->create(); + $userSubmission = UserSubmission::factory()->create([ + 'morphable_id' => $product->getKey(), + 'morphable_type' => Product::class + ]); + + $this->actingAs($admin, 'api') + ->json('DELETE', '/api/admin/user-submissions/' . $userSubmission->getKey()) + ->assertOk(); + + Event::assertDispatched( + UnassignProduct::class, + fn(UnassignProduct $event) => $event->getProduct()->getKey() === $product->getKey() + && $event->getUser()->email = 'test@example.com' + ); + } + public function testDeleteNotExistingUserSubmission(): void { $admin = $this->makeAdmin();