Skip to content

Commit

Permalink
dispatching event when deleting user submission (#17)
Browse files Browse the repository at this point in the history
* dispatching event when deleting user submission

* extra test

* extra test

---------

Co-authored-by: dawid.miklas <dawid.miklas@escolasoft.com>
  • Loading branch information
dicani0 and dawid.miklas committed Apr 27, 2023
1 parent 7774d3e commit 1ac7be6
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 2 deletions.
32 changes: 32 additions & 0 deletions src/Events/UnassignProduct.php
@@ -0,0 +1,32 @@
<?php

namespace EscolaLms\AssignWithoutAccount\Events;

use EscolaLms\Cart\Models\Product;
use EscolaLms\Core\Models\User;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UnassignProduct
{
use Dispatchable, SerializesModels;

private User $user;
private Product $product;

public function __construct(User $user, Product $product)
{
$this->user = $user;
$this->product = $product;
}

public function getUser(): User
{
return $this->user;
}

public function getProduct(): Product
{
return $this->product;
}
}
32 changes: 32 additions & 0 deletions src/Events/UnassignProductable.php
@@ -0,0 +1,32 @@
<?php

namespace EscolaLms\AssignWithoutAccount\Events;

use EscolaLms\Cart\Contracts\Productable;
use EscolaLms\Core\Models\User;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UnassignProductable
{
use Dispatchable, SerializesModels;

private User $user;
private Productable $productable;

public function __construct(User $user, Productable $productable)
{
$this->user = $user;
$this->productable = $productable;
}

public function getUser(): User
{
return $this->user;
}

public function getProductable(): Productable
{
return $this->productable;
}
}
21 changes: 21 additions & 0 deletions src/Services/UserSubmissionService.php
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}
}
}
44 changes: 42 additions & 2 deletions tests/Api/UserSubmissionAdminTest.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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];
}],
Expand Down Expand Up @@ -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,
]);
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 1ac7be6

Please sign in to comment.