Skip to content

Commit

Permalink
Merge pull request #25 from dystcz/feat/add-cart-checked-out-event
Browse files Browse the repository at this point in the history
Feat: Add cart checked out event
  • Loading branch information
repl6669 authored Jan 27, 2025
2 parents 8c5eab2 + 0f803a7 commit 3efbf7d
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 9 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@
- Added `currency` relation to `prices`
- Added `customer_group` relation to `prices`
- `PaymentOptions` can now be set as hidden (can be used for authorization, but won't be listed via API)
- The `OrderCreated` event is dispatched from `OrderObserver` right after the order is created
- Processing Stripe webhooks is now controlled by custom `WebhookProfile` which checks `eshop_id`
(if configured) in payment intent metadata and either dispatches webhook handlers or discards the webhook calls
- Added `CartCheckedOut` event which is dispatched from `CheckoutCart` action

### ⚠️ Breaking changes

- `CartCheckedOut` event is dispatched after checkout instead of `OrderCreated` event

## 1.0.0

Expand Down
11 changes: 6 additions & 5 deletions packages/api/src/Domain/Carts/Actions/CheckoutCart.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,18 @@
namespace Dystore\Api\Domain\Carts\Actions;

use Dystore\Api\Domain\Carts\Contracts\CheckoutCart as CheckoutCartContract;
use Dystore\Api\Domain\Carts\Events\CartCheckedOut;
use Dystore\Api\Domain\Carts\Models\Cart;
use Dystore\Api\Domain\Payments\Actions\CreatePaymentIntent;
use Dystore\Api\Support\Actions\Action;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Lunar\Base\CartSessionInterface;
use Lunar\Models\Contracts\Cart as CartContract;
use Lunar\Models\Contracts\Order as OrderContract;
use Lunar\Models\Order;

class CheckoutCart implements CheckoutCartContract
class CheckoutCart extends Action implements CheckoutCartContract
{
/**
* @var CartSessionManager
Expand All @@ -28,10 +30,7 @@ public function __construct()
$this->createPaymentIntent = App::make(CreatePaymentIntent::class);
}

/**
* Checkout cart.
*/
public function __invoke(CartContract $cart): OrderContract
public function handle(CartContract $cart): OrderContract
{
/** @var Cart $cart */
/** @var Order $order */
Expand All @@ -58,6 +57,8 @@ public function __invoke(CartContract $cart): OrderContract
$this->cartSession->forget(delete: false);
}

CartCheckedOut::dispatch($cart, $model);

return $model;
}
}
3 changes: 3 additions & 0 deletions packages/api/src/Domain/Carts/Contracts/CheckoutCart.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@

namespace Dystore\Api\Domain\Carts\Contracts;

/**
* @see \Dystore\Api\Domain\Carts\Actions\CheckoutCart
*/
interface CheckoutCart {}
17 changes: 17 additions & 0 deletions packages/api/src/Domain/Carts/Events/CartCheckedOut.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Dystore\Api\Domain\Carts\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Lunar\Models\Contracts\Cart as CartContract;
use Lunar\Models\Contracts\Order as OrderContract;

class CartCheckedOut
{
use Dispatchable;

public function __construct(
public CartContract $cart,
public OrderContract $order,
) {}
}
50 changes: 50 additions & 0 deletions tests/api/Feature/Domain/Cart/Events/CartCheckedOutTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

use Dystore\Api\Domain\Carts\Actions\CheckoutCart;
use Dystore\Api\Domain\Carts\Contracts\CheckoutCart as CheckoutCartContract;
use Dystore\Api\Domain\Carts\Events\CartCheckedOut;
use Dystore\Api\Domain\Carts\Factories\CartFactory;
use Dystore\Api\Domain\Carts\Models\Cart;
use Dystore\Api\Domain\Users\Models\User;
use Dystore\Tests\Api\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Lunar\Base\CartSessionInterface;
use Lunar\Managers\CartSessionManager;

uses(TestCase::class, RefreshDatabase::class)
->group('carts', 'carts.events', 'events');

it('dispatches cart checked out event after checkout', function () {
/** @var TestUser $this */
Event::fake([
CartCheckedOut::class,
]);

$user = User::factory()->create();

/** @var CartFactory $cartFactory */
$cartFactory = Cart::factory();

/** @var Cart $cart */
$cart = $cartFactory
->withAddresses()
->withLines()
->create();

/** @var CartSessionManager $cartSession */
$cartSession = App::make(CartSessionInterface::class);
$cartSession->use($cart);

/** @var CheckoutCart $checkoutAction */
$checkoutAction = App::make(CheckoutCartContract::class);

$order = $checkoutAction->handle($cart);

Event::assertDispatched(
CartCheckedOut::class,
fn (CartCheckedOut $event) => $event->cart->getKey() === $cart->getKey()
&& $event->order->getKey() === $order->getKey(),
);
});
9 changes: 5 additions & 4 deletions tests/api/Feature/Domain/Cart/JsonApi/V1/ReadCartTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
use Illuminate\Support\Facades\Event;
use Lunar\Base\CartSessionInterface;

uses(TestCase::class, RefreshDatabase::class);
uses(TestCase::class, RefreshDatabase::class)
->group('carts', 'carts.read');

beforeEach(function () {
/** @var TestCase $this */
Expand Down Expand Up @@ -42,7 +43,7 @@
->assertSuccessful()
->assertFetchedOne($cart);

})->group('carts', 'carts.read');
});

it('can read cart with cart lines included', function () {
/** @var TestCase $this */
Expand Down Expand Up @@ -70,7 +71,7 @@
$response
->assertSuccessful();

})->group('carts');
});

it('can merge carts when user logs in', function () {
/** @var TestCase $this */
Expand Down Expand Up @@ -168,4 +169,4 @@
'purchasable_id' => $line['attributes']['purchasable_id'],
]);
}
})->group('carts', 'carts.read')->skip('Merging carts is temporarily disabled.');
})->skip('Merging carts is temporarily disabled.');

0 comments on commit 3efbf7d

Please sign in to comment.