From 93dc51d505d410c38995dc76cda2a7dcdb6b918c Mon Sep 17 00:00:00 2001 From: "Ioannis T." Date: Tue, 26 May 2026 10:19:07 +0300 Subject: [PATCH] wave: admin tool to push Intercom wave segments --- src/lib/utils/wave/admin/intercom-segments.ts | 7 + .../wave/(base-layout)/admin/+page.svelte | 10 ++ .../admin/intercom-wave-segments/+page.svelte | 134 ++++++++++++++++++ .../admin/intercom-wave-segments/+page.ts | 31 ++++ 4 files changed, 182 insertions(+) create mode 100644 src/lib/utils/wave/admin/intercom-segments.ts create mode 100644 src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.svelte create mode 100644 src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.ts diff --git a/src/lib/utils/wave/admin/intercom-segments.ts b/src/lib/utils/wave/admin/intercom-segments.ts new file mode 100644 index 000000000..75c7d30e0 --- /dev/null +++ b/src/lib/utils/wave/admin/intercom-segments.ts @@ -0,0 +1,7 @@ +import { authenticatedCall } from '../call'; + +export async function pushWaveIntercomSegments(f = fetch, waveId: string): Promise { + await authenticatedCall(f, `/api/admin/intercom/wave-segments/${waveId}`, { + method: 'POST', + }); +} diff --git a/src/routes/(pages)/wave/(base-layout)/admin/+page.svelte b/src/routes/(pages)/wave/(base-layout)/admin/+page.svelte index a05dfded2..8562371ec 100644 --- a/src/routes/(pages)/wave/(base-layout)/admin/+page.svelte +++ b/src/routes/(pages)/wave/(base-layout)/admin/+page.svelte @@ -63,6 +63,16 @@ }, ] : []), + ...(data.user.permissions?.includes('pushIntercomSegments') + ? [ + { + name: 'Intercom Wave Segments', + description: + "Tag a wave's contributors and repo maintainers on Intercom for segmentation.", + href: '/wave/admin/intercom-wave-segments', + }, + ] + : []), ]); diff --git a/src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.svelte b/src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.svelte new file mode 100644 index 000000000..9513ade50 --- /dev/null +++ b/src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.svelte @@ -0,0 +1,134 @@ + + + + +
+ +
+
+ + Enqueues a background job that tags every qualifying user on Intercom with the wave's + Contributor and Repo Maintainer tags. Tagging is idempotent — running this multiple times is + safe. + + + + { + waveId = undefined; + }} + /> + + + + + + + +
+
+
+ + diff --git a/src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.ts b/src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.ts new file mode 100644 index 000000000..764689586 --- /dev/null +++ b/src/routes/(pages)/wave/(base-layout)/admin/intercom-wave-segments/+page.ts @@ -0,0 +1,31 @@ +import { getAllPaginated } from '$lib/utils/wave/getAllPaginated.js'; +import { getWavePrograms, getWaves } from '$lib/utils/wave/wavePrograms.js'; +import { redirect } from '@sveltejs/kit'; + +export const load = async ({ parent, fetch, depends }) => { + depends('wave:admin:intercom-wave-segments'); + + const { user } = await parent(); + + if (!user.permissions?.includes('pushIntercomSegments')) { + throw redirect(302, '/wave/admin'); + } + + const wavePrograms = await getAllPaginated((page, limit) => + getWavePrograms(fetch, { page, limit }), + ); + + const wavesByProgram: Record>['data']> = {}; + + for (const program of wavePrograms) { + const waves = await getAllPaginated((page, limit) => + getWaves(fetch, program.id, { page, limit }), + ); + wavesByProgram[program.id] = waves; + } + + return { + wavePrograms, + wavesByProgram, + }; +};