Skip to content

Commit 58b2dfd

Browse files
committed
fix(api,stripe): fix stripe-handlers for sub-updates from nonmobile to mobile
BEDS-657
1 parent bdbf2f1 commit 58b2dfd

File tree

1 file changed

+45
-22
lines changed

1 file changed

+45
-22
lines changed

handlers/stripe.go

+45-22
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ func StripeWebhook(w http.ResponseWriter, r *http.Request) {
404404
http.Error(w, "error parsing stripe webhook JSON", http.StatusInternalServerError)
405405
return
406406
}
407-
408407
if subscription.Items == nil {
409408
utils.LogError(nil, fmt.Errorf("error updating subscription no items found %v", subscription), 0)
410409
http.Error(w, "error updating subscription no items found", http.StatusBadRequest)
@@ -419,7 +418,6 @@ func StripeWebhook(w http.ResponseWriter, r *http.Request) {
419418
priceID := subscription.Items.Data[0].Price.ID
420419

421420
currSub, err := db.StripeGetSubscription(subscription.ID)
422-
423421
if err != nil {
424422
logger.WithError(err).Error("error getting subscription from database with id ", subscription.ID)
425423
http.Error(w, "error updating subscription could not get current subscription err:"+err.Error(), http.StatusInternalServerError)
@@ -435,13 +433,29 @@ func StripeWebhook(w http.ResponseWriter, r *http.Request) {
435433

436434
err = db.StripeUpdateSubscription(tx, priceID, subscription.ID, event.Data.Raw)
437435
if err != nil {
438-
logger.WithError(err).Error("error updating user subscription", subscription.ID)
436+
logger.WithError(err).WithField("subscription.ID", subscription.ID).Error("error updating user subscription")
439437
http.Error(w, "error updating user subscription, customer: "+subscription.Customer.ID, http.StatusInternalServerError)
440438
return
441439
}
442440

443441
if utils.GetPurchaseGroup(priceID) == utils.GROUP_MOBILE || utils.GetPurchaseGroup(priceID) == utils.GROUP_ADDON {
444-
err := db.ChangeProductIDFromStripe(tx, subscription.ID, utils.PriceIdToProductId(priceID))
442+
_, err := db.GetUserSubscriptionIDByStripe(subscription.ID)
443+
if err != nil {
444+
if err == sql.ErrNoRows {
445+
// subscription changed from one group to another, entry does not exist yet
446+
err = insertMobileSubscription(tx, subscription)
447+
if err != nil {
448+
logger.WithError(err).WithField("subscription.ID", subscription.ID).Error("error updating stripe mobile subscription, no users_app_subs id found for subscription id")
449+
http.Error(w, "error updating stripe mobile subscription, no users_app_subs id found for subscription id, customer: "+subscription.Customer.ID, http.StatusInternalServerError)
450+
return
451+
}
452+
} else {
453+
logger.WithError(err).WithField("subscription.ID", subscription.ID).Error("error updating user subscription, calling db.GetUserSubscriptionIDByStripe")
454+
http.Error(w, "error updating user subscription, customer: "+subscription.Customer.ID, http.StatusInternalServerError)
455+
return
456+
}
457+
}
458+
err = db.ChangeProductIDFromStripe(tx, subscription.ID, utils.PriceIdToProductId(priceID))
445459
if err != nil {
446460
logger.WithError(err).Error("error updating stripe mobile subscription", subscription.ID)
447461
http.Error(w, "error updating stripe mobile subscription customer: "+subscription.Customer.ID, http.StatusInternalServerError)
@@ -602,31 +616,40 @@ func createNewStripeSubscription(subscription stripe.Subscription, event stripe.
602616
if err != nil {
603617
return err
604618
}
605-
606619
if utils.GetPurchaseGroup(subscription.Items.Data[0].Price.ID) == utils.GROUP_MOBILE || utils.GetPurchaseGroup(subscription.Items.Data[0].Price.ID) == utils.GROUP_ADDON {
607-
userID, err := db.StripeGetCustomerUserId(subscription.Customer.ID)
608-
if err != nil {
609-
return err
610-
}
611-
details := types.MobileSubscription{
612-
ProductID: utils.PriceIdToProductId(subscription.Items.Data[0].Price.ID),
613-
PriceMicros: uint64(subscription.Items.Data[0].Price.UnitAmount),
614-
Currency: string(subscription.Items.Data[0].Price.Currency),
615-
Transaction: types.MobileSubscriptionTransactionGeneric{
616-
Type: "stripe",
617-
Receipt: subscription.ID,
618-
ID: subscription.Items.Data[0].Price.ID,
619-
},
620-
Valid: false,
621-
}
622-
err = db.InsertMobileSubscription(tx, userID, details, details.Transaction.Type, details.Transaction.Receipt, 0, "", subscription.ID)
620+
err = insertMobileSubscription(tx, subscription)
623621
if err != nil {
624622
return err
625623
}
626624
}
627625
err = tx.Commit()
626+
if err != nil {
627+
return err
628+
}
629+
return nil
630+
}
628631

629-
return err
632+
func insertMobileSubscription(tx *sql.Tx, subscription stripe.Subscription) error {
633+
userID, err := db.StripeGetCustomerUserId(subscription.Customer.ID)
634+
if err != nil {
635+
return err
636+
}
637+
details := types.MobileSubscription{
638+
ProductID: utils.PriceIdToProductId(subscription.Items.Data[0].Price.ID),
639+
PriceMicros: uint64(subscription.Items.Data[0].Price.UnitAmount),
640+
Currency: string(subscription.Items.Data[0].Price.Currency),
641+
Transaction: types.MobileSubscriptionTransactionGeneric{
642+
Type: "stripe",
643+
Receipt: subscription.ID,
644+
ID: subscription.Items.Data[0].Price.ID,
645+
},
646+
Valid: false,
647+
}
648+
err = db.InsertMobileSubscription(tx, userID, details, details.Transaction.Type, details.Transaction.Receipt, 0, "", subscription.ID)
649+
if err != nil {
650+
return err
651+
}
652+
return nil
630653
}
631654

632655
func emailCustomerAboutFailedPayment(email string) {

0 commit comments

Comments
 (0)