Skip to content
This repository was archived by the owner on Apr 8, 2024. It is now read-only.

Commit fd4ed5d

Browse files
committed
feat(subscription-hydration): check if plan already active
1 parent efa9721 commit fd4ed5d

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

lib/subscription-hydration.js

+16-11
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ class SubscriptionHydration {
77
/**
88
* @typedef ConstructorOptions
99
* @property {import('./paddle/api.js')} api
10-
* @property {import('./subscription-hook-storage.js') hookStorage}
10+
* @property {import('./subscription-hook-storage.js')} hookStorage
11+
* @property {import('./subscription-info.js')} subscriptionInfo
1112
*/
1213

1314
/**
@@ -16,10 +17,11 @@ class SubscriptionHydration {
1617
* @param {ConstructorOptions} options
1718
*/
1819

19-
constructor(storagePath, { api = {}, hookStorage = {} }) {
20+
constructor(storagePath, { api = {}, hookStorage = {}, subscriptionInfo = {} }) {
2021
this._resourceName = 'subscription'
2122
this._storage = resource({ documentPath: storagePath, resourceName: this._resourceName })
2223
this._api = api
24+
this._subscriptionInfo = subscriptionInfo
2325
this._hookStorage = hookStorage
2426
}
2527

@@ -74,20 +76,12 @@ class SubscriptionHydration {
7476
* @returns
7577
*/
7678
async hydrateSubscriptionCreated(ids, { subscription_id }, checkoutId) {
77-
{
78-
const { subscription } = await this._storage.get(ids)
79-
if (subscription?.status?.length > 1) {
80-
console.log(`Subscription ${ids} was already hydrated. Exiting early and quietly.`)
81-
return
82-
}
83-
}
84-
8579
const subscriptions = await this._api.getSubscription({ subscription_id })
8680
if (!Array.isArray(subscriptions) || subscriptions.length < 1) {
8781
return
8882
}
8983

90-
// more sanity checks here
84+
// checks here
9185
const subscription = subscriptions.at(0)
9286
if (!subscription.custom_data?._pi?.ids) {
9387
console.error(`Expected "subscription.custom_data._pi.ids" to be an Array. Did you set customData during Checkout? Please see https://developer.paddle.com/changelog/e9a54055ea46e-custom-data-now-available#custom-data-in-webhooks.`)
@@ -106,6 +100,17 @@ class SubscriptionHydration {
106100
throw new Error(SubscriptionHydration.HYDRATION_UNAUTHORIZED)
107101
}
108102

103+
// check whether plan is already active
104+
// because then we already received the webhook
105+
const { plan_id: plan } = subscription
106+
{
107+
const { subscription: localSubscription } = await this._storage.get(ids)
108+
const subscriptionStatus = await this._subscriptionInfo.getAllSubscriptionsStatus(localSubscription)
109+
if (subscriptionStatus[plan] === true) {
110+
return
111+
}
112+
}
113+
109114
const subscriptionCreatedPayload = {
110115
alert_id: SubscriptionHydration.HYDRATION_SUBSCRIPTION_CREATED,
111116
alert_name: SubscriptionHydration.HYDRATION_SUBSCRIPTION_CREATED,

test-e2e/spec/hydration.spec.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ const subscriptions = new index.SubscriptionHooks('api_client')
88

99
const storageResource = require('../../lib/firestore/nested-firestore-resource')
1010
const SubscriptionInfo = require('../../lib/subscription-info')
11-
const { writeFileSync } = require('fs')
1211
const storage = storageResource({ documentPath: 'api_client', resourceName: 'api_clients' })
1312

1413
let subscriptionInfo
@@ -24,7 +23,7 @@ test.beforeAll(async () => {
2423
await api.init()
2524

2625
subscriptionInfo = new index.SubscriptionInfo('api_client', { api })
27-
subscriptionHydration = new index.SubscriptionHydration('api_client', { api, hookStorage: subscriptions })
26+
subscriptionHydration = new index.SubscriptionHydration('api_client', { api, hookStorage: subscriptions, subscriptionInfo })
2827
})
2928

3029
test.beforeEach(async () => {

0 commit comments

Comments
 (0)