8000 refactor order success page logic (#160) · NativePHP/nativephp.com@744b0b2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 744b0b2

Browse files
authored
refactor order success page logic (#160)
1 parent 682f0ca commit 744b0b2

File tree

2 files changed

+68
-101
lines changed

2 files changed

+68
-101
lines changed

app/Livewire/OrderSuccess.php

Lines changed: 22 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
namespace App\Livewire;
44

55
use App\Enums\Subscription;
6-
use App\Models\User;
6+
use App\Models\License;
7+
use Illuminate\Database\Eloquent\ModelNotFoundException;
78
use Laravel\Cashier\Cashier;
89
use Livewire\Attributes\Layout;
910
use Livewire\Attributes\Title;
@@ -31,84 +32,37 @@ public function mount(string $checkoutSessionId): void
3132

3233
public function loadData(): void
3334
{
34-
$this->email = $this->loadEmail();
35-
$this->licenseKey = $this->loadLicenseKey();
36-
$this->subscription = $this->loadSubscription();
37-
}
38-
39-
private function loadEmail(): ?string
40-
{
41-
if ($email = session($this->sessionKey('email'))) {
42-
return $email;
43-
}
44-
4535
try {
46-
$checkoutSession = Cashier::stripe()->checkout->sessions->retrieve($this->checkoutSessionId);
36+
$subscriptionId = Cashier::stripe()->checkout->sessions->retrieve($this->checkoutSessionId)->subscription;
4737
} catch (InvalidRequestException $e) {
48-
return $this->redirect('/mobile');
49-
}
50-
51-
if (! ($email = $checkoutSession?->customer_details?->email)) {
52-
return null;
53-
}
54-
55-
session()->put($this->sessionKey('email'), $email);
56-
57-
return $email;
58-
}
59-
60-
private function loadLicenseKey(): ?string
61-
{
62-
if ($licenseKey = session($this->sessionKey('license_key'))) {
63-
return $licenseKey;
64-
}
65-
66-
if (! $this->email) {
67-
return null;
68-
}
69-
70-
$user = User::where('email', $this->email)->first();
38+
$this->redirect('/mobile');
7139

72-
if (! $user) {
73-
return null;
40+
return;
7441
}
7542

76-
$license = $user->licenses()->latest()->first();
43+
$subscriptionRecord = Cashier::$subscriptionModel::query()
44+
->whereNotNull('stripe_id')
45+
->where('stripe_id', $subscriptionId)
46+
->first();
7747

78-
if (! $license) {
79-
return null;
48+
if (! $subscriptionRecord) {
49+
return;
8050
}
8151

82-
session()->put($this->sessionKey('license_key'), $license->key);
83-
84-
return $license->key;
85-
}
52+
$subscriptionItem = Cashier::$subscriptionItemModel::query()
53+
->whereBelongsTo($subscriptionRecord)
54+
->first();
8655

87-
private function loadSubscription(): ?Subscription
88-
{
89-
if ($subscription = session($this->sessionKey('subscription'))) {
90-
return Subscription::tryFrom($subscription);
91-
}
56+
if (! $subscriptionItem) {
57+
report(new ModelNotFoundException("No subscription item found for subscription record [{$subscriptionRecord->id}]."));
9258

93-
try {
94-
$priceId = Cashier::stripe()->checkout->sessions->allLineItems($this->checkoutSessionId)->first()?->price->id;
95-
} catch (InvalidRequestException $e) {
96-
return $this->redirect('/mobile');
59+
return;
9760
}
9861

99-
if (! $priceId) {
100-
return null;
101-
}
102-
103-
$subscription = Subscription::fromStripePriceId($priceId);
104-
105-
session()->put($this->sessionKey('subscription'), $subscription->value);
106-
107-
return $subscription;
108-
}
109-
110-
private function sessionKey(string $key): string
111-
{
112-
return "{$this->checkoutSessionId}.{$key}";
62+
$this->subscription = Subscription::fromStripePriceId($subscriptionItem->stripe_price);
63+
$this->email = $subscriptionRecord->user->email;
64+
$this->licenseKey = License::query()
65+
->whereBelongsTo($subscriptionItem)
66+
->first()?->key;
11367
}
11468
}

tests/Feature/Livewire/OrderSuccessTest.php

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use App\Models\License;
88
use App\Models\User;
99
use Illuminate\Foundation\Testing\RefreshDatabase;
10-
use Illuminate\Support\Facades\Session;
10+
use Laravel\Cashier\Cashier;
1111
use Livewire\Livewire;
1212
use PHPUnit\Framework\Attributes\Test;
1313
use Stripe\Checkout\Session as CheckoutSession;
@@ -39,10 +39,8 @@ public function it_renders_successfully()
3939
#[Test]
4040
public function it_displays_loading_state_when_no_license_key_is_available()
4141
{
42-
Session::flush();
43-
4442
Livewire::test(OrderSuccess::class, ['checkoutSessionId' => 'cs_test_123'])
45-
->assertSet('email', 'test@example.com')
43+
->assertSet('email', null)
4644
->assertSet('licenseKey', null)
4745
->assertSee('License registration in progress')
4846
->assertSee('check your email');
@@ -51,17 +49,31 @@ public function it_displays_loading_state_when_no_license_key_is_available()
5149
#[Test]
5250
public function it_displays_license_key_when_available_in_database()
5351
{
54-
Session::flush();
55-
5652
$user = User::factory()->create([
5753
'email' => 'test@example.com',
54+
'stripe_id' => 'cus_test123',
5855
]);
5956

60-
License::factory()->create([
61-
'user_id' => $user->id,
62-
'key' => 'db-license-key-12345',
63-
'policy_name' => 'max',
64-
]);
57+
$subscription = Cashier::$subscriptionModel::factory()
58+
->for($user, 'user')
59+
->create([
60+
'stripe_id' => 'sub_test123',
61+
]);
62+
63+
$subscriptionItem = Cashier::$subscriptionItemModel::factory()
64+
->for($subscription, 'subscription')
65+
->create([
66+
'stripe_id' => 'si_test123',
67+
'stripe_price' => Subscription::Max->stripePriceId(),
68+
]);
69+
70+
$license = License::factory()
71+
->for($user, 'user')
72+
->for($subscriptionItem, 'subscriptionItem')
73+
->create([
74+
'key' => 'db-license-key-12345',
75+
'policy_name' => 'max',
76+
]);
6577

6678
Livewire::test(OrderSuccess::class, ['checkoutSessionId' => 'cs_test_123'])
6779
->assertSet('email', 'test@example.com')
@@ -71,40 +83,39 @@ public function it_displays_license_key_when_available_in_database()
7183
->assertDontSee('License registration in progress');
7284
}
7385

74-
#[Test]
75-
public function it_uses_session_data_when_available()
76-
{
77-
$checkoutSessionId = 'cs_test_123';
78-
79-
Session::put("$checkoutSessionId.email", 'session@example.com');
80-
Session::put("$checkoutSessionId.license_key", 'session-license-key');
81-
82-
Livewire::test(OrderSuccess::class, ['checkoutSessionId' => 'cs_test_123'])
83-
->assertSet('email', 'session@example.com')
84-
->assertSet('licenseKey', 'session-license-key')
85-
->assertSee('session-license-key')
86-
->assertSee('session@example.com');
87-
}
88-
8986
#[Test]
9087
public function it_polls_for_updates_from_database()
9188
{
92-
Session::flush();
93-
9489
$component = Livewire::test(OrderSuccess::class, ['checkoutSessionId' => 'cs_test_123'])
9590
->assertSet('licenseKey', null)
9691
->assertSee('License registration in progress')
9792
->assertSeeHtml('wire:poll.2s="loadData"');
9893

9994
$user = User::factory()->create([
10095
'email' => 'test@example.com',
96+
'stripe_id' => 'cus_test123',
10197
]);
10298

103-
License::factory()->create([
104-
'user_id' => $user->id,
105-
'key' => 'db-polled-license-key',
106-
'policy_name' => 'max',
107-
]);
99+
$subscription = Cashier::$subscriptionModel::factory()
100+
->for($user, 'user')
101+
->create([
102+
'stripe_id' => 'sub_test123',
103+
]);
104+
105+
$subscriptionItem = Cashier::$subscriptionItemModel::factory()
106+
->for($subscription, 'subscription')
107+
->create([
108+
'stripe_id' => 'si_test123',
109+
'stripe_price' => Subscription::Max->stripePriceId(),
110+
]);
111+
112+
$license = License::factory()
113+
->for($user, 'user')
114+
->for($subscriptionItem, 'subscriptionItem')
115+
->create([
116+
'key' => 'db-polled-license-key',
117+
'policy_name' => 'max',
118+
]);
108119

109120
$component->call('loadData')
110121
->assertSet('licenseKey', 'db-polled-license-key')
@@ -144,9 +155,11 @@ private function mockStripeClient(): void
144155
{
145156
$mockCheckoutSession = CheckoutSession::constructFrom([
146157
'id' => 'cs_test_123',
158+
'customer' => 'cus_test123',
147159
'customer_details' => [
148160
'email' => 'test@example.com',
149161
],
162+
'subscription' => 'sub_test123',
150163
]);
151164

152165
$mockCheckoutSessionLineItems = Collection::constructFrom([

0 commit comments

Comments
 (0)
0