From 548100af74aee164d9ea20a1f2391fc47b65afe0 Mon Sep 17 00:00:00 2001 From: Leon Morival Date: Wed, 27 May 2026 17:22:19 +0200 Subject: [PATCH] feat: update products on stripe --- .../Pages/CreateCreditProduct.php | 5 +++ .../Pages/EditCreditProduct.php | 5 +++ app/Services/StripeCreditProductSyncer.php | 43 +++++++++++++++++-- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/app/Filament/Resources/CreditProducts/Pages/CreateCreditProduct.php b/app/Filament/Resources/CreditProducts/Pages/CreateCreditProduct.php index 7f50b21..579ce8d 100644 --- a/app/Filament/Resources/CreditProducts/Pages/CreateCreditProduct.php +++ b/app/Filament/Resources/CreditProducts/Pages/CreateCreditProduct.php @@ -8,4 +8,9 @@ use Filament\Resources\Pages\CreateRecord; class CreateCreditProduct extends CreateRecord { protected static string $resource = CreditProductResource::class; + + protected function afterCreate(): void + { + app(\App\Services\StripeCreditProductSyncer::class)->sync($this->record); + } } diff --git a/app/Filament/Resources/CreditProducts/Pages/EditCreditProduct.php b/app/Filament/Resources/CreditProducts/Pages/EditCreditProduct.php index 8e4f58e..9ece616 100644 --- a/app/Filament/Resources/CreditProducts/Pages/EditCreditProduct.php +++ b/app/Filament/Resources/CreditProducts/Pages/EditCreditProduct.php @@ -17,4 +17,9 @@ class EditCreditProduct extends EditRecord DeleteAction::make(), ]; } + + protected function afterSave(): void + { + app(\App\Services\StripeCreditProductSyncer::class)->sync($this->record); + } } diff --git a/app/Services/StripeCreditProductSyncer.php b/app/Services/StripeCreditProductSyncer.php index aa94414..b132c04 100644 --- a/app/Services/StripeCreditProductSyncer.php +++ b/app/Services/StripeCreditProductSyncer.php @@ -25,9 +25,30 @@ class StripeCreditProductSyncer ]); $stripeProductId = $stripeProduct->id; + } else { + $stripe->products->update($stripeProductId, [ + 'name' => $product->name, + 'description' => $product->description, + 'active' => (bool) $product->is_active, + 'metadata' => [ + 'credit_product_id' => $product->getKey(), + 'credits' => (string) $product->credits, + 'type' => $product->type->value, + ], + ]); } + $needsNewPrice = false; + if (! $product->stripe_price_id) { + $needsNewPrice = true; + } elseif ($product->wasChanged(['amount', 'currency', 'type', 'credits'])) { + $needsNewPrice = true; + } + + $stripePriceId = $product->stripe_price_id; + + if ($needsNewPrice) { $priceData = [ 'product' => $stripeProductId, 'unit_amount' => $product->amount, @@ -46,12 +67,26 @@ class StripeCreditProductSyncer } $stripePrice = $stripe->prices->create($priceData); + $stripePriceId = $stripePrice->id; + + // Archive the old price if it exists + if ($product->stripe_price_id && $product->stripe_price_id !== $stripePriceId) { + try { + $stripe->prices->update($product->stripe_price_id, [ + 'active' => false, + ]); + } catch (\Exception $e) { + // Ignore error if price not found + } + } } - $product->forceFill([ - 'stripe_product_id' => $stripeProductId, - 'stripe_price_id' => $product->stripe_price_id ?: $stripePrice->id, - ])->save(); + if ($product->stripe_product_id !== $stripeProductId || $product->stripe_price_id !== $stripePriceId) { + $product->forceFill([ + 'stripe_product_id' => $stripeProductId, + 'stripe_price_id' => $stripePriceId, + ])->saveQuietly(); + } return $product; }