SubscriptionRouter.mjs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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(subscriptionRateLimiter),
  151. AuthenticationController.requireBasicAuth({
  152. [Settings.apis.recurly.webhookUser]: Settings.apis.recurly.webhookPass,
  153. }),
  154. SubscriptionController.recurlyNotificationParser,
  155. SubscriptionController.recurlyCallback
  156. )
  157. // user changes their account state
  158. webRouter.get(
  159. '/user/subscription/preview',
  160. AuthenticationController.requireLogin(),
  161. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  162. SubscriptionController.previewSubscription
  163. )
  164. webRouter.post(
  165. '/user/subscription/update',
  166. AuthenticationController.requireLogin(),
  167. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  168. SubscriptionController.updateSubscription
  169. )
  170. webRouter.get(
  171. '/user/subscription/addon/:addOnCode/add',
  172. AuthenticationController.requireLogin(),
  173. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  174. SubscriptionController.previewAddonPurchase
  175. )
  176. webRouter.post(
  177. '/user/subscription/addon/:addOnCode/add',
  178. AuthenticationController.requireLogin(),
  179. validate({
  180. params: Joi.object({
  181. addOnCode: Joi.string(),
  182. }),
  183. }),
  184. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  185. SubscriptionController.purchaseAddon
  186. )
  187. webRouter.post(
  188. '/user/subscription/addon/:addOnCode/remove',
  189. AuthenticationController.requireLogin(),
  190. validate({
  191. params: Joi.object({
  192. addOnCode: Joi.string(),
  193. }),
  194. }),
  195. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  196. SubscriptionController.removeAddon
  197. )
  198. webRouter.post(
  199. '/user/subscription/cancel-pending',
  200. AuthenticationController.requireLogin(),
  201. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  202. SubscriptionController.cancelPendingSubscriptionChange
  203. )
  204. webRouter.post(
  205. '/user/subscription/cancel',
  206. AuthenticationController.requireLogin(),
  207. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  208. SubscriptionController.cancelSubscription
  209. )
  210. webRouter.post(
  211. '/user/subscription/pause/:pauseCycles',
  212. AuthenticationController.requireLogin(),
  213. validate({
  214. params: Joi.object({
  215. pauseCycles: Joi.number().integer().max(12),
  216. }),
  217. }),
  218. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  219. SubscriptionController.pauseSubscription
  220. )
  221. webRouter.post(
  222. '/user/subscription/resume',
  223. AuthenticationController.requireLogin(),
  224. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  225. SubscriptionController.resumeSubscription
  226. )
  227. webRouter.post(
  228. '/user/subscription/reactivate',
  229. AuthenticationController.requireLogin(),
  230. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  231. PermissionsController.useCapabilities(),
  232. SubscriptionController.reactivateSubscription
  233. )
  234. webRouter.post(
  235. '/user/subscription/v1/cancel',
  236. AuthenticationController.requireLogin(),
  237. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  238. SubscriptionController.cancelV1Subscription
  239. )
  240. webRouter.put(
  241. '/user/subscription/extend',
  242. AuthenticationController.requireLogin(),
  243. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  244. SubscriptionController.extendTrial
  245. )
  246. webRouter.post(
  247. '/user/subscription/account/email',
  248. AuthenticationController.requireLogin(),
  249. RateLimiterMiddleware.rateLimit(subscriptionRateLimiter),
  250. SubscriptionController.updateAccountEmailAddress
  251. )
  252. },
  253. }