SubscriptionRouter.mjs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import AuthenticationController from '../Authentication/AuthenticationController.js'
  2. import PermissionsController from '../Authorization/PermissionsController.js'
  3. import SubscriptionController from './SubscriptionController.js'
  4. import SubscriptionGroupController from './SubscriptionGroupController.mjs'
  5. import TeamInvitesController from './TeamInvitesController.mjs'
  6. import { RateLimiter } from '../../infrastructure/RateLimiter.js'
  7. import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js'
  8. import Settings from '@overleaf/settings'
  9. const teamInviteRateLimiter = new RateLimiter('team-invite', {
  10. points: 10,
  11. duration: 60,
  12. })
  13. const subscriptionRateLimiter = new RateLimiter('subscription', {
  14. points: 30,
  15. duration: 60,
  16. })
  17. export default {
  18. apply(webRouter, privateApiRouter, publicApiRouter) {
  19. if (!Settings.enableSubscriptions) {
  20. return
  21. }
  22. webRouter.get(
  23. '/user/subscription',
  24. AuthenticationController.requireLogin(),
  25. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  26. PermissionsController.useCapabilities(),
  27. SubscriptionController.userSubscriptionPage
  28. )
  29. webRouter.get(
  30. '/user/subscription/thank-you',
  31. AuthenticationController.requireLogin(),
  32. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  33. SubscriptionController.successfulSubscription
  34. )
  35. webRouter.get(
  36. '/user/subscription/canceled',
  37. AuthenticationController.requireLogin(),
  38. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  39. SubscriptionController.canceledSubscription
  40. )
  41. webRouter.delete(
  42. '/subscription/group/user',
  43. AuthenticationController.requireLogin(),
  44. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  45. PermissionsController.requirePermission('leave-group-subscription'),
  46. SubscriptionGroupController.removeSelfFromGroup
  47. )
  48. webRouter.get(
  49. '/user/subscription/group/add-users',
  50. AuthenticationController.requireLogin(),
  51. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  52. SubscriptionGroupController.addSeatsToGroupSubscription
  53. )
  54. webRouter.post(
  55. '/user/subscription/group/add-users/preview',
  56. AuthenticationController.requireLogin(),
  57. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  58. SubscriptionGroupController.previewAddSeatsSubscriptionChange
  59. )
  60. webRouter.post(
  61. '/user/subscription/group/add-users/create',
  62. AuthenticationController.requireLogin(),
  63. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  64. SubscriptionGroupController.createAddSeatsSubscriptionChange
  65. )
  66. webRouter.post(
  67. '/user/subscription/group/add-users/sales-contact-form',
  68. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  69. SubscriptionGroupController.submitForm
  70. )
  71. webRouter.get(
  72. '/user/subscription/group/upgrade-subscription',
  73. AuthenticationController.requireLogin(),
  74. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  75. SubscriptionGroupController.subscriptionUpgradePage
  76. )
  77. webRouter.get(
  78. '/user/subscription/group/group-plan-per-user-prices',
  79. AuthenticationController.requireLogin(),
  80. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  81. SubscriptionGroupController.getGroupPlanPerUserPrices
  82. )
  83. webRouter.post(
  84. '/user/subscription/group/upgrade-subscription',
  85. AuthenticationController.requireLogin(),
  86. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  87. SubscriptionGroupController.upgradeSubscription
  88. )
  89. webRouter.get(
  90. '/user/subscription/group/missing-billing-information',
  91. AuthenticationController.requireLogin(),
  92. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  93. SubscriptionGroupController.missingBillingInformation
  94. )
  95. webRouter.get(
  96. '/user/subscription/group/manually-collected-subscription',
  97. AuthenticationController.requireLogin(),
  98. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  99. SubscriptionGroupController.manuallyCollectedSubscription
  100. )
  101. webRouter.get(
  102. '/user/subscription/group/subtotal-limit-exceeded',
  103. AuthenticationController.requireLogin(),
  104. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  105. SubscriptionGroupController.subtotalLimitExceeded
  106. )
  107. // Team invites
  108. webRouter.get(
  109. '/subscription/invites/:token/',
  110. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  111. PermissionsController.useCapabilities(),
  112. TeamInvitesController.viewInvite
  113. )
  114. webRouter.get(
  115. '/subscription/invites/',
  116. AuthenticationController.requireLogin(),
  117. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  118. PermissionsController.useCapabilities(),
  119. TeamInvitesController.viewInvites
  120. )
  121. webRouter.put(
  122. '/subscription/invites/:token/',
  123. AuthenticationController.requireLogin(),
  124. RateLimiterMiddleware.rateLimit(teamInviteRateLimiter),
  125. PermissionsController.requirePermission('join-subscription'),
  126. TeamInvitesController.acceptInvite
  127. )
  128. // recurly callback
  129. publicApiRouter.post(
  130. '/user/subscription/callback',
  131. RateLimiterMiddleware.rateLimit(
  132. new RateLimiter('recurly-callback', {
  133. points: 200,
  134. duration: 60,
  135. })
  136. ),
  137. AuthenticationController.requireBasicAuth({
  138. [Settings.apis.recurly.webhookUser]: Settings.apis.recurly.webhookPass,
  139. }),
  140. SubscriptionController.recurlyNotificationParser,
  141. SubscriptionController.recurlyCallback
  142. )
  143. // user changes their account state
  144. webRouter.get(
  145. '/user/subscription/preview',
  146. AuthenticationController.requireLogin(),
  147. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  148. SubscriptionController.previewSubscription
  149. )
  150. webRouter.get(
  151. '/user/subscription/addon/:addOnCode/add',
  152. AuthenticationController.requireLogin(),
  153. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  154. SubscriptionController.previewAddonPurchase
  155. )
  156. webRouter.post(
  157. '/user/subscription/addon/:addOnCode/add',
  158. AuthenticationController.requireLogin(),
  159. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  160. SubscriptionController.purchaseAddon
  161. )
  162. webRouter.post(
  163. '/user/subscription/addon/:addOnCode/remove',
  164. AuthenticationController.requireLogin(),
  165. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  166. SubscriptionController.removeAddon
  167. )
  168. webRouter.post(
  169. '/user/subscription/addon/:addOnCode/reactivate',
  170. AuthenticationController.requireLogin(),
  171. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  172. SubscriptionController.reactivateAddon
  173. )
  174. webRouter.post(
  175. '/user/subscription/cancel-pending',
  176. AuthenticationController.requireLogin(),
  177. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  178. SubscriptionController.cancelPendingSubscriptionChange
  179. )
  180. webRouter.post(
  181. '/user/subscription/cancel',
  182. AuthenticationController.requireLogin(),
  183. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  184. SubscriptionController.cancelSubscription
  185. )
  186. webRouter.post(
  187. '/user/subscription/pause/:pauseCycles',
  188. AuthenticationController.requireLogin(),
  189. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  190. SubscriptionController.pauseSubscription
  191. )
  192. webRouter.post(
  193. '/user/subscription/resume',
  194. AuthenticationController.requireLogin(),
  195. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  196. SubscriptionController.resumeSubscription
  197. )
  198. webRouter.post(
  199. '/user/subscription/reactivate',
  200. AuthenticationController.requireLogin(),
  201. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  202. PermissionsController.useCapabilities(),
  203. SubscriptionController.reactivateSubscription
  204. )
  205. webRouter.post(
  206. '/user/subscription/v1/cancel',
  207. AuthenticationController.requireLogin(),
  208. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  209. SubscriptionController.cancelV1Subscription
  210. )
  211. webRouter.put(
  212. '/user/subscription/extend',
  213. AuthenticationController.requireLogin(),
  214. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  215. SubscriptionController.extendTrial
  216. )
  217. webRouter.post(
  218. '/user/subscription/account/email',
  219. AuthenticationController.requireLogin(),
  220. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  221. SubscriptionController.updateAccountEmailAddress
  222. )
  223. },
  224. }