[web] handle 3DS challenges for Stripe (#25918)

* handle 3DS challenges on the subscription dashboard
* add `/user/subscription/sync` endpoint
* upgrade `stripe-js` & rm `react-stripe-js`
* group related unit tests together
* add modules `SubscriptionController` unit tests and convert to async/await
* add `StripeClient` unit tests for 3DS failure

GitOrigin-RevId: 9da4758703f6ef4ec08248b328abddbbdd8e44ad
This commit is contained in:
Kristina
2025-06-02 08:05:16 +00:00
committed by Copybot
parent efa20c26c9
commit 9ba772b18f
9 changed files with 91 additions and 42 deletions
@@ -26,10 +26,17 @@ class SubtotalLimitExceededError extends OError {}
class HasPastDueInvoiceError extends OError {}
class PaymentActionRequiredError extends OError {
constructor(info) {
super('Payment action required', info)
}
}
module.exports = {
RecurlyTransactionError,
DuplicateAddOnError,
AddOnNotPresentError,
PaymentActionRequiredError,
MissingBillingInfoError,
ManuallyCollectedError,
PendingChangeError,
@@ -15,7 +15,11 @@ const AnalyticsManager = require('../Analytics/AnalyticsManager')
const RecurlyEventHandler = require('./RecurlyEventHandler')
const { expressify } = require('@overleaf/promise-utils')
const OError = require('@overleaf/o-error')
const { DuplicateAddOnError, AddOnNotPresentError } = require('./Errors')
const {
DuplicateAddOnError,
AddOnNotPresentError,
PaymentActionRequiredError,
} = require('./Errors')
const SplitTestHandler = require('../SplitTests/SplitTestHandler')
const AuthorizationManager = require('../Authorization/AuthorizationManager')
const Modules = require('../../infrastructure/Modules')
@@ -425,6 +429,11 @@ async function purchaseAddon(req, res, next) {
'Your subscription already includes this add-on',
{ addon: addOnCode }
)
} else if (err instanceof PaymentActionRequiredError) {
return res.status(402).json({
message: 'Payment action required',
clientSecret: err.info.clientSecret,
})
} else {
if (err instanceof Error) {
OError.tag(err, 'something went wrong purchasing add-ons', {