From 370a0582e939bb7cf58a1e5c32532fade6cbe713 Mon Sep 17 00:00:00 2001
From: Dries Vints <dries@vints.io>
Date: Tue, 9 Feb 2021 16:19:17 +0100
Subject: [PATCH] [12.x] Allow Stripe dashboard subscriptions (#1058)

* Allow Stripe dashboard subscriptions

* Add payload param

* Re-add test
---
 src/Http/Controllers/WebhookController.php | 13 ++++++-
 tests/Feature/WebhooksTest.php             | 40 ++++++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/src/Http/Controllers/WebhookController.php b/src/Http/Controllers/WebhookController.php
index 406cf873..fb30f904 100644
--- a/src/Http/Controllers/WebhookController.php
+++ b/src/Http/Controllers/WebhookController.php
@@ -79,7 +79,7 @@ protected function handleCustomerSubscriptionCreated(array $payload)
                 $isSinglePlan = count($data['items']['data']) === 1;
 
                 $subscription = $user->subscriptions()->create([
-                    'name' => $data['metadata']['name'],
+                    'name' => $data['metadata']['name'] ?? $this->newSubscriptionName($payload),
                     'stripe_id' => $data['id'],
                     'stripe_status' => $data['status'],
                     'stripe_plan' => $isSinglePlan ? $firstItem['plan']['id'] : null,
@@ -101,6 +101,17 @@ protected function handleCustomerSubscriptionCreated(array $payload)
         return $this->successMethod();
     }
 
+    /**
+     * Determines the name that should be used when new subscriptions are created from the Stripe dashboard.
+     *
+     * @param  array  $payload
+     * @return string
+     */
+    protected function newSubscriptionName(array $payload)
+    {
+        return 'default';
+    }
+
     /**
      * Handle customer subscription updated.
      *
diff --git a/tests/Feature/WebhooksTest.php b/tests/Feature/WebhooksTest.php
index 5ff4d303..aa7a7889 100644
--- a/tests/Feature/WebhooksTest.php
+++ b/tests/Feature/WebhooksTest.php
@@ -54,6 +54,46 @@ public static function tearDownAfterClass(): void
         static::deleteStripeResource(new Product(static::$productId));
     }
 
+    public function test_subscriptions_are_created()
+    {
+        $user = $this->createCustomer('subscriptions_are_updated', ['stripe_id' => 'cus_foo']);
+
+        $this->postJson('stripe/webhook', [
+            'id' => 'foo',
+            'type' => 'customer.subscription.created',
+            'data' => [
+                'object' => [
+                    'id' => 'sub_foo',
+                    'customer' => 'cus_foo',
+                    'cancel_at_period_end' => false,
+                    'quantity' => 5,
+                    'items' => [
+                        'data' => [[
+                            'id' => 'bar',
+                            'plan' => ['id' => 'plan_foo'],
+                            'quantity' => 10,
+                        ]],
+                    ],
+                    'status' => 'active',
+                ],
+            ],
+        ])->assertOk();
+
+        $this->assertDatabaseHas('subscriptions', [
+            'name' => 'default',
+            'user_id' => $user->id,
+            'stripe_id' => 'sub_foo',
+            'stripe_status' => 'active',
+            'quantity' => 5,
+        ]);
+
+        $this->assertDatabaseHas('subscription_items', [
+            'stripe_id' => 'bar',
+            'stripe_plan' => 'plan_foo',
+            'quantity' => 10,
+        ]);
+    }
+
     public function test_subscriptions_are_updated()
     {
         $user = $this->createCustomer('subscriptions_are_updated', ['stripe_id' => 'cus_foo']);