SubscriptionGroupController.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // ts-check
  2. const SubscriptionGroupHandler = require('./SubscriptionGroupHandler')
  3. const OError = require('@overleaf/o-error')
  4. const logger = require('@overleaf/logger')
  5. const SubscriptionLocator = require('./SubscriptionLocator')
  6. const SessionManager = require('../Authentication/SessionManager')
  7. const UserAuditLogHandler = require('../User/UserAuditLogHandler')
  8. const { expressify } = require('@overleaf/promise-utils')
  9. const Modules = require('../../infrastructure/Modules')
  10. /**
  11. * @import { Subscription } from "../../../../types/subscription/dashboard/subscription"
  12. */
  13. /**
  14. * @param {import("express").Request} req
  15. * @param {import("express").Response} res
  16. * @returns {Promise<void>}
  17. */
  18. async function removeUserFromGroup(req, res) {
  19. const subscription = req.entity
  20. const userToRemoveId = req.params.user_id
  21. const loggedInUserId = SessionManager.getLoggedInUserId(req.session)
  22. const subscriptionId = subscription._id
  23. logger.debug(
  24. { subscriptionId, userToRemoveId },
  25. 'removing user from group subscription'
  26. )
  27. await _removeUserFromGroup(req, res, {
  28. userToRemoveId,
  29. loggedInUserId,
  30. subscription,
  31. })
  32. }
  33. /**
  34. * @param {import("express").Request} req
  35. * @param {import("express").Response} res
  36. * @returns {Promise<void>}
  37. */
  38. async function removeSelfFromGroup(req, res) {
  39. const userToRemoveId = SessionManager.getLoggedInUserId(req.session)
  40. const subscription = await SubscriptionLocator.promises.getSubscription(
  41. req.query.subscriptionId
  42. )
  43. await _removeUserFromGroup(req, res, {
  44. userToRemoveId,
  45. loggedInUserId: userToRemoveId,
  46. subscription,
  47. })
  48. }
  49. /**
  50. * @param {import("express").Request} req
  51. * @param {import("express").Response} res
  52. * @param {string} userToRemoveId
  53. * @param {string} loggedInUserId
  54. * @param {Subscription} subscription
  55. * @returns {Promise<void>}
  56. * @private
  57. */
  58. async function _removeUserFromGroup(
  59. req,
  60. res,
  61. { userToRemoveId, loggedInUserId, subscription }
  62. ) {
  63. const subscriptionId = subscription._id
  64. const groupSSOActive = (
  65. await Modules.promises.hooks.fire('hasGroupSSOEnabled', subscription)
  66. )?.[0]
  67. if (groupSSOActive) {
  68. await Modules.promises.hooks.fire(
  69. 'unlinkUserFromGroupSSO',
  70. userToRemoveId,
  71. subscriptionId
  72. )
  73. }
  74. try {
  75. await UserAuditLogHandler.promises.addEntry(
  76. userToRemoveId,
  77. 'remove-from-group-subscription',
  78. loggedInUserId,
  79. req.ip,
  80. { subscriptionId }
  81. )
  82. } catch (auditLogError) {
  83. throw OError.tag(auditLogError, 'error adding audit log entry', {
  84. userToRemoveId,
  85. subscriptionId,
  86. })
  87. }
  88. try {
  89. await SubscriptionGroupHandler.promises.removeUserFromGroup(
  90. subscriptionId,
  91. userToRemoveId
  92. )
  93. } catch (error) {
  94. logger.err(
  95. { err: error, userToRemoveId, subscriptionId },
  96. 'error removing self from group'
  97. )
  98. return res.sendStatus(500)
  99. }
  100. res.sendStatus(200)
  101. }
  102. module.exports = {
  103. removeUserFromGroup: expressify(removeUserFromGroup),
  104. removeSelfFromGroup: expressify(removeSelfFromGroup),
  105. }