const { callbackify } = require('util') const SubscriptionUpdater = require('./SubscriptionUpdater') const SubscriptionLocator = require('./SubscriptionLocator') const { Subscription } = require('../../models/Subscription') async function removeUserFromGroup(subscriptionId, userIdToRemove) { await SubscriptionUpdater.promises.removeUserFromGroup( subscriptionId, userIdToRemove ) } async function replaceUserReferencesInGroups(oldId, newId) { await Subscription.updateOne({ admin_id: oldId }, { admin_id: newId }).exec() await _replaceInArray(Subscription, 'manager_ids', oldId, newId) await _replaceInArray(Subscription, 'member_ids', oldId, newId) } async function isUserPartOfGroup(userId, subscriptionId) { const subscription = await SubscriptionLocator.promises.getSubscriptionByMemberIdAndId( userId, subscriptionId ) return !!subscription } async function getTotalConfirmedUsersInGroup(subscriptionId) { const subscription = await SubscriptionLocator.promises.getSubscription(subscriptionId) return subscription?.member_ids?.length } async function _replaceInArray(model, property, oldValue, newValue) { // Mongo won't let us pull and addToSet in the same query, so do it in // two. Note we need to add first, since the query is based on the old user. const query = {} query[property] = oldValue const setNewValue = {} setNewValue[property] = newValue const setOldValue = {} setOldValue[property] = oldValue await model.updateMany(query, { $addToSet: setNewValue }) await model.updateMany(query, { $pull: setOldValue }) } module.exports = { removeUserFromGroup: callbackify(removeUserFromGroup), replaceUserReferencesInGroups: callbackify(replaceUserReferencesInGroups), getTotalConfirmedUsersInGroup: callbackify(getTotalConfirmedUsersInGroup), isUserPartOfGroup: callbackify(isUserPartOfGroup), promises: { removeUserFromGroup, replaceUserReferencesInGroups, getTotalConfirmedUsersInGroup, isUserPartOfGroup, }, }