SubscriptionRouter.mjs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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. const MAX_NUMBER_OF_USERS = 50
  19. const addSeatsValidateSchema = {
  20. body: Joi.object({
  21. adding: Joi.number().integer().min(1).max(MAX_NUMBER_OF_USERS).required(),
  22. }),
  23. }
  24. export default {
  25. apply(webRouter, privateApiRouter, publicApiRouter) {
  26. if (!Settings.enableSubscriptions) {
  27. return
  28. }
  29. webRouter.get(
  30. '/user/subscription',
  31. AuthenticationController.requireLogin(),
  32. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  33. PermissionsController.useCapabilities(),
  34. SubscriptionController.userSubscriptionPage
  35. )
  36. webRouter.get(
  37. '/user/subscription/thank-you',
  38. AuthenticationController.requireLogin(),
  39. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  40. SubscriptionController.successfulSubscription
  41. )
  42. webRouter.get(
  43. '/user/subscription/canceled',
  44. AuthenticationController.requireLogin(),
  45. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  46. SubscriptionController.canceledSubscription
  47. )
  48. webRouter.get(
  49. '/user/subscription/recurly/:pageType',
  50. AuthenticationController.requireLogin(),
  51. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  52. SubscriptionController.redirectToHostedPage
  53. )
  54. webRouter.delete(
  55. '/subscription/group/user',
  56. AuthenticationController.requireLogin(),
  57. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  58. PermissionsController.requirePermission('leave-group-subscription'),
  59. SubscriptionGroupController.removeSelfFromGroup
  60. )
  61. webRouter.get(
  62. '/user/subscription/group/add-users',
  63. AuthenticationController.requireLogin(),
  64. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  65. SubscriptionGroupController.flexibleLicensingSplitTest,
  66. SubscriptionGroupController.addSeatsToGroupSubscription
  67. )
  68. webRouter.post(
  69. '/user/subscription/group/add-users/preview',
  70. AuthenticationController.requireLogin(),
  71. validate(addSeatsValidateSchema),
  72. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  73. SubscriptionGroupController.previewAddSeatsSubscriptionChange
  74. )
  75. webRouter.post(
  76. '/user/subscription/group/add-users/create',
  77. AuthenticationController.requireLogin(),
  78. validate(addSeatsValidateSchema),
  79. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  80. SubscriptionGroupController.createAddSeatsSubscriptionChange
  81. )
  82. webRouter.post(
  83. '/user/subscription/group/add-users/sales-contact-form',
  84. validate({
  85. body: Joi.object({
  86. adding: Joi.number().integer().min(MAX_NUMBER_OF_USERS).required(),
  87. }),
  88. }),
  89. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  90. SubscriptionGroupController.submitForm
  91. )
  92. webRouter.get(
  93. '/user/subscription/group/upgrade-subscription',
  94. AuthenticationController.requireLogin(),
  95. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  96. SubscriptionGroupController.flexibleLicensingSplitTest,
  97. SubscriptionGroupController.subscriptionUpgradePage
  98. )
  99. webRouter.post(
  100. '/user/subscription/group/upgrade-subscription',
  101. AuthenticationController.requireLogin(),
  102. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  103. SubscriptionGroupController.upgradeSubscription
  104. )
  105. webRouter.get(
  106. '/user/subscription/group/missing-billing-information',
  107. AuthenticationController.requireLogin(),
  108. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  109. SubscriptionGroupController.flexibleLicensingSplitTest,
  110. SubscriptionGroupController.missingBillingInformation
  111. )
  112. // Team invites
  113. webRouter.get(
  114. '/subscription/invites/:token/',
  115. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  116. PermissionsController.useCapabilities(),
  117. TeamInvitesController.viewInvite
  118. )
  119. webRouter.get(
  120. '/subscription/invites/',
  121. AuthenticationController.requireLogin(),
  122. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  123. PermissionsController.useCapabilities(),
  124. TeamInvitesController.viewInvites
  125. )
  126. webRouter.put(
  127. '/subscription/invites/:token/',
  128. AuthenticationController.requireLogin(),
  129. RateLimiterMiddleware.rateLimit(teamInviteRateLimiter),
  130. PermissionsController.requirePermission('join-subscription'),
  131. TeamInvitesController.acceptInvite
  132. )
  133. // recurly callback
  134. publicApiRouter.post(
  135. '/user/subscription/callback',
  136. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  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.post(
  151. '/user/subscription/update',
  152. AuthenticationController.requireLogin(),
  153. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  154. SubscriptionController.updateSubscription
  155. )
  156. webRouter.get(
  157. '/user/subscription/addon/:addOnCode/add',
  158. AuthenticationController.requireLogin(),
  159. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  160. SubscriptionController.previewAddonPurchase
  161. )
  162. webRouter.post(
  163. '/user/subscription/addon/:addOnCode/add',
  164. AuthenticationController.requireLogin(),
  165. validate({
  166. params: Joi.object({
  167. addOnCode: Joi.string(),
  168. }),
  169. }),
  170. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  171. SubscriptionController.purchaseAddon
  172. )
  173. webRouter.post(
  174. '/user/subscription/addon/:addOnCode/remove',
  175. AuthenticationController.requireLogin(),
  176. validate({
  177. params: Joi.object({
  178. addOnCode: Joi.string(),
  179. }),
  180. }),
  181. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  182. SubscriptionController.removeAddon
  183. )
  184. webRouter.post(
  185. '/user/subscription/cancel-pending',
  186. AuthenticationController.requireLogin(),
  187. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  188. SubscriptionController.cancelPendingSubscriptionChange
  189. )
  190. webRouter.post(
  191. '/user/subscription/cancel',
  192. AuthenticationController.requireLogin(),
  193. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  194. SubscriptionController.cancelSubscription
  195. )
  196. webRouter.post(
  197. '/user/subscription/pause/:pauseCycles',
  198. AuthenticationController.requireLogin(),
  199. validate({
  200. params: Joi.object({
  201. pauseCycles: Joi.number().integer().max(12),
  202. }),
  203. }),
  204. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  205. SubscriptionController.pauseSubscription
  206. )
  207. webRouter.post(
  208. '/user/subscription/resume',
  209. AuthenticationController.requireLogin(),
  210. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  211. SubscriptionController.resumeSubscription
  212. )
  213. webRouter.post(
  214. '/user/subscription/reactivate',
  215. AuthenticationController.requireLogin(),
  216. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  217. PermissionsController.useCapabilities(),
  218. SubscriptionController.reactivateSubscription
  219. )
  220. webRouter.post(
  221. '/user/subscription/v1/cancel',
  222. AuthenticationController.requireLogin(),
  223. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  224. SubscriptionController.cancelV1Subscription
  225. )
  226. webRouter.put(
  227. '/user/subscription/extend',
  228. AuthenticationController.requireLogin(),
  229. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  230. SubscriptionController.extendTrial
  231. )
  232. webRouter.post(
  233. '/user/subscription/account/email',
  234. AuthenticationController.requireLogin(),
  235. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  236. SubscriptionController.updateAccountEmailAddress
  237. )
  238. },
  239. }