Merge pull request #25360 from overleaf/jel-group-audit-log-join

[web] Update group audit log when user joins

GitOrigin-RevId: 81c0d5003cdde384cb5ff90b57f6aa8b8dae0ee2
This commit is contained in:
Jessica Lawshe
2025-05-28 08:05:46 +00:00
committed by Copybot
parent 881db9b472
commit dcd520d7eb
4 changed files with 81 additions and 8 deletions
@@ -12,6 +12,8 @@ const Features = require('../../infrastructure/Features')
const UserAuditLogHandler = require('../User/UserAuditLogHandler')
const AccountMappingHelper = require('../Analytics/AccountMappingHelper')
const { SSOConfig } = require('../../models/SSOConfig')
const mongoose = require('../../infrastructure/Mongoose')
const Modules = require('../../infrastructure/Modules')
/**
* @typedef {import('../../../../types/subscription/dashboard/subscription').Subscription} Subscription
@@ -65,7 +67,9 @@ async function syncSubscription(
)
}
async function addUserToGroup(subscriptionId, userId) {
async function addUserToGroup(subscriptionId, userId, auditLog) {
const session = await mongoose.startSession()
await UserAuditLogHandler.promises.addEntry(
userId,
'join-group-subscription',
@@ -73,10 +77,30 @@ async function addUserToGroup(subscriptionId, userId) {
undefined,
{ subscriptionId }
)
await Subscription.updateOne(
{ _id: subscriptionId },
{ $addToSet: { member_ids: userId } }
).exec()
try {
await session.withTransaction(async () => {
await Subscription.updateOne(
{ _id: subscriptionId },
{ $addToSet: { member_ids: userId } },
{ session }
).exec()
await Modules.promises.hooks.fire(
'addGroupAuditLogEntry',
{
initiatorId: auditLog?.initiatorId,
ipAddress: auditLog?.ipAddress,
groupId: subscriptionId,
operation: 'join-group',
},
session
)
})
} finally {
await session.endSession()
}
await FeaturesUpdater.promises.refreshFeatures(userId, 'add-to-group')
await _sendUserGroupPlanCodeUserProperty(userId)
await _sendSubscriptionEvent(
@@ -36,10 +36,15 @@ async function createInvite(req, res, next) {
}
try {
const auditLog = {
initiatorId: teamManagerId,
ipAddress: req.ip,
}
const invitedUserData = await TeamInvitesHandler.promises.createInvite(
teamManagerId,
subscription,
email
email,
auditLog
)
return res.json({ user: invitedUserData })
} catch (err) {
@@ -70,7 +70,11 @@ async function acceptInvite(token, userId, auditLog) {
throw new Errors.NotFoundError('invite not found')
}
await SubscriptionUpdater.promises.addUserToGroup(subscription._id, userId)
await SubscriptionUpdater.promises.addUserToGroup(
subscription._id,
userId,
auditLog
)
if (subscription.managedUsersEnabled) {
await Modules.promises.hooks.fire(
@@ -147,9 +151,11 @@ async function _createInvite(subscription, email, inviter) {
emailData => emailData.email === email
)
if (isInvitingSelf) {
const auditLog = { initiatorId: inviter._id }
await SubscriptionUpdater.promises.addUserToGroup(
subscription._id,
inviter._id
inviter._id,
auditLog
)
// legacy: remove any invite that might have been created in the past