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. import { Joi, validate } from '../../infrastructure/Validation.js'
  10. const teamInviteRateLimiter = new RateLimiter('team-invite', {
  11. points: 10,
  12. duration: 60,
  13. })
  14. const subscriptionRateLimiter = new RateLimiter('subscription', {
  15. points: 30,
  16. duration: 60,
  17. })
  18. export default {
  19. apply(webRouter, privateApiRouter, publicApiRouter) {
  20. if (!Settings.enableSubscriptions) {
  21. return
  22. }
  23. webRouter.get(
  24. '/user/subscription',
  25. AuthenticationController.requireLogin(),
  26. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  27. PermissionsController.useCapabilities(),
  28. SubscriptionController.userSubscriptionPage
  29. )
  30. webRouter.get(
  31. '/user/subscription/thank-you',
  32. AuthenticationController.requireLogin(),
  33. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  34. SubscriptionController.successfulSubscription
  35. )
  36. webRouter.get(
  37. '/user/subscription/canceled',
  38. AuthenticationController.requireLogin(),
  39. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  40. SubscriptionController.canceledSubscription
  41. )
  42. webRouter.delete(
  43. '/subscription/group/user',
  44. AuthenticationController.requireLogin(),
  45. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  46. PermissionsController.requirePermission('leave-group-subscription'),
  47. SubscriptionGroupController.removeSelfFromGroup
  48. )
  49. webRouter.get(
  50. '/user/subscription/group/add-users',
  51. AuthenticationController.requireLogin(),
  52. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  53. SubscriptionGroupController.addSeatsToGroupSubscription
  54. )
  55. webRouter.post(
  56. '/user/subscription/group/add-users/preview',
  57. AuthenticationController.requireLogin(),
  58. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  59. SubscriptionGroupController.previewAddSeatsSubscriptionChange
  60. )
  61. webRouter.post(
  62. '/user/subscription/group/add-users/create',
  63. AuthenticationController.requireLogin(),
  64. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  65. SubscriptionGroupController.createAddSeatsSubscriptionChange
  66. )
  67. webRouter.post(
  68. '/user/subscription/group/add-users/sales-contact-form',
  69. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  70. SubscriptionGroupController.submitForm
  71. )
  72. webRouter.get(
  73. '/user/subscription/group/upgrade-subscription',
  74. AuthenticationController.requireLogin(),
  75. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  76. SubscriptionGroupController.subscriptionUpgradePage
  77. )
  78. webRouter.get(
  79. '/user/subscription/group/group-plan-per-user-prices',
  80. AuthenticationController.requireLogin(),
  81. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  82. SubscriptionGroupController.getGroupPlanPerUserPrices
  83. )
  84. webRouter.post(
  85. '/user/subscription/group/upgrade-subscription',
  86. AuthenticationController.requireLogin(),
  87. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  88. SubscriptionGroupController.upgradeSubscription
  89. )
  90. webRouter.get(
  91. '/user/subscription/group/missing-billing-information',
  92. AuthenticationController.requireLogin(),
  93. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  94. SubscriptionGroupController.missingBillingInformation
  95. )
  96. webRouter.get(
  97. '/user/subscription/group/manually-collected-subscription',
  98. AuthenticationController.requireLogin(),
  99. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  100. SubscriptionGroupController.manuallyCollectedSubscription
  101. )
  102. webRouter.get(
  103. '/user/subscription/group/subtotal-limit-exceeded',
  104. AuthenticationController.requireLogin(),
  105. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  106. SubscriptionGroupController.subtotalLimitExceeded
  107. )
  108. // Team invites
  109. webRouter.get(
  110. '/subscription/invites/:token/',
  111. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  112. PermissionsController.useCapabilities(),
  113. TeamInvitesController.viewInvite
  114. )
  115. webRouter.get(
  116. '/subscription/invites/',
  117. AuthenticationController.requireLogin(),
  118. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  119. PermissionsController.useCapabilities(),
  120. TeamInvitesController.viewInvites
  121. )
  122. webRouter.put(
  123. '/subscription/invites/:token/',
  124. AuthenticationController.requireLogin(),
  125. RateLimiterMiddleware.rateLimit(teamInviteRateLimiter),
  126. PermissionsController.requirePermission('join-subscription'),
  127. TeamInvitesController.acceptInvite
  128. )
  129. // recurly callback
  130. publicApiRouter.post(
  131. '/user/subscription/callback',
  132. RateLimiterMiddleware.rateLimit(
  133. new RateLimiter('recurly-callback', {
  134. points: 200,
  135. duration: 60,
  136. })
  137. ),
  138. AuthenticationController.requireBasicAuth({
  139. [Settings.apis.recurly.webhookUser]: Settings.apis.recurly.webhookPass,
  140. }),
  141. SubscriptionController.recurlyNotificationParser,
  142. SubscriptionController.recurlyCallback
  143. )
  144. // user changes their account state
  145. webRouter.get(
  146. '/user/subscription/preview',
  147. AuthenticationController.requireLogin(),
  148. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  149. SubscriptionController.previewSubscription
  150. )
  151. webRouter.get(
  152. '/user/subscription/addon/:addOnCode/add',
  153. AuthenticationController.requireLogin(),
  154. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  155. SubscriptionController.previewAddonPurchase
  156. )
  157. webRouter.post(
  158. '/user/subscription/addon/:addOnCode/add',
  159. AuthenticationController.requireLogin(),
  160. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  161. SubscriptionController.purchaseAddon
  162. )
  163. webRouter.post(
  164. '/user/subscription/addon/:addOnCode/remove',
  165. AuthenticationController.requireLogin(),
  166. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  167. SubscriptionController.removeAddon
  168. )
  169. webRouter.post(
  170. '/user/subscription/cancel-pending',
  171. AuthenticationController.requireLogin(),
  172. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  173. SubscriptionController.cancelPendingSubscriptionChange
  174. )
  175. webRouter.post(
  176. '/user/subscription/cancel',
  177. AuthenticationController.requireLogin(),
  178. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  179. SubscriptionController.cancelSubscription
  180. )
  181. webRouter.post(
  182. '/user/subscription/pause/:pauseCycles',
  183. AuthenticationController.requireLogin(),
  184. validate({
  185. params: Joi.object({
  186. pauseCycles: Joi.number().integer().max(12),
  187. }),
  188. }),
  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. }