generate_addon_prices.mjs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // @ts-check
  2. import settings from '@overleaf/settings'
  3. import recurly from 'recurly'
  4. const ADD_ON_CODE = process.argv[2]
  5. async function main() {
  6. if (!ADD_ON_CODE) {
  7. console.error('Missing add-on code')
  8. console.error(
  9. 'Usage: node scripts/recurly/generate_addon_prices.mjs ADD_ON_CODE'
  10. )
  11. process.exit(1)
  12. }
  13. const localizedAddOnsPricing = {}
  14. const monthlyPlan = await getPlan(ADD_ON_CODE)
  15. if (monthlyPlan == null) {
  16. console.error(`Monthly plan missing in Recurly: ${ADD_ON_CODE}`)
  17. process.exit(1)
  18. }
  19. for (const { currency, unitAmount } of monthlyPlan.currencies ?? []) {
  20. if (!localizedAddOnsPricing[currency]) {
  21. localizedAddOnsPricing[currency] = { [ADD_ON_CODE]: {} }
  22. }
  23. localizedAddOnsPricing[currency][ADD_ON_CODE].monthly = unitAmount
  24. }
  25. const annualPlan = await getPlan(`${ADD_ON_CODE}-annual`)
  26. if (annualPlan == null) {
  27. console.error(`Annual plan missing in Recurly: ${ADD_ON_CODE}-annual`)
  28. process.exit(1)
  29. }
  30. for (const { currency, unitAmount } of annualPlan.currencies ?? []) {
  31. if (!localizedAddOnsPricing[currency]) {
  32. localizedAddOnsPricing[currency] = { [ADD_ON_CODE]: {} }
  33. }
  34. localizedAddOnsPricing[currency][ADD_ON_CODE].annual = unitAmount
  35. localizedAddOnsPricing[currency][ADD_ON_CODE].annualDividedByTwelve =
  36. (unitAmount || 0) / 12
  37. }
  38. console.log(JSON.stringify({ localizedAddOnsPricing }, null, 2))
  39. }
  40. /**
  41. * Get a plan configuration from Recurly
  42. *
  43. * @param {string} planCode
  44. */
  45. async function getPlan(planCode) {
  46. const recurlyClient = new recurly.Client(settings.apis.recurly.apiKey)
  47. return await recurlyClient.getPlan(`code-${planCode}`)
  48. }
  49. await main()