Merge pull request #27643 from overleaf/rh-pause-cancel

Terminate Recurly subscription when cancelling during final month of pause

GitOrigin-RevId: 39e4c9534621f57b3e2783599ebe521959d7401f
This commit is contained in:
roo hutton
2025-08-29 08:06:17 +00:00
committed by Copybot
parent 3279f997bb
commit 467102fd1b
5 changed files with 61 additions and 66 deletions
@@ -331,18 +331,32 @@ async function cancelSubscriptionByUuid(subscriptionUuid) {
try {
return await client.cancelSubscription('uuid-' + subscriptionUuid)
} catch (err) {
if (err instanceof recurly.errors.ValidationError) {
if (
err.message === 'Only active and future subscriptions can be canceled.'
) {
logger.debug(
{ subscriptionUuid },
'subscription cancellation failed, subscription not active'
)
}
} else {
if (!(err instanceof recurly.errors.ValidationError)) {
throw err
}
const errorMessage = err.message || ''
if (
errorMessage === 'Only active and future subscriptions can be canceled.'
) {
logger.debug(
{ subscriptionUuid },
'subscription cancellation failed, subscription not active'
)
} else if (
errorMessage.includes(
'Cannot cancel a paused subscription in the last cycle of the term'
)
) {
logger.debug(
{ subscriptionUuid },
'Terminating subscription in last cycle of paused term'
)
return await terminateSubscriptionByUuid(subscriptionUuid)
}
throw err
}
}
@@ -134,26 +134,19 @@ async function cancelPendingSubscriptionChange(user) {
* @param user
*/
async function cancelSubscription(user) {
try {
const { hasSubscription, subscription } =
await LimitationsManager.promises.userHasSubscription(user)
if (hasSubscription && subscription != null) {
await Modules.promises.hooks.fire('cancelPaidSubscription', subscription)
const emailOpts = {
to: user.email,
first_name: user.first_name,
}
const ONE_HOUR_IN_MS = 1000 * 60 * 60
EmailHandler.sendDeferredEmail(
'canceledSubscription',
emailOpts,
ONE_HOUR_IN_MS
)
const { hasSubscription, subscription } =
await LimitationsManager.promises.userHasSubscription(user)
if (hasSubscription && subscription != null) {
await Modules.promises.hooks.fire('cancelPaidSubscription', subscription)
const emailOpts = {
to: user.email,
first_name: user.first_name,
}
} catch (err) {
logger.warn(
{ err, userId: user._id },
'there was an error checking user v2 subscription'
const ONE_HOUR_IN_MS = 1000 * 60 * 60
EmailHandler.sendDeferredEmail(
'canceledSubscription',
emailOpts,
ONE_HOUR_IN_MS
)
}
}