generate_addon_prices.mjs 1.7 KB

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