SubscriptionGroupController.mjs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // ts-check
  2. import SubscriptionGroupHandler from './SubscriptionGroupHandler.js'
  3. import OError from '@overleaf/o-error'
  4. import logger from '@overleaf/logger'
  5. import SubscriptionLocator from './SubscriptionLocator.js'
  6. import SessionManager from '../Authentication/SessionManager.js'
  7. import UserAuditLogHandler from '../User/UserAuditLogHandler.js'
  8. import { expressify } from '@overleaf/promise-utils'
  9. import Modules from '../../infrastructure/Modules.js'
  10. import SplitTestHandler from '../SplitTests/SplitTestHandler.js'
  11. import ErrorController from '../Errors/ErrorController.js'
  12. /**
  13. * @import { Subscription } from "../../../../types/subscription/dashboard/subscription"
  14. */
  15. /**
  16. * @param {import("express").Request} req
  17. * @param {import("express").Response} res
  18. * @returns {Promise<void>}
  19. */
  20. async function removeUserFromGroup(req, res) {
  21. const subscription = req.entity
  22. const userToRemoveId = req.params.user_id
  23. const loggedInUserId = SessionManager.getLoggedInUserId(req.session)
  24. const subscriptionId = subscription._id
  25. logger.debug(
  26. { subscriptionId, userToRemoveId },
  27. 'removing user from group subscription'
  28. )
  29. await _removeUserFromGroup(req, res, {
  30. userToRemoveId,
  31. loggedInUserId,
  32. subscription,
  33. })
  34. }
  35. /**
  36. * @param {import("express").Request} req
  37. * @param {import("express").Response} res
  38. * @returns {Promise<void>}
  39. */
  40. async function removeSelfFromGroup(req, res) {
  41. const userToRemoveId = SessionManager.getLoggedInUserId(req.session)
  42. const subscription = await SubscriptionLocator.promises.getSubscription(
  43. req.query.subscriptionId
  44. )
  45. await _removeUserFromGroup(req, res, {
  46. userToRemoveId,
  47. loggedInUserId: userToRemoveId,
  48. subscription,
  49. })
  50. }
  51. /**
  52. * @param {import("express").Request} req
  53. * @param {import("express").Response} res
  54. * @param {string} userToRemoveId
  55. * @param {string} loggedInUserId
  56. * @param {Subscription} subscription
  57. * @returns {Promise<void>}
  58. * @private
  59. */
  60. async function _removeUserFromGroup(
  61. req,
  62. res,
  63. { userToRemoveId, loggedInUserId, subscription }
  64. ) {
  65. const subscriptionId = subscription._id
  66. const groupSSOActive = (
  67. await Modules.promises.hooks.fire('hasGroupSSOEnabled', subscription)
  68. )?.[0]
  69. if (groupSSOActive) {
  70. await Modules.promises.hooks.fire(
  71. 'unlinkUserFromGroupSSO',
  72. userToRemoveId,
  73. subscriptionId
  74. )
  75. }
  76. try {
  77. await UserAuditLogHandler.promises.addEntry(
  78. userToRemoveId,
  79. 'remove-from-group-subscription',
  80. loggedInUserId,
  81. req.ip,
  82. { subscriptionId }
  83. )
  84. } catch (auditLogError) {
  85. throw OError.tag(auditLogError, 'error adding audit log entry', {
  86. userToRemoveId,
  87. subscriptionId,
  88. })
  89. }
  90. try {
  91. await SubscriptionGroupHandler.promises.removeUserFromGroup(
  92. subscriptionId,
  93. userToRemoveId
  94. )
  95. } catch (error) {
  96. logger.err(
  97. { err: error, userToRemoveId, subscriptionId },
  98. 'error removing self from group'
  99. )
  100. return res.sendStatus(500)
  101. }
  102. res.sendStatus(200)
  103. }
  104. async function requestConfirmation(req, res) {
  105. const { variant } = await SplitTestHandler.promises.getAssignment(
  106. req,
  107. res,
  108. 'flexible-group-licensing'
  109. )
  110. if (variant !== 'enabled') {
  111. return ErrorController.notFound(req, res)
  112. }
  113. try {
  114. const userId = SessionManager.getLoggedInUserId(req.session)
  115. const subscription =
  116. await SubscriptionLocator.promises.getUsersSubscription(userId)
  117. res.render('subscriptions/request-confirmation-react', {
  118. groupName: subscription.teamName,
  119. })
  120. } catch (error) {
  121. logger.err({ error }, 'error trying to request seats to subscription')
  122. return res.render('/user/subscription')
  123. }
  124. }
  125. export default {
  126. removeUserFromGroup: expressify(removeUserFromGroup),
  127. removeSelfFromGroup: expressify(removeSelfFromGroup),
  128. requestConfirmation: expressify(requestConfirmation),
  129. }