From fbfb3028664716703c92c365d810f1a562c1ba91 Mon Sep 17 00:00:00 2001 From: Steven Tey Date: Tue, 23 Sep 2025 19:56:28 -0700 Subject: [PATCH 1/2] Small partners fixes --- .../bounty-submission-details-sheet.tsx | 2 +- .../[partnerId]/links/page-client.tsx | 23 +++++++++++-------- apps/web/lib/actions/partners/ban-partner.ts | 4 ++-- .../lib/actions/partners/bulk-ban-partners.ts | 2 +- .../actions/partners/revoke-program-invite.ts | 4 ++-- .../web/lib/actions/partners/unban-partner.ts | 4 ++-- .../api/partners/get-partner-for-program.ts | 1 + apps/web/lib/zod/schemas/programs.ts | 1 + 8 files changed, 23 insertions(+), 18 deletions(-) diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/[bountyId]/bounty-submission-details-sheet.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/[bountyId]/bounty-submission-details-sheet.tsx index b57e619b15a..9176d293265 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/[bountyId]/bounty-submission-details-sheet.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/[bountyId]/bounty-submission-details-sheet.tsx @@ -294,7 +294,7 @@ function BountySubmissionDetailsSheetContent({
-
+
{submission.status === "approved" ? ( { id: "shortLink", header: "Link", cell: ({ row }) => ( - - {getPrettyUrl(row.original.shortLink)} - +
+ + {getPrettyUrl(row.original.shortLink)} + + +
), }, { @@ -81,7 +84,7 @@ const PartnerLinks = ({ partner }: { partner: EnrolledPartnerProps }) => { ), }, { - header: "Sales", + header: "Conversions", size: 1, minSize: 1, cell: ({ row }) => ( @@ -90,7 +93,7 @@ const PartnerLinks = ({ partner }: { partner: EnrolledPartnerProps }) => { target="_blank" className="block w-full cursor-alias decoration-dotted hover:underline" > - {nFormatter(row.original.sales)} + {nFormatter(row.original.conversions)} ), }, diff --git a/apps/web/lib/actions/partners/ban-partner.ts b/apps/web/lib/actions/partners/ban-partner.ts index a467e5a9b80..838d644ada9 100644 --- a/apps/web/lib/actions/partners/ban-partner.ts +++ b/apps/web/lib/actions/partners/ban-partner.ts @@ -96,7 +96,7 @@ export const banPartnerAction = authActionClient const supportEmail = program.supportEmail || "support@dub.co"; - // Delete links from cache + // Expire links from cache const links = await prisma.link.findMany({ where, select: { @@ -105,7 +105,7 @@ export const banPartnerAction = authActionClient }, }); - await linkCache.deleteMany(links); + await linkCache.expireMany(links); await Promise.allSettled([ sendEmail({ diff --git a/apps/web/lib/actions/partners/bulk-ban-partners.ts b/apps/web/lib/actions/partners/bulk-ban-partners.ts index 257da56322c..956f771e372 100644 --- a/apps/web/lib/actions/partners/bulk-ban-partners.ts +++ b/apps/web/lib/actions/partners/bulk-ban-partners.ts @@ -123,7 +123,7 @@ export const bulkBanPartnersAction = authActionClient ); // Expire links from cache - await linkCache.deleteMany( + await linkCache.expireMany( programEnrollments.flatMap(({ links }) => links), ); diff --git a/apps/web/lib/actions/partners/revoke-program-invite.ts b/apps/web/lib/actions/partners/revoke-program-invite.ts index df74d7760c8..1ea4e819713 100644 --- a/apps/web/lib/actions/partners/revoke-program-invite.ts +++ b/apps/web/lib/actions/partners/revoke-program-invite.ts @@ -68,8 +68,8 @@ export const revokeProgramInviteAction = authActionClient waitUntil( Promise.all([ - // Delete the links from Redis - linkCache.deleteMany(partnerLinks), + // Expire the links from Redis + linkCache.expireMany(partnerLinks), // Record the links deletion in Tinybird recordLinkTB( diff --git a/apps/web/lib/actions/partners/unban-partner.ts b/apps/web/lib/actions/partners/unban-partner.ts index 8364d231fc5..0f3a5c3ff7b 100644 --- a/apps/web/lib/actions/partners/unban-partner.ts +++ b/apps/web/lib/actions/partners/unban-partner.ts @@ -109,8 +109,8 @@ export const unbanPartnerAction = authActionClient }); await Promise.allSettled([ - // Delete links from cache - linkCache.deleteMany(links), + // Expire links from cache + linkCache.expireMany(links), recordAuditLog({ workspaceId: workspace.id, diff --git a/apps/web/lib/api/partners/get-partner-for-program.ts b/apps/web/lib/api/partners/get-partner-for-program.ts index 0f46b6ab039..36fb541ab61 100644 --- a/apps/web/lib/api/partners/get-partner-for-program.ts +++ b/apps/web/lib/api/partners/get-partner-for-program.ts @@ -38,6 +38,7 @@ export async function getPartnerForProgram({ 'url', l.url, 'clicks', CAST(l.clicks AS SIGNED), 'leads', CAST(l.leads AS SIGNED), + 'conversions', CAST(l.conversions AS SIGNED), 'sales', CAST(l.sales AS SIGNED), 'saleAmount', CAST(l.saleAmount AS SIGNED) ), diff --git a/apps/web/lib/zod/schemas/programs.ts b/apps/web/lib/zod/schemas/programs.ts index c3ba5b06196..33135f139cb 100644 --- a/apps/web/lib/zod/schemas/programs.ts +++ b/apps/web/lib/zod/schemas/programs.ts @@ -79,6 +79,7 @@ export const ProgramPartnerLinkSchema = LinkSchema.pick({ url: true, clicks: true, leads: true, + conversions: true, sales: true, saleAmount: true, }); From dc3d91b072f53275385aa7e5db99922917580f04 Mon Sep 17 00:00:00 2001 From: Steven Tey Date: Tue, 23 Sep 2025 21:50:49 -0700 Subject: [PATCH 2/2] add search by partner ID --- .../(ee)/program/partners/partners-table.tsx | 15 ++++++--------- apps/web/lib/api/partners/get-partners.ts | 3 ++- apps/web/lib/zod/schemas/partners.ts | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/partners-table.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/partners-table.tsx index 1dc9fb04fb0..41642a7d8f4 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/partners-table.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/partners-table.tsx @@ -119,13 +119,10 @@ export function PartnersTable() { error, isLoading, } = useSWR( - `/api/partners${getQueryString( - { - workspaceId, - includeExpandedFields: true, - }, - { exclude: ["partnerId"] }, - )}`, + `/api/partners${getQueryString({ + workspaceId, + includeExpandedFields: true, + })}`, fetcher, { keepPreviousData: true, @@ -394,8 +391,8 @@ export function PartnersTable() { onRemove={onRemove} />
diff --git a/apps/web/lib/api/partners/get-partners.ts b/apps/web/lib/api/partners/get-partners.ts index bcbd738c0e2..034aaaf24bf 100644 --- a/apps/web/lib/api/partners/get-partners.ts +++ b/apps/web/lib/api/partners/get-partners.ts @@ -139,7 +139,8 @@ export async function getPartners(filters: PartnerFilters) { ${ search ? Prisma.sql`AND ( - LOWER(p.name) LIKE LOWER(${`%${search}%`}) + LOWER(p.id) LIKE LOWER(${`%${search}%`}) + OR LOWER(p.name) LIKE LOWER(${`%${search}%`}) OR LOWER(p.email) LIKE LOWER(${`%${search}%`}) OR EXISTS ( SELECT 1 FROM Link searchLink diff --git a/apps/web/lib/zod/schemas/partners.ts b/apps/web/lib/zod/schemas/partners.ts index ca1adfc4122..bd41f923a6b 100644 --- a/apps/web/lib/zod/schemas/partners.ts +++ b/apps/web/lib/zod/schemas/partners.ts @@ -152,7 +152,7 @@ export const getPartnersQuerySchema = z .string() .optional() .describe( - "A search query to filter partners by name, email, or tenantId.", + "A search query to filter partners by ID, name, email, or link.", ) .openapi({ example: "john" }), includeExpandedFields: booleanQuerySchema