// ts-check const SubscriptionGroupHandler = require('./SubscriptionGroupHandler') const OError = require('@overleaf/o-error') const logger = require('@overleaf/logger') const SubscriptionLocator = require('./SubscriptionLocator') const SessionManager = require('../Authentication/SessionManager') const UserAuditLogHandler = require('../User/UserAuditLogHandler') const { expressify } = require('@overleaf/promise-utils') const Modules = require('../../infrastructure/Modules') /** * @typedef {import("../../../../types/subscription/dashboard/subscription").Subscription} Subscription */ /** * @param {import("express").Request} req * @param {import("express").Response} res * @returns {Promise} */ async function removeUserFromGroup(req, res) { const subscription = req.entity const userToRemoveId = req.params.user_id const loggedInUserId = SessionManager.getLoggedInUserId(req.session) const subscriptionId = subscription._id logger.debug( { subscriptionId, userToRemoveId }, 'removing user from group subscription' ) await _removeUserFromGroup(req, res, { userToRemoveId, loggedInUserId, subscription, }) } /** * @param {import("express").Request} req * @param {import("express").Response} res * @returns {Promise} */ async function removeSelfFromGroup(req, res) { const userToRemoveId = SessionManager.getLoggedInUserId(req.session) const subscription = await SubscriptionLocator.promises.getSubscription( req.query.subscriptionId ) await _removeUserFromGroup(req, res, { userToRemoveId, loggedInUserId: userToRemoveId, subscription, }) } /** * @param {import("express").Request} req * @param {import("express").Response} res * @param {string} userToRemoveId * @param {string} loggedInUserId * @param {Subscription} subscription * @returns {Promise} * @private */ async function _removeUserFromGroup( req, res, { userToRemoveId, loggedInUserId, subscription } ) { const subscriptionId = subscription._id const groupSSOActive = ( await Modules.promises.hooks.fire('hasGroupSSOEnabled', subscription) )?.[0] if (groupSSOActive) { await Modules.promises.hooks.fire( 'unlinkUserFromGroupSSO', userToRemoveId, subscriptionId ) } try { await UserAuditLogHandler.promises.addEntry( userToRemoveId, 'remove-from-group-subscription', loggedInUserId, req.ip, { subscriptionId } ) } catch (auditLogError) { throw OError.tag(auditLogError, 'error adding audit log entry', { userToRemoveId, subscriptionId, }) } try { await SubscriptionGroupHandler.promises.removeUserFromGroup( subscriptionId, userToRemoveId ) } catch (error) { logger.err( { err: error, userToRemoveId, subscriptionId }, 'error removing self from group' ) return res.sendStatus(500) } res.sendStatus(200) } module.exports = { removeUserFromGroup: expressify(removeUserFromGroup), removeSelfFromGroup: expressify(removeSelfFromGroup), }