Skip to content

Commit b5f01d1

Browse files
authored
Merge pull request #133 from NativePHP/store-licenses
Store licenses
2 parents 2f64758 + bbdfbe5 commit b5f01d1

11 files changed

+290
-44
lines changed

app/Jobs/CreateAnystackLicenseJob.php

+13-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Jobs;
44

55
use App\Enums\Subscription;
6+
use App\Models\License;
67
use App\Models\User;
78
use App\Notifications\LicenseKeyGenerated;
89
use Illuminate\Bus\Queueable;
@@ -11,7 +12,6 @@
1112
use Illuminate\Http\Client\PendingRequest;
1213
use Illuminate\Queue\InteractsWithQueue;
1314
use Illuminate\Queue\SerializesModels;
14-
use Illuminate\Support\Facades\Cache;
1515
use Illuminate\Support\Facades\Http;
1616

1717
class CreateAnystackLicenseJob implements ShouldQueue
@@ -21,6 +21,7 @@ class CreateAnystackLicenseJob implements ShouldQueue
2121
public function __construct(
2222
public User $user,
2323
public Subscription $subscription,
24+
public ?string $subscriptionItemId = null,
2425
public ?string $firstName = null,
2526
public ?string $lastName = null,
2627
) {}
@@ -34,12 +35,20 @@ public function handle(): void
3435
$this->user->save();
3536
}
3637

37-
$license = $this->createLicense($this->user->anystack_contact_id);
38+
$licenseData = $this->createLicense($this->user->anystack_contact_id);
3839

39-
Cache::put($this->user->email.'.license_key', $license['key'], now()->addDay());
40+
$license = License::create([
41+
'user_id' => $this->user->id,
42+
'subscription_item_id' => $this->subscriptionItemId,
43+
'policy_name' => $this->subscription->value,
44+
'key' => $licenseData['key'],
45+
'expires_at' => $licenseData['expires_at'],
46+
'created_at' => $licenseData['created_at'],
47+
'updated_at' => $licenseData['updated_at'],
48+
]);
4049

4150
$this->user->notify(new LicenseKeyGenerated(
42-
$license['key'],
51+
$license->key,
4352
$this->subscription,
4453
$this->firstName
4554
));

app/Jobs/HandleCustomerSubscriptionCreatedJob.php

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Illuminate\Queue\SerializesModels;
1111
use Laravel\Cashier\Cashier;
1212
use Laravel\Cashier\Events\WebhookHandled;
13+
use Laravel\Cashier\SubscriptionItem;
1314
use Stripe\Subscription;
1415

1516
class HandleCustomerSubscriptionCreatedJob implements ShouldQueue
@@ -38,6 +39,10 @@ public function handle(): void
3839
}
3940

4041
$subscriptionPlan = \App\Enums\Subscription::fromStripeSubscription($stripeSubscription);
42+
$cashierSubscriptionItemId = SubscriptionItem::query()
43+
->where('stripe_id', $stripeSubscription->items->first()->id)
44+
->first()
45+
->id;
4146

4247
$nameParts = explode(' ', $user->name ?? '', 2);
4348
$firstName = $nameParts[0] ?: null;
@@ -46,6 +51,7 @@ public function handle(): void
4651
dispatch(new CreateAnystackLicenseJob(
4752
$user,
4853
$subscriptionPlan,
54+
$cashierSubscriptionItemId,
4955
$firstName,
5056
$lastName,
5157
));

app/Livewire/OrderSuccess.php

+14-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace App\Livewire;
44

55
use App\Enums\Subscription;
6-
use Illuminate\Support\Facades\Cache;
6+
use App\Models\User;
77
use Laravel\Cashier\Cashier;
88
use Livewire\Attributes\Layout;
99
use Livewire\Attributes\Title;
@@ -63,11 +63,21 @@ private function loadLicenseKey(): ?string
6363
return null;
6464
}
6565

66-
if ($licenseKey = Cache::get($this->email.'.license_key')) {
67-
session()->put($this->sessionKey('license_key'), $licenseKey);
66+
$user = User::where('email', $this->email)->first();
67+
68+
if (! $user) {
69+
return null;
6870
}
6971

70-
return $licenseKey;
72+
$license = $user->licenses()->latest()->first();
73+
74+
if (! $license) {
75+
return null;
76+
}
77+
78+
session()->put($this->sessionKey('license_key'), $license->key);
79+
80+
return $license->key;
7181
}
7282

