RecurlyClient.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. const recurly = require('recurly')
  2. const Settings = require('@overleaf/settings')
  3. const logger = require('@overleaf/logger')
  4. const { callbackify } = require('util')
  5. const UserGetter = require('../User/UserGetter')
  6. const recurlySettings = Settings.apis.recurly
  7. const recurlyApiKey = recurlySettings ? recurlySettings.apiKey : undefined
  8. const client = new recurly.Client(recurlyApiKey)
  9. async function getAccountForUserId(userId) {
  10. try {
  11. return await client.getAccount(`code-${userId}`)
  12. } catch (err) {
  13. if (err instanceof recurly.errors.NotFoundError) {
  14. // An expected error, we don't need to handle it, just return nothing
  15. logger.debug({ userId }, 'no recurly account found for user')
  16. } else {
  17. throw err
  18. }
  19. }
  20. }
  21. async function createAccountForUserId(userId) {
  22. const user = await UserGetter.promises.getUser(userId, {
  23. _id: 1,
  24. first_name: 1,
  25. last_name: 1,
  26. email: 1,
  27. })
  28. const accountCreate = {
  29. code: user._id.toString(),
  30. email: user.email,
  31. firstName: user.first_name,
  32. lastName: user.last_name,
  33. }
  34. const account = await client.createAccount(accountCreate)
  35. logger.debug({ userId, account }, 'created recurly account')
  36. return account
  37. }
  38. async function getSubscription(subscriptionId) {
  39. return await client.getSubscription(subscriptionId)
  40. }
  41. async function changeSubscription(subscriptionId, body) {
  42. const change = await client.createSubscriptionChange(subscriptionId, body)
  43. logger.debug(
  44. { subscriptionId, changeId: change.id },
  45. 'created subscription change'
  46. )
  47. return change
  48. }
  49. async function changeSubscriptionByUuid(subscriptionUuid, ...args) {
  50. return await changeSubscription('uuid-' + subscriptionUuid, ...args)
  51. }
  52. async function removeSubscriptionChange(subscriptionId) {
  53. const removed = await client.removeSubscriptionChange(subscriptionId)
  54. logger.debug({ subscriptionId }, 'removed pending subscription change')
  55. return removed
  56. }
  57. async function removeSubscriptionChangeByUuid(subscriptionUuid) {
  58. return await removeSubscriptionChange('uuid-' + subscriptionUuid)
  59. }
  60. async function reactivateSubscriptionByUuid(subscriptionUuid) {
  61. return await client.reactivateSubscription('uuid-' + subscriptionUuid)
  62. }
  63. async function cancelSubscriptionByUuid(subscriptionUuid) {
  64. try {
  65. return await client.cancelSubscription('uuid-' + subscriptionUuid)
  66. } catch (err) {
  67. if (err instanceof recurly.errors.ValidationError) {
  68. if (
  69. err.message === 'Only active and future subscriptions can be canceled.'
  70. ) {
  71. logger.debug(
  72. { subscriptionUuid },
  73. 'subscription cancellation failed, subscription not active'
  74. )
  75. }
  76. } else {
  77. throw err
  78. }
  79. }
  80. }
  81. module.exports = {
  82. errors: recurly.errors,
  83. getAccountForUserId: callbackify(getAccountForUserId),
  84. createAccountForUserId: callbackify(createAccountForUserId),
  85. getSubscription: callbackify(getSubscription),
  86. changeSubscription: callbackify(changeSubscription),
  87. changeSubscriptionByUuid: callbackify(changeSubscriptionByUuid),
  88. removeSubscriptionChange: callbackify(removeSubscriptionChange),
  89. removeSubscriptionChangeByUuid: callbackify(removeSubscriptionChangeByUuid),
  90. reactivateSubscriptionByUuid: callbackify(reactivateSubscriptionByUuid),
  91. cancelSubscriptionByUuid: callbackify(cancelSubscriptionByUuid),
  92. promises: {
  93. getSubscription,
  94. getAccountForUserId,
  95. createAccountForUserId,
  96. changeSubscription,
  97. changeSubscriptionByUuid,
  98. removeSubscriptionChange,
  99. removeSubscriptionChangeByUuid,
  100. reactivateSubscriptionByUuid,
  101. cancelSubscriptionByUuid,
  102. },
  103. }