Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
2ab3016
fix partner account merge when both accounts share program enrollments
pepeladeira Jun 16, 2026
f5f0f4e
update email copy
pepeladeira Jun 16, 2026
7f432fe
remove email
pepeladeira Jun 16, 2026
d2b2d53
Merge branch 'main' into partner-account-merge-overlapping-enrollments
pepeladeira Jun 16, 2026
a2f83d9
move merge-partner-accounts into qstash workflow
pepeladeira Jun 17, 2026
fcf63e2
Merge branch 'main' into partner-account-merge-overlapping-enrollments
devkiran Jun 17, 2026
2c28021
combine cheap idempotent merge steps into finalize-transfers and clea…
pepeladeira Jun 17, 2026
0573f71
add e2e tests
pepeladeira Jun 17, 2026
7a9a084
code improvements
pepeladeira Jun 17, 2026
dacf1d1
skip tests
pepeladeira Jun 17, 2026
bcc1f50
Merge branch 'main' into partner-account-merge-overlapping-enrollments
pepeladeira Jul 9, 2026
a75949d
Merge branch 'main' into partner-account-merge-overlapping-enrollments
devkiran Jul 17, 2026
1c571c0
Merge branch 'main' into partner-account-merge-overlapping-enrollments
pepeladeira Aug 20, 2026
98f68de
Merge branch 'main' into partner-account-merge-overlapping-enrollments
steven-tey Aug 20, 2026
bcf2dc5
improve workflow
steven-tey Aug 20, 2026
65a2e6e
add combinePendingPayouts
steven-tey Aug 20, 2026
0b51442
merge-partner-account → merge-partner-accounts
steven-tey Aug 20, 2026
b0c0dee
remove skip test
pepeladeira Aug 20, 2026
f47d3bb
rename tests
steven-tey Aug 20, 2026
d969e05
deleted the leftover singular test file
pepeladeira Aug 20, 2026
91b7e94
Merge pull request #4047 from dubinc/partner-account-merge-overlappin…
steven-tey Aug 20, 2026
3f3dfb8
workflow should use APP_DOMAIN instead
steven-tey Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
488 changes: 0 additions & 488 deletions apps/web/app/(ee)/api/cron/partners/merge-accounts/route.ts

This file was deleted.

74 changes: 74 additions & 0 deletions apps/web/app/(ee)/api/e2e/trigger-merge-accounts/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { DubApiError } from "@/lib/api/errors";
import { parseRequestBody } from "@/lib/api/utils";
import { withWorkspace } from "@/lib/auth";
import { triggerQStashWorkflow } from "@/lib/cron/qstash-workflow";
import { prisma } from "@/lib/prisma";
import { ACME_PROGRAM_ID, nanoid } from "@dub/utils";
import { NextResponse } from "next/server";
import * as z from "zod/v4";
import { assertE2EWorkspace } from "../guard";

const bodySchema = z.object({
sourceEmail: z.email(),
targetEmail: z.email(),
});

// POST /api/e2e/trigger-merge-accounts
export const POST = withWorkspace(
async ({ req, workspace }) => {
assertE2EWorkspace(workspace);

const { sourceEmail, targetEmail } = bodySchema.parse(
await parseRequestBody(req),
);

if (sourceEmail.toLowerCase() === targetEmail.toLowerCase()) {
throw new DubApiError({
code: "bad_request",
message: "Source and target emails must be different.",
});
}

const partners = await prisma.partner.findMany({
where: {
email: { in: [sourceEmail, targetEmail] },
programs: { some: { programId: ACME_PROGRAM_ID } },
},
select: { email: true },
});

const enrolledEmails = new Set(partners.map((p) => p.email?.toLowerCase()));

if (
!enrolledEmails.has(sourceEmail.toLowerCase()) ||
!enrolledEmails.has(targetEmail.toLowerCase())
) {
throw new DubApiError({
code: "bad_request",
message:
"Both partners must exist and be enrolled in the Acme test program.",
});
}

const userId = `e2e-merge-${nanoid()}`;

const res = await triggerQStashWorkflow({
workflowType: "merge-partner-accounts",
workflowLabel: userId,
body: {
userId,
sourceEmail,
targetEmail,
},
flowControl: {
key: userId,
parallelism: 1,
},
});

return NextResponse.json(res);
},
{
requiredPermissions: ["workspaces.write"],
},
);
Loading
Loading