SubscriptionRouter.mjs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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 = 20
  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. webRouter.get(
  113. '/user/subscription/group/manually-collected-subscription',
  114. AuthenticationController.requireLogin(),
  115. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  116. SubscriptionGroupController.flexibleLicensingSplitTest,
  117. SubscriptionGroupController.manuallyCollectedSubscription
  118. )
  119. webRouter.get(
  120. '/user/subscription/group/subtotal-limit-exceeded',
  121. AuthenticationController.requireLogin(),
  122. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  123. SubscriptionGroupController.flexibleLicensingSplitTest,
  124. SubscriptionGroupController.subtotalLimitExceeded
  125. )
  126. // Team invites
  127. webRouter.get(
  128. '/subscription/invites/:token/',
  129. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  130. PermissionsController.useCapabilities(),
  131. TeamInvitesController.viewInvite
  132. )
  133. webRouter.get(
  134. '/subscription/invites/',
  135. AuthenticationController.requireLogin(),
  136. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  137. PermissionsController.useCapabilities(),
  138. TeamInvitesController.viewInvites
  139. )
  140. webRouter.put(
  141. '/subscription/invites/:token/',
  142. AuthenticationController.requireLogin(),
  143. RateLimiterMiddleware.rateLimit(teamInviteRateLimiter),
  144. PermissionsController.requirePermission('join-subscription'),
  145. TeamInvitesController.acceptInvite
  146. )
  147. // recurly callback
  148. publicApiRouter.post(
  149. '/user/subscription/callback',
  150. RateLimiterMiddleware.rateLimit(
  151. new RateLimiter('recurly-callback', {
  152. points: 200,
  153. duration: 60,
  154. })
  155. ),
  156. AuthenticationController.requireBasicAuth({
  157. [Settings.apis.recurly.webhookUser]: Settings.apis.recurly.webhookPass,
  158. }),
  159. SubscriptionController.recurlyNotificationParser,
  160. SubscriptionController.recurlyCallback
  161. )
  162. // user changes their account state
  163. webRouter.get(
  164. '/user/subscription/preview',
  165. AuthenticationController.requireLogin(),
  166. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  167. SubscriptionController.previewSubscription
  168. )
  169. webRouter.get(
  170. '/user/subscription/addon/:addOnCode/add',
  171. AuthenticationController.requireLogin(),
  172. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  173. SubscriptionController.previewAddonPurchase
  174. )
  175. webRouter.post(
  176. '/user/subscription/addon/:addOnCode/add',
  177. AuthenticationController.requireLogin(),
  178. validate({
  179. params: Joi.object({
  180. addOnCode: Joi.string(),
  181. }),
  182. }),
  183. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  184. SubscriptionController.purchaseAddon
  185. )
  186. webRouter.post(
  187. '/user/subscription/addon/:addOnCode/remove',
  188. AuthenticationController.requireLogin(),
  189. validate({
  190. params: Joi.object({
  191. addOnCode: Joi.string(),
  192. }),
  193. }),
  194. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  195. SubscriptionController.removeAddon
  196. )
  197. webRouter.post(
  198. '/user/subscription/cancel-pending',
  199. AuthenticationController.requireLogin(),
  200. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  201. SubscriptionController.cancelPendingSubscriptionChange
  202. )
  203. webRouter.post(
  204. '/user/subscription/cancel',
  205. AuthenticationController.requireLogin(),
  206. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  207. SubscriptionController.cancelSubscription
  208. )
  209. webRouter.post(
  210. '/user/subscription/pause/:pauseCycles',
  211. AuthenticationController.requireLogin(),
  212. validate({
  213. params: Joi.object({
  214. pauseCycles: Joi.number().integer().max(12),
  215. }),
  216. }),
  217. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  218. SubscriptionController.pauseSubscription
  219. )
  220. webRouter.post(
  221. '/user/subscription/resume',
  222. AuthenticationController.requireLogin(),
  223. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  224. SubscriptionController.resumeSubscription
  225. )
  226. webRouter.post(
  227. '/user/subscription/reactivate',
  228. AuthenticationController.requireLogin(),
  229. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  230. PermissionsController.useCapabilities(),
  231. SubscriptionController.reactivateSubscription
  232. )
  233. webRouter.post(
  234. '/user/subscription/v1/cancel',
  235. AuthenticationController.requireLogin(),
  236. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  237. SubscriptionController.cancelV1Subscription
  238. )
  239. webRouter.put(
  240. '/user/subscription/extend',
  241. AuthenticationController.requireLogin(),
  242. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  243. SubscriptionController.extendTrial
  244. )
  245. webRouter.post(
  246. '/user/subscription/account/email',
  247. AuthenticationController.requireLogin(),
  248. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  249. SubscriptionController.updateAccountEmailAddress
  250. )
  251. },
  252. }