Переглянути джерело

Update handling for subscription updated events

vishnukvmd 1 рік тому
батько
коміт
5635e63cb7
1 змінених файлів з 12 додано та 9 видалено
  1. 12 9
      server/pkg/controller/stripe.go

+ 12 - 9
server/pkg/controller/stripe.go

@@ -328,8 +328,12 @@ func (c *StripeController) handleCustomerSubscriptionDeleted(event stripe.Event,
 	return ente.StripeEventLog{UserID: userID, StripeSubscription: stripeSubscription, Event: event}, nil
 }
 
-// Occurs whenever a subscription changes (e.g., switching from one plan to
-// another, or changing the status from trial to active).
+// Stripe fires this when a subscription starts or changes. For example,
+// renewing a subscription, adding a coupon, applying a discount, adding an
+// invoice item, and changing plans all trigger this event. In our case, we use
+// this only to track plan changes or subscriptions going past due. The rest
+// (subscription creations, deletions, renewals and failures) are tracked by
+// individual events.
 func (c *StripeController) handleCustomerSubscriptionUpdated(event stripe.Event, country ente.StripeAccountCountry) (ente.StripeEventLog, error) {
 	var stripeSubscription stripe.Subscription
 	json.Unmarshal(event.Data.Raw, &stripeSubscription)
@@ -348,13 +352,6 @@ func (c *StripeController) handleCustomerSubscriptionUpdated(event stripe.Event,
 	if err != nil {
 		return ente.StripeEventLog{}, stacktrace.Propagate(err, "")
 	}
-	if currentSubscription.ProductID == newSubscription.ProductID {
-		// Webhook is reporting an outdated update that was already verified
-		// no-op
-		log.Warn("Webhook is reporting an outdated purchase that was already verified stripeSubscriptionID:", stripeSubscription.ID)
-		return ente.StripeEventLog{UserID: userID, StripeSubscription: stripeSubscription, Event: event}, nil
-	}
-	c.BillingRepo.ReplaceSubscription(currentSubscription.ID, newSubscription)
 	if stripeSubscription.Status == stripe.SubscriptionStatusPastDue {
 		user, err := c.UserRepo.Get(userID)
 		if err != nil {
@@ -368,6 +365,12 @@ func (c *StripeController) handleCustomerSubscriptionUpdated(event stripe.Event,
 			return ente.StripeEventLog{}, stacktrace.Propagate(err, "")
 		}
 	}
+	// If the customer has changed the plan, we update state in the database. If
+	// the plan has not changed, we will ignore this webhook and rely on other
+	// events to update the state
+	if currentSubscription.ProductID != newSubscription.ProductID {
+		c.BillingRepo.ReplaceSubscription(currentSubscription.ID, newSubscription)
+	}
 	return ente.StripeEventLog{UserID: userID, StripeSubscription: stripeSubscription, Event: event}, nil
 }