From f9a9d4919b0e03f090f2e72c64a45bdb93c2a2d4 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 8 Nov 2022 12:19:17 +0100 Subject: [PATCH] Improve recheck handling for test subs --- website/server/libs/payments/apple.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/website/server/libs/payments/apple.js b/website/server/libs/payments/apple.js index 5e7f9a813b..69a4a5ef43 100644 --- a/website/server/libs/payments/apple.js +++ b/website/server/libs/payments/apple.js @@ -86,24 +86,20 @@ api.subscribe = async function subscribe (user, receipt, headers, nextPaymentPro throw new NotAuthorized(api.constants.RESPONSE_NO_ITEM_PURCHASED); } - let originalTransactionId; - let newTransactionId; + let purchase; let newestDate; - let sku; for (const purchaseData of purchaseDataList) { const datePurchased = new Date(Number(purchaseData.purchaseDate)); const dateTerminated = new Date(Number(purchaseData.expirationDate)); if ((!newestDate || datePurchased > newestDate) && dateTerminated > new Date()) { - originalTransactionId = purchaseData.originalTransactionId; - newTransactionId = purchaseData.transactionId; + purchase = purchaseData; newestDate = datePurchased; - sku = purchaseData.productId; } } let subCode; - switch (sku) { // eslint-disable-line default-case + switch (purchase.productId) { // eslint-disable-line default-case case 'subscription1month': subCode = 'basic_earned'; break; @@ -119,10 +115,10 @@ api.subscribe = async function subscribe (user, receipt, headers, nextPaymentPro } const sub = subCode ? shared.content.subscriptionBlocks[subCode] : false; - if (originalTransactionId) { + if (purchase.originalTransactionId) { let existingSub; if (user && user.isSubscribed()) { - if (user.purchased.plan.customerId !== originalTransactionId) { + if (user.purchased.plan.customerId !== purchase.originalTransactionId) { throw new NotAuthorized(this.constants.RESPONSE_ALREADY_USED); } existingSub = shared.content.subscriptionBlocks[user.purchased.plan.planId]; @@ -131,19 +127,24 @@ api.subscribe = async function subscribe (user, receipt, headers, nextPaymentPro } } const existingUser = await User.findOne({ - 'purchased.plan.customerId': originalTransactionId, + 'purchased.plan.customerId': purchase.originalTransactionId, }).exec(); if (existingUser - && (originalTransactionId === newTransactionId + && (purchase.originalTransactionId === purchase.transactionId || existingUser._id !== user._id)) { throw new NotAuthorized(this.constants.RESPONSE_ALREADY_USED); } nextPaymentProcessing = nextPaymentProcessing || moment.utc().add({ days: 2 }); // eslint-disable-line max-len, no-param-reassign + const terminationDate = moment(Number(purchase.expirationDate)); + if (nextPaymentProcessing > terminationDate) { + // For test subscriptions that have a significantly shorter expiration period, this is better + nextPaymentProcessing = terminationDate; // eslint-disable-line no-param-reassign + } const data = { user, - customerId: originalTransactionId, + customerId: purchase.originalTransactionId, paymentMethod: this.constants.PAYMENT_METHOD_APPLE, sub, headers,