7383
private function loadSubscription(): ?Subscription

app/Models/License.php

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace App\Models;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
8+
use Laravel\Cashier\SubscriptionItem;
9+
10+
class License extends Model
11+
{
12+
use HasFactory;
13+
14+
protected $guarded = [];
15+
16+
protected $casts = [
17+
'expires_at' => 'datetime',
18+
];
19+
20+
/**
21+
* @return BelongsTo<User>
22+
*/
23+
public function user(): BelongsTo
24+
{
25+
return $this->belongsTo(User::class);
26+
}
27+
28+
/**
29+
* @return BelongsTo<SubscriptionItem>
30+
*/
31+
public function subscriptionItem(): BelongsTo
32+
{
33+
return $this->belongsTo(SubscriptionItem::class);
34+
}
35+
}

app/Models/User.php

+9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
// use Illuminate\Contracts\Auth\MustVerifyEmail;
66
use Illuminate\Database\Eloquent\Factories\HasFactory;
7+
use Illuminate\Database\Eloquent\Relations\HasMany;
78
use Illuminate\Foundation\Auth\User as Authenticatable;
89
use Illuminate\Notifications\Notifiable;
910
use Laravel\Cashier\Billable;
@@ -24,4 +25,12 @@ class User extends Authenticatable
2425
'email_verified_at' => 'datetime',
2526
'password' => 'hashed',
2627
];
28+
29+
/**
30+
* @return HasMany<License>
31+
*/
32+
public function licenses(): HasMany
33+
{
34+
return $this->hasMany(License::class);
35+
}
2736
}

database/factories/LicenseFactory.php

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Database\Factories;
4+
5+
use App\Enums\Subscription;
6+
use App\Models\License;
7+
use App\Models\User;
8+
use Illuminate\Database\Eloquent\Factories\Factory;
9+
use Illuminate\Support\Facades\Date;
10+
use Laravel\Cashier\SubscriptionItem;
11+
12+
/**
13+
* @extends Factory<License>
14+
*/
15+
class LicenseFactory extends Factory
16+
{
17+
protected $model = License::class;
18+
19+
public function definition(): array
20+
{
21+
return [
22+
'user_id' => User::factory(),
23+
'subscription_item_id' => SubscriptionItem::factory(),
24+
'policy_name' => fake()->randomElement(Subscription::cases())->value,
25+
'key' => fake()->uuid(),
26+
'created_at' => fake()->dateTimeBetween('-1 year', 'now'),
27+
'updated_at' => fn (array $attrs) => $attrs['created_at'],
28+
'expires_at' => fn (array $attrs) => Date::parse($attrs['created_at'])->addYear(),
29+
];
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('licenses', function (Blueprint $table) {
15+
$table->id();
16+
$table->foreignId('user_id');
17+
$table->foreignId('subscription_item_id')->nullable();
18+
$table->string('policy_name');
19+
$table->string('key');
20+
$table->timestamp('expires_at')->nullable();
21+
$table->timestamps();
22+
23+
$table->index('user_id');
24+
$table->index('subscription_item_id');
25+
});
26+
}
27+
28+
/**
29+
* Reverse the migrations.
30+
*/
31+
public function down(): void
32+
{
33+
Schema::dropIfExists('licenses');
34+
}
35+
};

phpunit.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
<env name="APP_ENV" value="testing"/>
2222
<env name="BCRYPT_ROUNDS" value="4"/>
2323
<env name="CACHE_DRIVER" value="array"/>
24-
<!-- <env name="DB_CONNECTION" value="sqlite"/> -->
25-
<!-- <env name="DB_DATABASE" value=":memory:"/> -->
24+
<env name="DB_CONNECTION" value="sqlite"/>
25+
<env name="DB_DATABASE" value=":memory:"/>
2626
<env name="MAIL_MAILER" value="array"/>
2727
<env name="QUEUE_CONNECTION" value="sync"/>
2828
<env name="SESSION_DRIVER" value="array"/>

0 commit comments

Comments
 (0)