From 4ec0a23f34916c458dc65d0f676152c88adf099d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Fr=C3=B6mbgen?= <23717573+mfroembgen@users.noreply.github.com> Date: Mon, 17 Aug 2026 12:57:20 +0200 Subject: [PATCH] fix(api): provision defaults for invited teams --- .changeset/tidy-invites-share.md | 5 ++++ .../routers/api/__tests__/team.int.test.ts | 24 ++++++++++++++++++- packages/api/src/routers/api/root.ts | 9 +++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 .changeset/tidy-invites-share.md diff --git a/.changeset/tidy-invites-share.md b/.changeset/tidy-invites-share.md new file mode 100644 index 0000000000..dad537f8cc --- /dev/null +++ b/.changeset/tidy-invites-share.md @@ -0,0 +1,5 @@ +--- +'@hyperdx/api': patch +--- + +Apply configured default connections and sources when a user accepts a team invite. diff --git a/packages/api/src/routers/api/__tests__/team.int.test.ts b/packages/api/src/routers/api/__tests__/team.int.test.ts index c00a530ca1..f2b6c89bc1 100644 --- a/packages/api/src/routers/api/__tests__/team.int.test.ts +++ b/packages/api/src/routers/api/__tests__/team.int.test.ts @@ -2,11 +2,12 @@ import _ from 'lodash'; import { ObjectId } from 'mongodb'; import mongoose from 'mongoose'; -import { getLoggedInAgent, getServer } from '@/fixtures'; +import { getAgent, getLoggedInAgent, getServer } from '@/fixtures'; import Alert, { AlertSource, AlertThresholdType } from '@/models/alert'; import Team from '@/models/team'; import TeamInvite from '@/models/teamInvite'; import User from '@/models/user'; +import * as setupDefaults from '@/setupDefaults'; describe('team router', () => { const server = getServer(); @@ -16,6 +17,7 @@ describe('team router', () => { }); afterEach(async () => { + jest.restoreAllMocks(); await server.clearDBs(); }); @@ -153,6 +155,26 @@ describe('team router', () => { expect(resp.body.url).toContain(`/join-team?token=${teamInvite.token}`); }); + it('POST /team/setup/:token provisions defaults for the invited team', async () => { + const { team } = await getLoggedInAgent(server); + const invite = await TeamInvite.create({ + email: 'invited@example.com', + name: 'Invited User', + teamId: team._id, + token: 'invite_token', + }); + const setupTeamDefaults = jest + .spyOn(setupDefaults, 'setupTeamDefaults') + .mockResolvedValue(); + + await getAgent(server) + .post(`/team/setup/${invite.token}`) + .send({ password: 'TacoCat!2#4X' }) + .expect(303); + + expect(setupTeamDefaults).toHaveBeenCalledWith(team._id.toString()); + }); + it('POST /team/invitation with different case reuses existing invitation', async () => { const { agent } = await getLoggedInAgent(server); diff --git a/packages/api/src/routers/api/root.ts b/packages/api/src/routers/api/root.ts index f25124bfa7..1d104d9711 100644 --- a/packages/api/src/routers/api/root.ts +++ b/packages/api/src/routers/api/root.ts @@ -168,6 +168,15 @@ router.post('/team/setup/:token', async (req, res, next) => { ); } + try { + await setupTeamDefaults(teamInvite.teamId.toString()); + } catch (error) { + logger.error( + { err: serializeError(error) }, + 'Failed to setup team defaults', + ); + } + await TeamInvite.findByIdAndRemove(teamInvite._id); req.login(user, err => {